diff options
Diffstat (limited to 'frontend/containers.icl')
-rw-r--r-- | frontend/containers.icl | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/frontend/containers.icl b/frontend/containers.icl index eaaa08c..4d0282b 100644 --- a/frontend/containers.icl +++ b/frontend/containers.icl @@ -135,6 +135,14 @@ bitvectSelect :: !Int !LargeBitvect -> Bool bitvectSelect index a = a.[BITINDEX index] bitand (1 << BITNUMBER index) <> 0 +bitvectTestAndSet :: !Int !*LargeBitvect -> (!Bool,!.LargeBitvect) +bitvectTestAndSet index a + # bit_index = BITINDEX index + #! a_bit_index = a.[bit_index] + # mask = 1 << BITNUMBER index + # new_a_bit_index = a_bit_index bitor mask + = (new_a_bit_index==a_bit_index,{ a & [bit_index] = new_a_bit_index}) + bitvectSet :: !Int !*LargeBitvect -> .LargeBitvect bitvectSet index a #! bit_index = BITINDEX index @@ -161,8 +169,7 @@ bitvectSetFirstN n_bits a bitvectResetAll :: !*LargeBitvect -> .LargeBitvect bitvectResetAll arr - #! size - = size arr + #! size = size arr = { arr & [i] = 0 \\ i<-[0..size-1] } // list should be optimized away bitvectOr :: !u:LargeBitvect !*LargeBitvect -> (!Bool, !u:LargeBitvect, !*LargeBitvect) |