From: kim Date: Wed, 2 Nov 2011 00:42:52 +0000 (+0000) Subject: Use TaggedNext for full subtree iteration instead of TaggedDesc/TaggedFoll X-Git-Url: http://git.nguyen.vg/gitweb/?a=commitdiff_plain;h=0158dd0bd369b50f3e784b3f4b6122ea4cbde822;p=SXSI%2Fxpathcomp.git Use TaggedNext for full subtree iteration instead of TaggedDesc/TaggedFoll git-svn-id: svn+ssh://idea.nguyen.vg/svn/sxsi/trunk/xpathcomp@1161 3cdefd35-fc62-479d-8e8d-bae585ffb9ca --- diff --git a/src/OCamlDriver.cpp b/src/OCamlDriver.cpp index db111db..275758a 100644 --- a/src/OCamlDriver.cpp +++ b/src/OCamlDriver.cpp @@ -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)))); } diff --git a/src/nodeSet.ml b/src/nodeSet.ml index 2716d61..e1f5476 100644 --- a/src/nodeSet.ml +++ b/src/nodeSet.ml @@ -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 diff --git a/src/tree.ml b/src/tree.ml index 27ceed6..97a850c 100644 --- a/src/tree.ml +++ b/src/tree.ml @@ -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 diff --git a/src/tree.mli b/src/tree.mli index 1fa5c3b..0eb99c7 100644 --- a/src/tree.mli +++ b/src/tree.mli @@ -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