s_tree+= XML_Tree->Tags->size();\r
\r
/// FIXME:UGLY tests!\r
- /*uint * seq = new uint[XML_Tree->tags_len];\r
+ uint * seq = new uint[XML_Tree->tags_len];\r
for(uint i=0;i<XML_Tree->tags_len;i++)\r
seq[i] = get_field(XML_Tree->tags_fix,XML_Tree->tags_blen,i);\r
cout << "Tags test: " << XML_Tree->Tags->test(seq,XML_Tree->tags_len) << endl;\r
- delete [] seq;*/\r
+ delete [] seq;\r
/// End ugly tests\r
\r
s_text = ftell(fp);\r
if (!is_ancestor(Par, x, y)) return false;\r
return depth(Par, x) == (depth(Par, y) + 1);\r
}\r
-\r
+bool XMLTree::IsFirstChild(treeNode x){\r
+ return ((x != NULLT)&&(x==Root() || prev_sibling(Par,x) == NULLT));\r
+}\r
// NumChildren(x): number of children of node x. Constant time with the data structure\r
// of Sadakane.\r
int XMLTree::NumChildren(treeNode x) \r
return first_child(Par, x);\r
}\r
\r
+treeNode XMLTree::LastChild(treeNode x) \r
+{\r
+ if (x == Root() || isleaf(Par,x) || x == NULLT)\r
+ return x;\r
+ else\r
+ return find_open(Par,find_close(Par,parent(Par,x))-1);\r
+}\r
+\r
// NextSibling(x): returns the next sibling of node x, assuming it exists.\r
treeNode XMLTree::NextSibling(treeNode x) \r
{\r
exit(1);\r
}\r
\r
- int r, s;\r
+ //int r, s;\r
treeNode y;\r
if (isleaf(Par,x))\r
return NULLT;\r
\r
- r = (int) Tags->rank(tag, node2tagpos(x));\r
- s = (int) Tags->select(tag, r+1);\r
+ int s = (int) Tags->select_next(tag,node2tagpos(x));\r
+ /*r = (int) Tags->rank(tag, node2tagpos(x));\r
+ s = (int) Tags->select(tag, r+1);*/\r
if (s == -1) return NULLT; // there is no such node\r
y = tagpos2node(s); // transforms the tag position into a node position\r
if (!is_ancestor(Par, x, y)) return NULLT; // the next node tagged tag (in preorder) is not within the subtree of x.\r
{\r
\r
treeNode res,y,lim;\r
- int r,s;\r
+ //int r,s;\r
lim = find_close(Par,root); \r
res=NULLT;\r
for (unsigned int i = 0; i < ftlen; i ++ )\r
{\r
\r
- r = (int) Tags->rank(folltags[i], node2tagpos(x));\r
- s = (int) Tags->select(folltags[i], r+1);\r
+ int s = (int) Tags->select_next(folltags[i],node2tagpos(x));\r
+ /*r = (int) Tags->rank(folltags[i], node2tagpos(x));\r
+ s = (int) Tags->select(folltags[i], r+1);*/\r
if (s == -1) \r
y = NULLT; // there is no such node\r
else {\r
exit(1);\r
}\r
\r
- int r, s;\r
+ //int r, s;\r
if (x ==NULLT || x == Root())\r
return NULLT;\r
- \r
- r = (int) Tags->rank(tag, find_close(Par, x));\r
- s = (int) Tags->select(tag, r+1); // select returns -1 in case that there is no r+1-th tag.\r
+ \r
+ int s = (int) Tags->select_next(tag,find_close(Par,x));\r
+ /*r = (int) Tags->rank(tag, find_close(Par, x));\r
+ s = (int) Tags->select(tag, r+1); // select returns -1 in case that there is no r+1-th tag. */\r
if (s==-1) return NULLT;\r
else return tagpos2node(s);\r
} \r
treeNode XMLTree::TaggedFollBelow(treeNode x, TagType tag, treeNode root)\r
{\r
\r
- int r, s;\r
+ //int r, s;\r
int lim = node2tagpos(find_close(Par,root));\r
if (x ==NULLT || x == Root())\r
return NULLT;\r
\r
- r = (int) Tags->rank(tag,find_close(Par,x));\r
- s = (int) Tags->select(tag, r+1); // select returns -1 in case that there is no r+1-th tag.\r
+ int s = (int) Tags->select_next(tag,find_close(Par,x));\r
+ /*r = (int) Tags->rank(tag,find_close(Par,x));\r
+ s = (int) Tags->select(tag, r+1); // select returns -1 in case that there is no r+1-th tag.*/\r
if (s==-1 || s >= lim) \r
return NULLT;\r
else \r
exit(1);\r
}\r
\r
- int r, s;\r
+ //int r, s;\r
treeNode ns = next_sibling(Par,x);\r
\r
if (x == NULLT || x == Root() || ns == -1)\r
return NULLT;\r
\r
- r = (int) Tags->rank(tag, node2tagpos(ns)-1);\r
- s = (int) Tags->select(tag, r+1); // select returns -1 in case that there is no r+1-th tag.\r
+ int s = (int) Tags->select_next(tag,node2tagpos(ns)-1);\r
+ /*r = (int) Tags->rank(tag, node2tagpos(ns)-1);\r
+ s = (int) Tags->select(tag, r+1); // select returns -1 in case that there is no r+1-th tag.*/\r
if (s==-1) return NULLT;\r
else return tagpos2node(s);\r
}\r