Implement set-theoretic operation on 2WSATA (union, intersection,
[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
18 let unsafe_set v n (b:bool) =
19   let x : int = Obj.magic b in
20   let i = n / 8
21   and j = n mod 8 in
22   let m = 1 lsl j in
23   let w = Char.code (String.unsafe_get v.bits i) in
24   let w = (w land lnot m) lor (~-x land m) in
25   String.unsafe_set v.bits i (Char.unsafe_chr (w land 0xff))
26 ;;
27
28 let get v n =
29   if n < 0 || n >= v.length then failwith "Bitvector.get"
30   else unsafe_get v n
31 ;;
32
33 let set v n b =
34   if n < 0 || n >= v.length then failwith "Bitvector.set"
35   else unsafe_set v n b
36 ;;