X-Git-Url: http://git.nguyen.vg/gitweb/?p=tatoo.git;a=blobdiff_plain;f=src%2Fnaive_tree.ml;h=33c953df3e85cf3197a4a503eeb1768e4138e2cf;hp=6625be0cfe22e08e84e054998b5171c31fc0a691;hb=75375a8bc02893080745ab38768b7ee48f5c4153;hpb=d9e3bea94223a9d8f47ca0f0724b43aa102abf1e diff --git a/src/naive_tree.ml b/src/naive_tree.ml index 6625be0..33c953d 100644 --- a/src/naive_tree.ml +++ b/src/naive_tree.ml @@ -50,6 +50,7 @@ let rec dummy = { type t = { root : node; size : int; + by_preorder : node array; (* TODO add other intersting stuff *) } @@ -207,8 +208,19 @@ struct Expat.final psr; let root = List.hd ctx.stack in root.next_sibling <- nil; + let a = Array.create ctx.current_preorder nil in + let rec loop n = + if n != nil then + begin + a.(n.preorder) <- n; + loop n.first_child; + loop n.next_sibling; + end + in + loop root; { root = root; - size = ctx.current_preorder + size = ctx.current_preorder; + by_preorder = a } ) @@ -317,5 +329,7 @@ let tag _ n = n.tag let data _ n = n.data let kind _ n = n.kind let preorder _ n = n.preorder - +let by_preorder t i = + if i >= 0 && i < t.size then Array.unsafe_get t.by_preorder i + else let e = Invalid_argument "by_preorder" in raise e let print_node fmt n = Parser.debug_node fmt n