X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2Ftree.ml;fp=src%2Ftree.ml;h=9b3d4bc52bdcecdc0685053ccbad4ef8268cdfea;hb=ecec752325cb3d207894a4f8d772936bd7ad9f4a;hp=9c6eff3adb19a51e9afcdbd0cb9f21a702da79b3;hpb=db0ad408721f202e33785958211fe6e4228fce8f;p=SXSI%2Fxpathcomp.git diff --git a/src/tree.ml b/src/tree.ml index 9c6eff3..9b3d4bc 100644 --- a/src/tree.ml +++ b/src/tree.ml @@ -170,10 +170,22 @@ end type bit_vector = string external bool_of_int : int -> bool = "%identity" +external int_of_bool : bool -> int = "%identity" let bit_vector_unsafe_get v i = bool_of_int (((Char.code (String.unsafe_get v (i lsr 3))) lsr (i land 7)) land 1) +let chr (c:int) : char = Obj.magic (c land 0xff) +let bit_vector_unsafe_set v i b = + let j = i lsr 3 in + let c = Char.code v.[j] in + let bit = int_of_bool b in + let mask = bit lsl (i land 7) in + if b then v.[j] <- chr (c lor mask) else v.[j] <- (chr (c land (lnot mask))) + +let bit_vector_create n = + let len = if n <= 0 then 0 else (n - 1) / 8 + 1 in + String.make len '\000' type t = { doc : tree;