safety commit
[SXSI/xpathcomp.git] / tree.ml
diff --git a/tree.ml b/tree.ml
index 1ff2082..26dc770 100644 (file)
--- a/tree.ml
+++ b/tree.ml
@@ -20,6 +20,11 @@ type tree
 type 'a node = private int
 type node_kind = [`Text | `Tree ]
 
+type t = { 
+  doc : tree;            
+  ttable : (Tag.t,(Ptset.Int.t*Ptset.Int.t*Ptset.Int.t*Ptset.Int.t)) Hashtbl.t;
+}
+
 external inode : 'a node -> int = "%identity"  
 external nodei : int -> 'a node = "%identity"  
 let compare_node x y = (inode x) - (inode y)
@@ -63,10 +68,10 @@ external tree_parent_doc : tree -> [`Text ] node -> [`Tree ] node = "caml_xml_tr
 external tree_first_child : tree -> [`Tree] node -> [`Tree] node = "caml_xml_tree_first_child" "noalloc"
 external tree_closing : tree -> [`Tree] node -> [`Tree] node = "caml_xml_tree_closing" "noalloc"
 external tree_is_open : tree -> [`Tree] node -> bool = "caml_xml_tree_is_open" "noalloc"
-external tree_first_element : tree -> [`Tree] node -> [`Tree] node = "caml_xml_tree_first_element" "noalloc"
+external tree_first_element : t -> [`Tree] node -> [`Tree] node = "caml_xml_tree_first_element" "noalloc"
 external tree_tagged_child : tree -> [`Tree] node -> Tag.t -> [`Tree] node = "caml_xml_tree_tagged_child" "noalloc" 
 external tree_next_sibling : tree -> [`Tree] node -> [`Tree] node = "caml_xml_tree_next_sibling"  "noalloc"
-external tree_next_element : tree -> [`Tree] node -> [`Tree] node = "caml_xml_tree_next_element"  "noalloc"
+external tree_next_element : t -> [`Tree] node -> [`Tree] node = "caml_xml_tree_next_element"  "noalloc"
 external tree_tagged_sibling : tree -> [`Tree] node -> Tag.t -> [`Tree] node = "caml_xml_tree_tagged_sibling" "noalloc"
 
 external tree_prev_sibling : tree -> [`Tree] node -> [`Tree] node = "caml_xml_tree_prev_sibling" "noalloc"
@@ -79,8 +84,7 @@ external tree_tag_id : tree -> [`Tree ] node -> Tag.t = "caml_xml_tree_tag_id"
     
 
 let tree_is_last t n = equal_node nil (tree_next_sibling t n)
-    
-(*external tree_prev_text : tree -> [`Tree] node -> [`Text ] node = "caml_xml_tree_prev_text" "noalloc" *)
+
 
 external tree_my_text : tree -> [`Tree] node -> [`Text ] node = "caml_xml_tree_my_text" "noalloc"
 external tree_my_text_unsafe : tree -> [`Tree] node -> [`Text ] node = "caml_xml_tree_my_text_unsafe" "noalloc"
@@ -100,6 +104,7 @@ external tree_node_xml_id : tree -> [`Tree ] node -> int = "caml_xml_tree_node_x
 external tree_is_ancestor : tree -> [`Tree ] node -> [`Tree ] node -> bool = "caml_xml_tree_is_ancestor" "noalloc" 
 external tree_tagged_desc : tree -> [`Tree ] node -> Tag.t -> [`Tree ] node = "caml_xml_tree_tagged_desc" "noalloc"
 external tree_tagged_foll_below : tree -> [`Tree ] node -> Tag.t -> [`Tree ] node -> [`Tree ] node = "caml_xml_tree_tagged_foll_below" "noalloc"
+external tree_tagged_foll_before : tree -> [`Tree ] node -> Tag.t -> [`Tree ] node -> [`Tree ] node = "caml_xml_tree_tagged_foll_before" "noalloc"
 external tree_subtree_tags : tree -> [`Tree ] node -> Tag.t -> int = "caml_xml_tree_subtree_tags" "noalloc"
 
 
@@ -112,6 +117,7 @@ external tree_select_child : tree -> [`Tree ] node -> unordered_set -> [`Tree] n
 external tree_select_foll_sibling : tree -> [`Tree ] node -> unordered_set -> [`Tree] node = "caml_xml_tree_select_foll_sibling" "noalloc"
 external tree_select_desc : tree -> [`Tree ] node -> unordered_set -> [`Tree] node = "caml_xml_tree_select_desc" "noalloc"
 external tree_select_foll_below : tree -> [`Tree ] node -> unordered_set -> [`Tree] node -> [`Tree] node = "caml_xml_tree_select_foll_below" "noalloc"
+external tree_select_foll_before : tree -> [`Tree ] node -> unordered_set -> [`Tree] node -> [`Tree] node = "caml_xml_tree_select_foll_before" "noalloc"
 
 
 module HPtset = Hashtbl.Make(Ptset.Int)
@@ -128,10 +134,7 @@ let ptset_to_vector s =
          HPtset.add vector_htbl s v; v
 
       
-type t = { 
-  doc : tree;            
-  ttable : (Tag.t,(Ptset.Int.t*Ptset.Int.t*Ptset.Int.t*Ptset.Int.t)) Hashtbl.t;
-}
+
 let subtree_size t i = tree_subtree_size t.doc i
 let subtree_elements t i = tree_subtree_elements t.doc i
 let text_size t = text_size t.doc
@@ -442,7 +445,7 @@ let is_binary_ancestor t n1 n2 =
 let parent t n = tree_parent t.doc n
 
 let first_child t = (); fun n -> tree_first_child t.doc n
-let first_element t = (); fun n -> tree_first_element t.doc n
+let first_element t = (); fun n -> tree_first_element t n
 
 (* these function will be called in two times: first partial application
    on the tag, then application of the tag and the tree, then application of
@@ -456,7 +459,7 @@ let select_child t = fun ts ->
     fun n -> tree_select_child t.doc n v
 
 let next_sibling t = (); fun n ->  tree_next_sibling t.doc n
-let next_element t = (); fun n ->  tree_next_element t.doc n
+let next_element t = (); fun n ->  tree_next_element t n
 
 let tagged_sibling t tag = (); fun n -> tree_tagged_sibling t.doc n tag
 
@@ -465,7 +468,7 @@ let select_sibling t = fun ts ->
     fun n -> tree_select_foll_sibling t.doc n v
 
 let next_sibling_ctx t = (); fun n _ -> tree_next_sibling t.doc n
-let next_element_ctx t = (); fun n _ ->  tree_next_element t.doc n
+let next_element_ctx t = (); fun n _ ->  tree_next_element t n
 let tagged_sibling_ctx t tag = (); fun n  _ -> tree_tagged_sibling t.doc n tag
 
 let select_sibling_ctx t = fun ts ->