Browse Source

unset function

unset function, clear single bits
JungerBoyo 3 years ago
parent
commit
ad6b3bd95f
1 changed files with 27 additions and 0 deletions
  1. 27 0
      core/container/bit_array/bit_array.odin

+ 27 - 0
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
 	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).
 	A helper function to create a Bit Array with optional bias, in case your smallest index is non-zero (including negative).
 */
 */