une version marché et correcte avec bitvector
[tatoo.git] / src / bitvector.ml
index 73d2aee..6a0152a 100644 (file)
@@ -7,6 +7,11 @@ let create ?(init=false) size =
     bits = String.make (1 + size / 8) i
   }
 
+let alloc size =
+  { length = size;
+    bits = String.create (1 + size / 8);
+  }
+
 let length v = v.length
 
 let unsafe_get v n =
@@ -16,7 +21,7 @@ let unsafe_get v n =
 
 let union v1 v2 =
   assert ( v1.length == v2.length );
-  let res = create v1.length in
+  let res = alloc v1.length in
  (* Format.printf "size %d@." (String.length res.bits);*)
   for i = 0 to String.length v1.bits - 1 do
       res.bits.[i] <- Char.chr ((Char.code v1.bits.[i]) lor (Char.code v2.bits.[i]))
@@ -25,7 +30,7 @@ let union v1 v2 =
 
 let inter v1 v2 =
    assert ( v1.length == v2.length );
-  let res = create v1.length in
+  let res = alloc v1.length in
   for i = 0 to String.length v1.bits - 1 do
     res.bits.[i] <- Char.chr ((Char.code v1.bits.[i]) land (Char.code v2.bits.[i]))
   done;
@@ -33,10 +38,9 @@ let inter v1 v2 =
 
 let diff v1 v2 =
   assert ( v1.length == v2.length );
-  let res = create v1.length in
+  let res = alloc v1.length in
   for i = 0 to String.length v1.bits - 1 do
-    res.bits.[i] <- Char.chr (if (Char.code v1.bits.[i]) != ( (Char.code v2.bits.[i])) then 1
-      else 0 )
+    res.bits.[i] <- Char.chr ((Char.code v1.bits.[i]) land (lnot (Char.code v2.bits.[i])))
   done;
   res