Use TaggedNext for full subtree iteration instead of TaggedDesc/TaggedFoll
authorkim <kim@3cdefd35-fc62-479d-8e8d-bae585ffb9ca>
Wed, 2 Nov 2011 00:42:52 +0000 (00:42 +0000)
committerkim <kim@3cdefd35-fc62-479d-8e8d-bae585ffb9ca>
Wed, 2 Nov 2011 00:42:52 +0000 (00:42 +0000)
git-svn-id: svn+ssh://idea.nguyen.vg/svn/sxsi/trunk/xpathcomp@1161 3cdefd35-fc62-479d-8e8d-bae585ffb9ca

src/OCamlDriver.cpp
src/nodeSet.ml
src/tree.ml
src/tree.mli

index db111db..275758a 100644 (file)
@@ -342,6 +342,10 @@ NoAlloc extern "C"  value caml_xml_tree_tagged_descendant(value tree, value node
   return (Val_int(XMLTREE(tree)->TaggedDescendant(TREENODEVAL(node), TAGVAL(tag))));
 }
 
+NoAlloc extern "C"  value caml_xml_tree_tagged_next(value tree, value node, value tag){
+  return (Val_int(XMLTREE(tree)->TaggedNext(TREENODEVAL(node), TAGVAL(tag))));
+}
+
 NoAlloc extern "C"  value caml_xml_tree_select_descendant(value tree, value node, value tags){
   return (Val_int(XMLTREE(tree)->SelectDescendant(TREENODEVAL(node), HSET(tags))));
 }
index 2716d61..e1f5476 100644 (file)
@@ -141,21 +141,19 @@ module Mat : S with type t = Tree.node mat =
 
     let tag_fold f tree t tag acc =
       let rec loop close node acc =
-       if node == Tree.nil then acc
+       if node > Tree.nil && node < close then acc
        else
          let acc = f node acc in
-         let acc' = loop close (Tree.tagged_descendant tree node tag) acc in
-           loop close (Tree.tagged_following_before tree node tag close) acc'
+         loop close (Tree.tagged_next tree node tag) acc
       in
-      let t = fst_tagged tree t tag in
-       loop (Tree.closing tree t) t acc
+      let t' = fst_tagged tree t tag in
+       loop (Tree.closing tree t) t' acc
 
     let tag_iter f tree t tag =
       let rec loop close node =
-       if node != Tree.nil then begin
+       if node > Tree.nil && node < close then begin
          f node;
-         loop close (Tree.tagged_descendant tree node tag);
-         loop close (Tree.tagged_following_before tree node tag close);
+         loop close (Tree.tagged_next tree node tag);
        end
       in
       let t' = fst_tagged tree t tag in
index 27ceed6..97a850c 100644 (file)
@@ -119,6 +119,9 @@ let prev_sibling t n = tree_prev_sibling t.doc n
 external tree_tagged_descendant : tree -> [`Tree ] Node.t -> Tag.t -> [`Tree ] Node.t = "caml_xml_tree_tagged_descendant" "noalloc"
 let tagged_descendant t n tag = tree_tagged_descendant t.doc n tag
 
+external tree_tagged_next : tree -> [`Tree ] Node.t -> Tag.t -> [`Tree ] Node.t = "caml_xml_tree_tagged_next" "noalloc"
+let tagged_next t n tag = tree_tagged_next t.doc n tag
+
 external tree_select_descendant : tree -> [`Tree ] Node.t -> unordered_set -> [`Tree] Node.t = "caml_xml_tree_select_descendant" "noalloc"
 let select_descendant t n tag_set = tree_select_descendant t.doc n tag_set
 
index 1fa5c3b..0eb99c7 100644 (file)
@@ -33,6 +33,7 @@ val tagged_following_sibling : t -> node ->  Tag.t -> node
 val select_following_sibling : t -> node -> unordered_set -> node
 
 val tagged_descendant : t -> node -> Tag.t -> node
+val tagged_next : t -> node -> Tag.t -> node
 val select_descendant : t -> node -> unordered_set -> node
 
 val tagged_following_before : t -> node -> Tag.t -> node ->  node