Remove spurious printfs.
[SXSI/XMLTree.git] / xml-tree-inc.hpp
index f8ee8b0..18c91e3 100644 (file)
@@ -19,7 +19,7 @@ inline uint32_t xml_tree::num_tags() const
 
 inline uint32_t xml_tree::subtree_size(xml_tree::node_t x) const
 {
-  return bp_subtree_size(this->par, x);
+  return x == root() ? this->par->n/2 : bp_subtree_size(this->par, x);
 }
 
 inline uint32_t
@@ -28,12 +28,27 @@ xml_tree::subtree_tags(xml_tree::node_t x, xml_tree::tag_t label) const
   xml_tree::node_t y = bp_find_close(this->par, x);
   if (y - x < 10) {
     uint32_t count = 0;
-    for(xml_tree::node_t i = x; i < y; i++)
+    for (xml_tree::node_t i = x; i <= y; ++i)
       count += (tag(i) == label);
     return count;
   } else {
-    return tags->rank(label, y) - tags->rank(label, x);
-  };
+    return tags[label]->rank(y) -  tags[label]->rank(x);
+  }
+}
+
+inline uint32_t xml_tree::subtree_elements(xml_tree::node_t x) const
+{
+
+  int32_t size = bp_subtree_size(par, x) - 1;
+  if (size <= 0) return 0;
+  uint32_t num_texts = subtree_tags(x, xml_tree::PCDATA_OPEN_TAG_ID);
+  uint32_t num_atts = subtree_tags(x, xml_tree::ATTRIBUTE_OPEN_TAG_ID);
+  uint32_t num_att_data = subtree_tags(x, xml_tree::ATTRIBUTE_DATA_OPEN_TAG_ID);
+  size -= num_texts;
+  size -= num_atts;
+  size -= 2*num_att_data;
+  return (uint32_t) size;
+
 }
 
 inline bool xml_tree::is_leaf(xml_tree::node_t x) const
@@ -41,6 +56,11 @@ inline bool xml_tree::is_leaf(xml_tree::node_t x) const
   return !bp_inspect(this->par, x+1);
 }
 
+inline bool xml_tree::is_open(xml_tree::node_t x) const
+{
+  return bp_inspect(this->par, x);
+}
+
 inline bool xml_tree::is_ancestor(xml_tree::node_t x,
                                   xml_tree::node_t y) const
 {
@@ -139,9 +159,22 @@ inline xml_tree::node_t xml_tree::next_element(xml_tree::node_t x) const
     return x;
 }
 
-inline xml_tree::node_t xml_tree::tagged_next(node_t x, tag_t tag) const
+
+inline xml_tree::node_t xml_tree::tagged_next_close(xml_tree::node_t x,
+                                             xml_tree::tag_t label) const
 {
-  return this->tags->select_next(tag, x);
+  xml_tree::node_t i=x;
+  for(i = x+1; i < std::min(x+100, this->par->n); i++)
+    if (tag(i) == label)
+      return i;
+
+  return tags[label]->select_next(i);
+}
+
+inline xml_tree::node_t xml_tree::tagged_next(xml_tree::node_t x,
+                                             xml_tree::tag_t label) const
+{
+  return tags[label]->select_next(x);
 }
 
 inline xml_tree::node_t
@@ -155,7 +188,7 @@ xml_tree::tagged_descendant(xml_tree::node_t x,
 inline xml_tree::node_t
 xml_tree::tagged_following_before(xml_tree::node_t x,
                                   xml_tree::tag_t tag,
-                                  xml_tree::node_t limit) const
+                                 xml_tree::node_t limit) const
 {
   xml_tree::node_t close = bp_find_close(this->par, x);
   xml_tree::node_t s = tagged_next(close, tag);
@@ -188,6 +221,37 @@ inline xml_tree::node_t xml_tree::tagged_sibling(xml_tree::node_t x,
   return sibling;
 }
 
+inline xml_tree::node_t
+xml_tree::select_descendant(xml_tree::node_t x, xml_tree::tag_t *tags) const
+{
+  if (is_leaf(x)) return xml_tree::NIL;
+  auto min = xml_tree::NIL;
+  auto aux = xml_tree::NIL;
+  for(; *tags != xml_tree::NIL_TAG_ID; ++tags){
+    aux = tagged_next(x, *tags);
+    if ((unsigned int) aux < (unsigned int) min) min = aux;
+  };
+  return (min == xml_tree::NIL || is_ancestor(x, min)) ? min : xml_tree::NIL;
+}
+
+
+inline xml_tree::node_t
+xml_tree::select_following_before(xml_tree::node_t x, xml_tree::tag_t *tags,
+                                  xml_tree::node_t limit) const
+{
+  auto min = xml_tree::NIL;
+  auto aux = xml_tree::NIL;
+  auto close = bp_find_close(this->par, x);
+
+  for(; *tags != xml_tree::NIL_TAG_ID; ++tags){
+    aux = tagged_next(close, *tags);
+    if ((unsigned int) aux < (unsigned int) min) min = aux;
+  }
+
+  return (min == xml_tree::NIL || min < limit) ? min : xml_tree::NIL;
+}
+
+
 xml_tree::node_t xml_tree::closing(xml_tree::node_t x) const
 {
   return bp_find_close(this->par, x);
@@ -201,7 +265,8 @@ inline SXSI::TextCollection *xml_tree::get_text_collection() const
 
 inline xml_tree::node_t xml_tree::parent_node(int32_t d) const
 {
-  return (xml_tree::node_t) text_positions->select1(d + 1);
+  xml_tree::node_t res = text_positions->select1(d+1);
+  return (xml_tree::node_t) res;
 }
 
 inline SXSI::TextCollection::document_result