X-Git-Url: http://git.nguyen.vg/gitweb/?p=tatoo.git;a=blobdiff_plain;f=src%2Ftable.ml;fp=src%2Ftable.ml;h=c40e93b9df2c0a10b0d984f8ff017c93d17516f6;hp=64d4103ba64558375126848ae1914c2c993d0561;hb=c5480c3711c7431e70f78871c738f2d86ecb96ac;hpb=72818d02fb469c39a3d8043300152beae3e7e162 diff --git a/src/table.ml b/src/table.ml index 64d4103..c40e93b 100644 --- a/src/table.ml +++ b/src/table.ml @@ -144,7 +144,7 @@ let get_list_ordred tree ll = let l1 = List.fold_left (fun acc l -> merge_list tree acc l) [] ll in List.rev l1 -let get_descendant tree v = +let get_descendant tree c v = let rec aux n acc = if n == Naive_tree.nil then acc else let n1 = Naive_tree.first_child tree n in @@ -156,12 +156,21 @@ let get_descendant tree v = in let v0 = Bitvector.create (Naive_tree.size tree) in (* let v = bitvector_of_nodes tree ln in*) - for i = 0 to (Bitvector.length v)-1 do - if Bitvector.get v i then - let n = Naive_tree.by_preorder tree i in - let n1 = Naive_tree.first_child tree n in - let _ = aux n1 v0 in (); - done; + if c then begin + for i = 0 to (Bitvector.length v)-1 do + if Bitvector.get v i then + let n = Naive_tree.by_preorder tree i in + let n1 = Naive_tree.first_child tree n in + let _ = aux n1 v0 in + Bitvector.set v0 i true + done; end + else + for i = 0 to (Bitvector.length v)-1 do + if Bitvector.get v i then + let n = Naive_tree.by_preorder tree i in + let n1 = Naive_tree.first_child tree n in + let _ = aux n1 v0 in () + done; v0 let get_child tree v = @@ -218,24 +227,46 @@ let get_parent tree v = done; v0 -let get_ancestor tree v = +let get_ancestor tree b v = let v0 = Bitvector.create (Naive_tree.size tree) in (* let v = bitvector_of_nodes tree ln in *) - - for i = (Bitvector.length v)-1 downto 0 do - if Bitvector.get v i then - let n = Naive_tree.by_preorder tree i in - let n0 = ref n in - while !n0 != Naive_tree.nil do - let n1 = get_firstBling tree !n0 Naive_tree.nil in - let n2 = Naive_tree.parent_of_first tree n1 in - n0 := n2; - if n2 != Naive_tree.nil then begin let j = Naive_tree.preorder tree n2 in - Bitvector.set v0 j true; - Bitvector.set v j true; - end + if b then + begin + for i = (Bitvector.length v)-1 downto 0 do + if Bitvector.get v i then + begin + Bitvector.set v0 i true; + let n = Naive_tree.by_preorder tree i in + let n0 = ref n in + while !n0 != Naive_tree.nil do + let n1 = get_firstBling tree !n0 Naive_tree.nil in + let n2 = Naive_tree.parent_of_first tree n1 in + n0 := n2; + if n2 != Naive_tree.nil then begin let j = Naive_tree.preorder tree n2 in + Bitvector.set v0 j true; + Bitvector.set v j true; + end + done; + end done; - done; + end + else + for i = (Bitvector.length v)-1 downto 0 do + if Bitvector.get v i then + begin + let n = Naive_tree.by_preorder tree i in + let n0 = ref n in + while !n0 != Naive_tree.nil do + let n1 = get_firstBling tree !n0 Naive_tree.nil in + let n2 = Naive_tree.parent_of_first tree n1 in + n0 := n2; + if n2 != Naive_tree.nil then begin let j = Naive_tree.preorder tree n2 in + Bitvector.set v0 j true; + Bitvector.set v j true; + end + done; + end + done; v0 let get_preSibling tree v = @@ -267,18 +298,16 @@ let rec eval_axis tree v a = | Child -> get_child tree v - | Descendant c -> let v2 = get_descendant tree v in - if not c then v2 - else Bitvector.union v2 v + | Descendant c -> get_descendant tree c v + | FollowingSibling -> get_followingSibling tree v | Parent -> get_parent tree v - | Ancestor b -> let v2 = get_ancestor tree v in - if not b then v2 - else Bitvector.union v2 v + | Ancestor b -> get_ancestor tree b v + | PrecedingSibling -> get_preSibling tree v