Merge and bug fix pass

This commit is contained in:
Leonid Rozenberg 2017-04-19 14:52:13 -04:00
parent cbff4e5a39
commit 0b53ed01a3

View file

@ -42,7 +42,7 @@ let array_length_of_size size =
let create ~size default = let create ~size default =
if size = 0 then { a = [| |]; size } if size = 0 then { a = [| |]; size }
else ( else (
let n = capa_of_size size in let n = array_length_of_size size in
let a = if default let a = if default
then Array.make n all_ones_ then Array.make n all_ones_
else Array.make n 0 else Array.make n 0
@ -76,19 +76,6 @@ let copy bv = { bv with a = Array.copy bv.a }
let capacity bv = width_ * Array.length bv.a let capacity bv = width_ * Array.length bv.a
(* iterate on words of width (at most) [width_] *)
let iter_words ~f bv: unit =
if bv.size = 0 then ()
else (
let len = array_length_of_size bv.size in
assert (len>0);
for i = 0 to len-1 do
let word = Array.unsafe_get a i in
f i word
done;
if r <> 0 then f (len-1) (Array.unsafe_get a (len-1) land lsb_masks_.(r));
)
let cardinal bv = let cardinal bv =
if bv.size = 0 then 0 if bv.size = 0 then 0
else ( else (
@ -178,7 +165,7 @@ let set bv i =
else ( else (
let n = i / width_ in let n = i / width_ in
let j = i mod width_ in let j = i mod width_ in
if i >= bv.size then grow_ bv i; if i >= bv.size then grow_ bv (i+1);
Array.unsafe_set bv.a n ((Array.unsafe_get bv.a n) lor (1 lsl j)) Array.unsafe_set bv.a n ((Array.unsafe_get bv.a n) lor (1 lsl j))
) )
@ -192,7 +179,7 @@ let reset bv i =
else ( else (
let n = i / width_ in let n = i / width_ in
let j = i mod width_ in let j = i mod width_ in
if i >= bv.size then grow_ bv i; if i >= bv.size then grow_ bv (i+1);
Array.unsafe_set bv.a n ((Array.unsafe_get bv.a n) land (lnot (1 lsl j))) Array.unsafe_set bv.a n ((Array.unsafe_get bv.a n) land (lnot (1 lsl j)))
) )
@ -205,7 +192,7 @@ let flip bv i =
else ( else (
let n = i / width_ in let n = i / width_ in
let j = i mod width_ in let j = i mod width_ in
if i >= bv.size then grow_ bv i; if i >= bv.size then grow_ bv (i+1);
Array.unsafe_set bv.a n ((Array.unsafe_get bv.a n) lxor (1 lsl j)) Array.unsafe_set bv.a n ((Array.unsafe_get bv.a n) lxor (1 lsl j))
) )
@ -247,11 +234,11 @@ let iter bv f =
f (j+i) (bv.a.(n) land (1 lsl i) <> 0) f (j+i) (bv.a.(n) land (1 lsl i) <> 0)
done done
done; done;
let j = max 0 (width_ * (len - 2)) in let j = width_ * (len - 1) in
let r = size mod width_ in let r = bv.size mod width_ in
let final_length = if r = 0 then width_ else r in let final_length = if r = 0 then width_ else r in
for i = 0 to final_length - 1 do for i = 0 to final_length - 1 do
f (j + i) (bv.a.(len - 1) land (i lsl i) <> 0) f (j + i) (bv.a.(len - 1) land (1 lsl i) <> 0)
done done
(*$R (*$R
@ -503,9 +490,7 @@ let selecti bv arr =
*) *)
(*$= & ~printer:Q.Print.(list (pair int int)) (*$= & ~printer:Q.Print.(list (pair int int))
selecti (of_list [1;4;3]) [| 0;1;2;3;4;5;6;7;8 |] \
[1,1; 3,3; 4,4] (selecti (of_list [1;4;3]) [| 0;1;2;3;4;5;6;7;8 |] \ [1,1; 3,3; 4,4] (selecti (of_list [1;4;3]) [| 0;1;2;3;4;5;6;7;8 |] \
|> List.sort CCOrd.compare = [1, 1; 3,3; 4,4]
|> List.sort CCOrd.compare) |> List.sort CCOrd.compare)
*) *)