code wiki / (root) / sketch_bit_vector_test.nx

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}