temp
[tatoo.git] / src / bitvector.ml
1 type t = { length : int;
2            bits : string; }
3
4 let create size =
5   { length = size;
6     bits = String.make (1 + size / 8) '\000'
7   }
8
9 let unsafe_get v n =
10   let i = n / 8
11   and j = n mod 8 in
12   (((Char.code (String.unsafe_get v.bits i)) lsr j) land 1) == 1
13
14
15 let unsafe_set v n (b:bool) =
16   let x : int = Obj.magic b in
17   let i = n / 8
18   and j = n mod 8 in
19   let m = 1 lsl j in
20   let w = Char.code (String.unsafe_get v.bits i) in
21   let w = (w land lnot m) lor (~-x land m) in
22   String.unsafe_set v.bits i (Char.unsafe_chr (w land 0xff))
23 ;;
24
25 let get v n =
26   if n < 0 || n >= v.length then failwith "Bitvector.get"
27   else unsafe_get v n
28 ;;
29
30 let set v n b =
31   if n < 0 || n >= v.length then failwith "Bitvector.set"
32   else unsafe_set v n b
33 ;;