+static int fast_find_close(bp *b,int s)\r
+{\r
+ return fwd_excess(b,s,-1);\r
+}\r
+\r
+static int fast_inspect(bp* Par,treeNode i)\r
+{\r
+ int j,l;\r
+ j = i >> logD;\r
+ l = i & (D-1);\r
+ return (Par->B[j] >> (D-1-l)) & 1;\r
+}\r
+\r
+static treeNode fast_first_child(bp *Par, treeNode x)\r
+{\r
+ x = x+1;\r
+ return (fast_inspect(Par,x) == OP) ? x : NULLT;\r
+}\r
+\r
+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
+}\r
+\r
+\r
+static treeNode fast_sibling(bp* Par,treeNode x,TagType tag){\r
+\r
+ if (tag == PCDATA_TAG_ID){\r
+ x = x+2;\r
+ return fast_inspect(Par,x)==OP ? x : NULLT;\r
+ } else return fast_next_sibling(Par,x);\r
+\r
+}\r
+\r
+static bool fast_isleaf(bp* Par,treeNode x){\r
+ return (fast_inspect(Par,x+1) == CP ? true : false);\r
+}\r
+\r
+\r
+inline uint get_field_no_power(uint *A, uint len, uint index) {\r
+ \r
+ register uint i=index*len/W, j=index*len-W*i;\r
+ return (j+len <= W) ? (A[i] << (W-j-len)) >> (W-len) : (A[i] >> j) | (A[i+1] << (WW-j-len)) >> (W-len);\r
+\r
+}\r
+\r
+static uint fast_get_field(uint* A,int len, int idx)\r
+{\r
+ uint f1, f2;\r
+ switch (len) {\r
+ case 8:\r
+ return (uint) (((uchar*)A)[idx]);\r
+ case 16:\r
+ f2 = ((unsigned short*)A)[idx];\r
+ f1 = ((unsigned short*)A)[idx+1];\r
+ return (f1 << 16) + f2;\r
+ default:\r
+ return get_field_no_power (A,len,idx);\r
+ };\r
+\r
+}\r
+\r
+inline bool fast_is_ancestor(bp * Par,treeNode x,treeNode y){\r
+ if (x > y) \r
+ return false;\r
+ else\r
+ return (x==0) || (y <= fast_find_close(Par,x));\r
+}\r
+\r
+\r
+XMLTree::XMLTree( pb * const par, uint npar, vector<string> * const TN, TagIdMap * const tim, \r
+ uint *empty_texts_bmp, TagType *tags,\r
+ TextCollection * const TC, bool dis_tc)\r