This commit is contained in:
Simon Cruanes 2017-04-19 22:28:02 +02:00
parent 02f1d5c4a0
commit 57d460ecde

View file

@ -99,9 +99,11 @@ let really_resize_ bv ~desired ~current size =
let grow_ bv size = let grow_ bv size =
if size <= capacity bv (* within capacity *) if size <= capacity bv (* within capacity *)
then bv.size <- size then bv.size <- size
else ( (* beyond capacity *) else (
(* beyond capacity *)
let desired = array_length_of_size size in let desired = array_length_of_size size in
let current = Array.length bv.a in let current = Array.length bv.a in
assert (desired > current);
really_resize_ bv ~desired ~current size really_resize_ bv ~desired ~current size
) )
@ -111,7 +113,7 @@ let shrink_ bv size =
really_resize_ bv ~desired ~current size really_resize_ bv ~desired ~current size
let resize bv size = let resize bv size =
if size < 0 then invalid_arg "resize: negative size" else if size < 0 then invalid_arg "resize: negative size";
if size < bv.size (* shrink *) if size < bv.size (* shrink *)
then shrink_ bv size then shrink_ bv size
else if size = bv.size else if size = bv.size
@ -347,10 +349,10 @@ let negate_self b =
let negate b = let negate b =
let a = Array.map (lnot) b.a in let a = Array.map (lnot) b.a in
let r = b.size mod width_ in let r = b.size mod width_ in
if r <> 0 then begin if r <> 0 then (
let l = Array.length b.a - 1 in let l = Array.length b.a - 1 in
Array.unsafe_set a l (lsb_masks_.(r) land (Array.unsafe_get a l)) Array.unsafe_set a l (lsb_masks_.(r) land (Array.unsafe_get a l))
end; );
{ a ; size = b.size } { a ; size = b.size }
(*$Q (*$Q
@ -359,8 +361,9 @@ let negate b =
(* Underlying size grows for union. *) (* Underlying size grows for union. *)
let union_into ~into bv = let union_into ~into bv =
if into.size < bv.size if into.size < bv.size then (
then grow_ into bv.size; grow_ into bv.size;
);
for i = 0 to (Array.length into.a) - 1 do for i = 0 to (Array.length into.a) - 1 do
Array.unsafe_set into.a i Array.unsafe_set into.a i
((Array.unsafe_get into.a i) lor (Array.unsafe_get bv.a i)) ((Array.unsafe_get into.a i) lor (Array.unsafe_get bv.a i))
@ -400,8 +403,9 @@ let union b1 b2 =
(* Underlying size shrinks for inter. *) (* Underlying size shrinks for inter. *)
let inter_into ~into bv = let inter_into ~into bv =
if into.size > bv.size if into.size > bv.size then (
then shrink_ into bv.size; shrink_ into bv.size;
);
for i = 0 to (Array.length into.a) - 1 do for i = 0 to (Array.length into.a) - 1 do
Array.unsafe_set into.a i Array.unsafe_set into.a i
((Array.unsafe_get into.a i) land (Array.unsafe_get bv.a i)) ((Array.unsafe_get into.a i) land (Array.unsafe_get bv.a i))