Source file boolvector.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
open Fix.Indexing
type 'n t = bytes
let make c default =
let n = cardinal c in
Bytes.make ((n + 7) lsr 3) (if default then '\xFF' else '\x00')
let test b n =
let n = (n : _ index :> int) in
let cell = n lsr 3 in
let bit = n land 7 in
Char.code (Bytes.unsafe_get b cell) land (1 lsl bit) <> 0
let set b n =
let n = (n : _ index :> int) in
let cell = n lsr 3 in
let bit = n land 7 in
Bytes.unsafe_set b cell
(Char.unsafe_chr (Char.code (Bytes.unsafe_get b cell) lor (1 lsl bit)))
let clear b n =
let n = (n : _ index :> int) in
let cell = n lsr 3 in
let bit = n land 7 in
Bytes.unsafe_set b cell
(Char.unsafe_chr (Char.code (Bytes.unsafe_get b cell) land lnot (1 lsl bit)))
let init c f =
let result = make c false in
Index.iter c (fun i -> if f i then set result i);
result
let from_vector vec f =
let n = Vector.length vec in
let result = make n false in
Index.iter n (fun i -> if f (Vector.get vec i) then set result i);
result