1) Utiliser bitvector pour preserver l'ordre pendant l'evaluation
[tatoo.git] / src / bitvector.ml
1 type t = { length : int;
2            bits : string; }
3
4 let create ?(init=false) size =
5   let i = if init then '\xff' else '\x00' in
6   { length = size;
7     bits = String.make (1 + size / 8) i
8   }
9
10 let length v = v.length
11
12 let unsafe_get v n =
13   let i = n / 8
14   and j = n mod 8 in
15   (((Char.code (String.unsafe_get v.bits i)) lsr j) land 1) == 1
16
17 let union v1 v2 =
18   assert ( v1.length == v2.length );
19   let res = create v1.length in
20  (* Format.printf "size %d@." (String.length res.bits);*)
21   for i = 0 to String.length v1.bits - 1 do
22       res.bits.[i] <- Char.chr ((Char.code v1.bits.[i]) lor (Char.code v2.bits.[i]))
23   done;
24   res
25
26 let inter v1 v2 =
27    assert ( v1.length == v2.length );
28   let res = create v1.length in
29   for i = 0 to String.length v1.bits - 1 do
30     res.bits.[i] <- Char.chr ((Char.code v1.bits.[i]) land (Char.code v2.bits.[i]))
31   done;
32   res
33
34 let diff v1 v2 =
35   assert ( v1.length == v2.length );
36   let res = create v1.length in
37   for i = 0 to String.length v1.bits - 1 do
38     res.bits.[i] <- Char.chr (if (Char.code v1.bits.[i]) != ( (Char.code v2.bits.[i])) then 1
39       else 0 )
40   done;
41   res
42
43
44  
45 let unsafe_set v n (b:bool) =
46   let x : int = Obj.magic b in
47   let i = n / 8
48   and j = n mod 8 in
49   let m = 1 lsl j in
50   let w = Char.code (String.unsafe_get v.bits i) in
51   let w = (w land lnot m) lor (~-x land m) in
52   String.unsafe_set v.bits i (Char.unsafe_chr (w land 0xff))
53 ;;
54
55 let get v n =
56   if n < 0 || n >= v.length then failwith "Bitvector.get"
57   else unsafe_get v n
58 ;;
59
60 let set v n b =
61   if n < 0 || n >= v.length then failwith "Bitvector.set"
62   else unsafe_set v n b
63 ;;