#define REGISTER_TAG(v,h,t) do { (h)->insert(std::make_pair((t),(v)->size()));\\r
(v)->push_back(t); } while (false)\r
\r
-\r
// returns NULLT if the test is true\r
#define NULLT_IF(x) do { if (x) return NULLT; } while (0)\r
\r
return fwd_excess(b,s,-1);\r
}\r
\r
-static int fast_inspect(bp* Par,treeNode i)\r
+static inline int fast_inspect(bp* Par,treeNode i)\r
{\r
int j,l;\r
j = i >> logD;\r
return (fast_inspect(Par,x) == OP) ? x : NULLT;\r
}\r
\r
-static treeNode fast_next_sibling(bp* Par,treeNode x)\r
+inline static treeNode fast_next_sibling(bp* Par,treeNode x)\r
{\r
- x = fast_find_close(Par,x)+1;\r
- return (fast_inspect(Par,x) == OP) ? x : NULLT;\r
+ treeNode y = fast_find_close(Par,x)+1;\r
+ return (fast_inspect(Par, y) == OP) ? y : NULLT;\r
}\r
\r
-static bool fast_is_ancestor(bp * Par,treeNode x,treeNode y){\r
+inline static bool fast_is_ancestor(bp * Par,treeNode x,treeNode y){\r
return (x <= y) && ((x==0) || (y <= fast_find_close(Par,x)));\r
}\r
\r
return tags_len/2;\r
}\r
\r
+\r
+ /** NumTags() : Number of distinct tags */\r
+ unsigned int NumTags() {\r
+ return TagName->size();\r
+ }\r
+\r
+ int TagsBinaryLength(){ return tags_blen; };\r
+ unsigned int TagStructLength(){ return uint_len(tags_blen,tags_len); };\r
+ unsigned int * TagStruct() { return tags_fix; };\r
+\r
+\r
/** SubtreeSize(x): the number of nodes (and attributes) in the subtree of \r
* node x. */\r
int SubtreeSize(treeNode x);\r
\r
treeNode SelectFollowingBelow(treeNode x, TagIdSet * tags, treeNode ancestor);\r
\r
- treeNode TaggedFollowingBefore(treeNode x, TagType tag,treeNode closing);\r
+ // treeNode TaggedFollowingBefore(treeNode x, TagType tag,treeNode closing);\r
\r
treeNode SelectFollowingBefore(treeNode x, TagIdSet * tags, treeNode closing);\r
\r
// The following are inlined here for speed\r
/** Tag(x): returns the tag identifier of node x. */\r
\r
- TagType Tag(treeNode x) {\r
- if (tags_blen == 8)\r
- return (TagType) (((uchar*)tags_fix)[(int) x]);\r
- else\r
- return (TagType) get_field(tags_fix,tags_blen, (int) x);\r
+ inline TagType Tag(treeNode x) const throw () {\r
+ if (tags_blen == 8)\r
+ return (TagType) (((uchar*)tags_fix)[(int) x]);\r
+ else \r
+ return get_field(tags_fix, tags_blen, x);\r
+ /*\r
+ { \r
+ size_t idxlen = x * tags_blen;\r
+ size_t j = idxlen % W;\r
+ size_t i = idxlen / W; \r
+ size_t offset = W - tags_blen;\r
+ size_t offset2 = offset - j;\r
+ size_t w = tags_fix[i];\r
+ return (offset2 >= 0)\r
+ ? ( w << offset2 ) >> offset\r
+ : ( w >> j) | (tags_fix[i+1] << (W+offset2)) >> offset;\r
+ }; */\r
+\r
}\r
\r
/** FirstChild(x): returns the first child of node x, or NULLT if the node is a leaf\r
/** TaggedDesc(x,tag): returns the first node tagged tag with larger \r
* preorder than x and within the subtree of x. Returns NULT if there \r
* is none. */\r
- treeNode TaggedDescendant(treeNode x, TagType tag)\r
+ inline treeNode TaggedDescendant(treeNode x, TagType tag)\r
{\r
\r
int s = (int) Tags->select_next(tag,node2tagpos(x));\r
return (fast_is_ancestor(Par,x,y) ? y : NULLT);\r
};\r
\r
- treeNode TaggedFollowingBelow(treeNode x, TagType tag,treeNode ancestor)\r
+ inline treeNode TaggedFollowingBelow(treeNode x, TagType tag, treeNode ancestor)\r
{\r
treeNode close = fast_find_close(Par, x);\r
treeNode s = tagpos2node(Tags->select_next(tag, close));\r
if (ancestor == Root() || s == NULLT || s < fast_find_close(Par,ancestor)) return s;\r
else return NULLT;\r
};\r
+\r
+ inline treeNode TaggedFollowingBefore(treeNode x, TagType tag, treeNode ancestor_closing)\r
+ {\r
+ treeNode close = fast_find_close(Par, x);\r
+ treeNode s = tagpos2node(Tags->select_next(tag, close));\r
+ \r
+ if (ancestor_closing == Root() || s == NULLT || s < ancestor_closing) return s;\r
+ else return NULLT;\r
+ };\r
\r
};\r
\r