Further optimisations, changed the prototype of Tree.mli
[SXSI/xpathcomp.git] / OCamlDriver.cpp
index 78d3e15..5b7e0b6 100644 (file)
@@ -49,6 +49,7 @@ extern "C" {
 #define XMLTREE(x) ((XMLTree *)(* (XMLTree**) Data_custom_val(x)))
 #define TEXTCOLLECTION(x)
 #define TREENODEVAL(i) ((treeNode) (Int_val(i)))
+#define XMLTREE_ROOT 0
 
 extern "C" {
   static struct custom_operations ops;
@@ -143,7 +144,7 @@ void traversal_rec(XMLTree* tree, treeNode id){
 
 extern "C" CAMLprim value caml_cpp_traversal(value tree){
   CAMLparam1(tree);
-  traversal_rec(XMLTREE(tree),XMLTREE(tree)->Root());
+  traversal_rec(XMLTREE(tree),XMLTREE_ROOT);
   CAMLreturn(Val_unit);
 }
 
@@ -219,7 +220,7 @@ extern "C" CAMLprim value caml_text_collection_unsorted_contains(value tree,valu
 
 extern "C" CAMLprim value caml_xml_tree_root(value tree){
   CAMLparam1(tree);
-  CAMLreturn (Val_int(TREENODEVAL(XMLTREE(tree)->Root())));
+  CAMLreturn (Val_int(TREENODEVAL(XMLTREE_ROOT)));
 }
 extern "C" CAMLprim value caml_xml_tree_text_collection(value tree){
   CAMLparam1(tree);
@@ -276,6 +277,17 @@ extern "C" CAMLprim value caml_xml_tree_first_child(value tree, value id){
   CAMLreturn(Val_int (XMLTREE(tree)->FirstChild(TREENODEVAL(id))));
 }
 
+extern "C" CAMLprim value caml_xml_tree_tagged_child(value tree, value id, value tag){
+  CAMLparam3(tree,id,tag);
+  CAMLreturn(Val_int (XMLTREE(tree)->TaggedChild(TREENODEVAL(id),Int_val(tag))));
+}
+
+extern "C" CAMLprim value caml_xml_tree_tagged_sibling(value tree, value id, value tag){
+  CAMLparam3(tree,id,tag);
+  CAMLreturn(Val_int (XMLTREE(tree)->TaggedFollSibling(TREENODEVAL(id),Int_val(tag))));
+}
+
+
 extern "C" CAMLprim value caml_xml_tree_is_leaf(value tree, value id){
   CAMLparam2(tree,id);
   CAMLreturn(Val_bool (XMLTREE(tree)->IsLeaf(TREENODEVAL(id))));
@@ -397,14 +409,45 @@ extern "C" CAMLprim value caml_int_vector_alloc(value len){
 }
 
 extern "C" CAMLprim value caml_int_vector_set(value vec, value i, value v){
-  CAMLparam3(vec,i,v);
-  
+  CAMLparam3(vec,i,v);  
   ((int*) vec)[Int_val(i)+1] = Int_val(v);
   CAMLreturn (Val_unit);
 }
 
 
 #define VECT(x)  ((int*) (x))
+extern "C" CAMLprim value caml_xml_tree_select_desc(value tree, value node, value tags){
+  CAMLparam3(tree,node,tags);
+   
+  CAMLreturn (Val_int (XMLTREE(tree)->SelectDesc(TREENODEVAL(node),
+                                                 &(VECT(tags)[1]),
+                                                VECT(tags)[0])));
+}
+extern "C" CAMLprim value caml_xml_tree_select_child(value tree, value node, value tags){
+  CAMLparam3(tree,node,tags);
+   
+  CAMLreturn (Val_int (XMLTREE(tree)->SelectChild(TREENODEVAL(node),
+                                                 &(VECT(tags)[1]),
+                                                 VECT(tags)[0])));
+}
+extern "C" CAMLprim value caml_xml_tree_select_foll_sibling(value tree, value node, value tags){
+  CAMLparam3(tree,node,tags);
+  
+  CAMLreturn (Val_int (XMLTREE(tree)->SelectFollSibling(TREENODEVAL(node),
+                                                       &(VECT(tags)[1]),
+                                                       VECT(tags)[0])));
+}
+extern "C" CAMLprim value caml_xml_tree_select_foll_below(value tree, value node, value tags,value ctx){
+  CAMLparam4(tree,node,tags,ctx);
+  
+  CAMLreturn (Val_int (XMLTREE(tree)->SelectFollBelow(TREENODEVAL(node),
+                                                     &(VECT(tags)[1]),
+                                                     VECT(tags)[0],Int_val(ctx))));
+}
+
+
+                       
+/*
 extern "C" CAMLprim value caml_xml_tree_select_below(value tree, value node, value ctags, value dtags){
   CAMLparam4(tree,node,ctags,dtags);
    
@@ -414,8 +457,9 @@ extern "C" CAMLprim value caml_xml_tree_select_below(value tree, value node, val
                                                   VECT(ctags)[0],
                                                   &(VECT(dtags)[1]),
                                                   VECT(dtags)[0]))));                                     
-}
-
+                                                  }
+*/
+/*
 extern "C" CAMLprim value caml_xml_tree_select_next(value tree, value node, value ctags, value ftags,value root){
   CAMLparam5(tree,node,ctags,ftags,root);
   CAMLreturn (Val_int (
@@ -426,7 +470,8 @@ extern "C" CAMLprim value caml_xml_tree_select_next(value tree, value node, valu
                                                  VECT(ftags)[0],
                                                  TREENODEVAL(root)))));
 }
-
+*/
+/*
 extern "C" CAMLprim value caml_xml_tree_select_desc_only(value tree, value node,value dtags){
   CAMLparam3(tree,node,dtags);
    
@@ -453,7 +498,7 @@ extern "C" CAMLprim value caml_xml_tree_select_desc_or_foll_only(value tree, val
                                                  VECT(ftags)[0],
                                                  TREENODEVAL(root)))));
 }
-
+*/
 extern "C" CAMLprim value caml_xml_tree_doc_ids(value tree, value node){
   CAMLparam2(tree,node);
   CAMLlocal1(tuple);