sketch_bit_vector_test.nx source
↩ module page · 117 lines · 4378 B
1// sketch_bit_vector_test.nx -- dense bit vector verification.
2
3import "syscalls.nx"
4import "sketch_bit_vector.nx"
5import "sketch_types.nx"
6
7func main() -> i64 {
8 // ---- alloc ----
9 let v: *BitVector = nx_bv_alloc(64)
10 if v == (0 as *BitVector) { return __syscall(93, 5, 0, 0, 0, 0, 0) }
11 // Reject too-small.
12 if nx_bv_alloc(4) != (0 as *BitVector) {
13 return __syscall(93, 6, 0, 0, 0, 0, 0)
14 }
15
16 // ---- empty: all zero ----
17 if nx_bv_get(v, 5) != 0 { return __syscall(93, 10, 0, 0, 0, 0, 0) }
18 if nx_bv_popcount(v) != 0 { return __syscall(93, 11, 0, 0, 0, 0, 0) }
19 if nx_bv_ffs(v) != -1 { return __syscall(93, 12, 0, 0, 0, 0, 0) }
20 if nx_bv_ffc(v) != 0 { return __syscall(93, 13, 0, 0, 0, 0, 0) }
21
22 // ---- set + get + popcount ----
23 nx_bv_set(v, 0)
24 nx_bv_set(v, 7)
25 nx_bv_set(v, 15)
26 nx_bv_set(v, 63)
27 if nx_bv_get(v, 0) != 1 { return __syscall(93, 20, 0, 0, 0, 0, 0) }
28 if nx_bv_get(v, 7) != 1 { return __syscall(93, 21, 0, 0, 0, 0, 0) }
29 if nx_bv_get(v, 5) != 0 { return __syscall(93, 22, 0, 0, 0, 0, 0) }
30 if nx_bv_popcount(v) != 4 { return __syscall(93, 23, 0, 0, 0, 0, 0) }
31
32 // ---- ffs / ffc ----
33 if nx_bv_ffs(v) != 0 { return __syscall(93, 30, 0, 0, 0, 0, 0) }
34 if nx_bv_ffc(v) != 1 { return __syscall(93, 31, 0, 0, 0, 0, 0) }
35
36 // ---- clear ----
37 nx_bv_clear(v, 0)
38 if nx_bv_get(v, 0) != 0 { return __syscall(93, 40, 0, 0, 0, 0, 0) }
39 if nx_bv_popcount(v) != 3 { return __syscall(93, 41, 0, 0, 0, 0, 0) }
40
41 // ---- toggle ----
42 nx_bv_toggle(v, 5) // 0 -> 1
43 if nx_bv_get(v, 5) != 1 { return __syscall(93, 50, 0, 0, 0, 0, 0) }
44 nx_bv_toggle(v, 5) // 1 -> 0
45 if nx_bv_get(v, 5) != 0 { return __syscall(93, 51, 0, 0, 0, 0, 0) }
46
47 // ---- popcount_range ----
48 // Bits set: {7, 15, 63}. Range [0, 32) has {7, 15} = 2.
49 if nx_bv_popcount_range(v, 0, 32) != 2 {
50 return __syscall(93, 60, 0, 0, 0, 0, 0)
51 }
52 // Range [32, 64) has {63} = 1.
53 if nx_bv_popcount_range(v, 32, 64) != 1 {
54 return __syscall(93, 61, 0, 0, 0, 0, 0)
55 }
56
57 // ---- bitwise AND ----
58 let va: *BitVector = nx_bv_alloc(32)
59 let vb: *BitVector = nx_bv_alloc(32)
60 nx_bv_set(va, 0); nx_bv_set(va, 1); nx_bv_set(va, 2)
61 nx_bv_set(vb, 1); nx_bv_set(vb, 2); nx_bv_set(vb, 3)
62 // va & vb: {1, 2}
63 nx_bv_and(va, vb)
64 if nx_bv_popcount(va) != 2 { return __syscall(93, 70, 0, 0, 0, 0, 0) }
65 if nx_bv_get(va, 0) != 0 { return __syscall(93, 71, 0, 0, 0, 0, 0) }
66 if nx_bv_get(va, 1) != 1 { return __syscall(93, 72, 0, 0, 0, 0, 0) }
67 if nx_bv_get(va, 3) != 0 { return __syscall(93, 73, 0, 0, 0, 0, 0) }
68
69 // ---- bitwise OR ----
70 let vc: *BitVector = nx_bv_alloc(32)
71 let vd: *BitVector = nx_bv_alloc(32)
72 nx_bv_set(vc, 0); nx_bv_set(vc, 1)
73 nx_bv_set(vd, 2); nx_bv_set(vd, 3)
74 nx_bv_or(vc, vd) // vc becomes {0,1,2,3}
75 if nx_bv_popcount(vc) != 4 {
76 return __syscall(93, 80, 0, 0, 0, 0, 0)
77 }
78
79 // ---- bitwise XOR ----
80 let ve: *BitVector = nx_bv_alloc(32)
81 let vf: *BitVector = nx_bv_alloc(32)
82 nx_bv_set(ve, 0); nx_bv_set(ve, 1); nx_bv_set(ve, 2)
83 nx_bv_set(vf, 1); nx_bv_set(vf, 2); nx_bv_set(vf, 3)
84 nx_bv_xor(ve, vf) // ve becomes {0, 3}
85 if nx_bv_popcount(ve) != 2 {
86 return __syscall(93, 90, 0, 0, 0, 0, 0)
87 }
88 if nx_bv_get(ve, 0) != 1 { return __syscall(93, 91, 0, 0, 0, 0, 0) }
89 if nx_bv_get(ve, 1) != 0 { return __syscall(93, 92, 0, 0, 0, 0, 0) }
90
91 // ---- bitwise NOT ----
92 let vg: *BitVector = nx_bv_alloc(16)
93 nx_bv_set(vg, 0); nx_bv_set(vg, 1)
94 nx_bv_not(vg)
95 // bits 0, 1 cleared; bits 2..15 set; popcount = 14.
96 if nx_bv_popcount(vg) != 14 {
97 return __syscall(93, 100, 0, 0, 0, 0, 0)
98 }
99
100 // ---- typed envelope ----
101 let q: *ApproxI64 = nx_bv_query_popcount(v)
102 if q.envelope_kind != NX_ENV_ABS {
103 return __syscall(93, 110, 0, 0, 0, 0, 0)
104 }
105 if q.param_a != 0 { return __syscall(93, 111, 0, 0, 0, 0, 0) }
106 if q.maturity != NX_MATURITY_PRODUCTION {
107 return __syscall(93, 112, 0, 0, 0, 0, 0)
108 }
109
110 // ---- clear_all ----
111 nx_bv_clear_all(v)
112 if nx_bv_popcount(v) != 0 {
113 return __syscall(93, 120, 0, 0, 0, 0, 0)
114 }
115
116 return 0
117}