From ad6b3bd95fe1e354e77f76f4694a4e076fd00e61 Mon Sep 17 00:00:00 2001 From: JungerBoyo <74600205+JungerBoyo@users.noreply.github.com> Date: Fri, 3 Jun 2022 15:53:14 +0200 Subject: unset function unset function, clear single bits --- core/container/bit_array/bit_array.odin | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'core/container/bit_array/bit_array.odin') diff --git a/core/container/bit_array/bit_array.odin b/core/container/bit_array/bit_array.odin index 98ef4b542..763a19f8b 100644 --- a/core/container/bit_array/bit_array.odin +++ b/core/container/bit_array/bit_array.odin @@ -185,6 +185,33 @@ set :: proc(ba: ^Bit_Array, #any_int index: uint, allocator := context.allocator return true } +/* + In: + - ba: ^Bit_Array - a pointer to the Bit Array + - index: The bit index. Can be an enum member. + + Out: + - ok: Whether or not we managed to unset requested bit. + + `unset` automatically resizes the Bit Array to accommodate the requested index if needed. +*/ +unset :: proc(ba: ^Bit_Array, #any_int index: uint, allocator := context.allocator) -> (ok: bool) { + + idx := int(index) - ba.bias + + if ba == nil || int(index) < ba.bias { return false } + context.allocator = allocator + + leg_index := idx >> INDEX_SHIFT + bit_index := idx & INDEX_MASK + + resize_if_needed(ba, leg_index) or_return + + ba.max_index = max(idx, ba.max_index) + ba.bits[leg_index] &= ~(1 << uint(bit_index)) + return true +} + /* A helper function to create a Bit Array with optional bias, in case your smallest index is non-zero (including negative). */ -- cgit v1.2.3