mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-06 11:15:31 -05:00
bv: refactor for performance and readability
This commit is contained in:
parent
92519b4843
commit
1c8265c3f3
2 changed files with 7 additions and 4 deletions
|
|
@ -252,16 +252,18 @@ let iter bv f =
|
||||||
assert (len <= Array.length bv.a);
|
assert (len <= Array.length bv.a);
|
||||||
for n = 0 to len - 2 do
|
for n = 0 to len - 2 do
|
||||||
let j = width_ * n in
|
let j = width_ * n in
|
||||||
|
let word_n = Array.unsafe_get bv.a n in
|
||||||
for i = 0 to width_ - 1 do
|
for i = 0 to width_ - 1 do
|
||||||
f (j+i) (bv.a.(n) land (1 lsl i) <> 0)
|
f (j+i) ((word_n land (1 lsl i)) <> 0)
|
||||||
done
|
done
|
||||||
done;
|
done;
|
||||||
if bv.size > 0 then (
|
if bv.size > 0 then (
|
||||||
let j = width_ * (len - 1) in
|
let j = width_ * (len - 1) in
|
||||||
let r = bv.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
|
||||||
|
let final_word = Array.unsafe_get bv.a (len-1) 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 (1 lsl i) <> 0)
|
f (j + i) ((final_word land (1 lsl i)) <> 0)
|
||||||
done
|
done
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -294,7 +296,7 @@ let iter bv f =
|
||||||
List.length l = n && List.for_all (fun (_,b) -> b) l)
|
List.length l = n && List.for_all (fun (_,b) -> b) l)
|
||||||
*)
|
*)
|
||||||
|
|
||||||
let iter_true bv f =
|
let[@inline] iter_true bv f =
|
||||||
iter bv (fun i b -> if b then f i else ())
|
iter bv (fun i b -> if b then f i else ())
|
||||||
|
|
||||||
(*$T
|
(*$T
|
||||||
|
|
|
||||||
|
|
@ -79,7 +79,8 @@ val of_list : int list -> t
|
||||||
(** From a list of true bits.
|
(** From a list of true bits.
|
||||||
|
|
||||||
The bits are interpreted as indices into the returned bitvector, so the final
|
The bits are interpreted as indices into the returned bitvector, so the final
|
||||||
bitvector will have [length t] equal to 1 more than max of list indices. *)
|
bitvector [bv] will have [length bv] equal to 1 more than max of list indices.
|
||||||
|
*)
|
||||||
|
|
||||||
val first : t -> int option
|
val first : t -> int option
|
||||||
(** First set bit, or return [None].
|
(** First set bit, or return [None].
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue