Add the node summary to the Tree interface.
[tatoo.git] / src / compact_tree.ml
index 485f5ff..b716cd7 100644 (file)
@@ -24,7 +24,7 @@ open Bigarray
 type table = int array
 type t = {
   table : table;
-  kind : Bytes.t;
+  summary : Bytes.t;
   tags : QName.t array;
   data : string array;
 }
@@ -56,9 +56,11 @@ let parent t n =
 
 let tag t n =
   Array.unsafe_get t.tags (idx n)
+let summary t n =
+  Obj.magic (String.unsafe_get t.summary (idx n))
 
 let kind t n : Tree.NodeKind.t =
-  Obj.magic (String.unsafe_get t.kind (idx n))
+  Tree.NodeSummary.kind (summary t n)
 
 let preorder t n =
   (idx n) - 2
@@ -129,11 +131,11 @@ let print_xml out tree node =
   print_xml (next_sibling tree node) out tree node
 
 
-let mk_node table_a data_a kind_a tags_a i kind tag data pre_fc pre_ns pre_p =
+let mk_node table_a data_a kind_a tags_a i summary tag data pre_fc pre_ns pre_p =
   try
     data_a.(i+2) <- data;
     tags_a.(i+2) <- tag;
-    Bytes.unsafe_set kind_a (i+2)  (Obj.magic kind);
+    Bytes.unsafe_set kind_a (i+2)  (Char.chr (summary land 0xff));
     let n = (i+2) * 3 in
     let fc = (pre_fc + 2) * 3 in
     let ns = (pre_ns + 2) * 3 in
@@ -150,19 +152,20 @@ let of_naive t =
   let table = Array.make len ~-1 (* int16_unsigned c_layout len *) in
   let data = Array.make (s + 2) "" in
   let tags = Array.make (s+2) dummy_tag in
-  let kind = Bytes.make (s+2) '\000' in
-  mk_node table data kind tags ~-2 Tree.NodeKind.Element dummy_tag "" dummy dummy dummy;
-  mk_node table data kind tags ~-1 Tree.NodeKind.Element QName.nil "" nil nil nil;
+  let summaries = Bytes.make (s+2) '\000' in
+  mk_node table data summaries tags ~-2 Tree.NodeSummary.dummy dummy_tag "" dummy dummy dummy;
+  mk_node table data summaries tags ~-1 Tree.NodeSummary.dummy QName.nil "" nil nil nil;
   for i = 0 to s - 1 do
     let node = Naive_tree.by_preorder t i in
-    mk_node table data kind tags i (Naive_tree.kind t node)
+    mk_node table data summaries tags i
+      (Naive_tree.summary t node)
       (Naive_tree.tag t node)
       (Naive_tree.data t node)
       (Naive_tree.preorder t (Naive_tree.first_child t node))
       (Naive_tree.preorder t (Naive_tree.next_sibling t node))
       (Naive_tree.preorder t (Naive_tree.parent t node))
   done;
-  { data; table; tags ; kind }
+  { data; table; tags ; summary = summaries }
 
 let load_xml_string s = of_naive (Naive_tree.load_xml_string s)
 let load_xml_file f = of_naive (Naive_tree.load_xml_file f)