From 7bcf3b1a0d1b72ab25e4942b06bbec3ac1d7539a Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 9 May 2024 17:15:45 +0200 Subject: [PATCH] Add slice.enum_slice_to_bitset & slice.bitset_to_enum_slice --- core/slice/slice.odin | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/core/slice/slice.odin b/core/slice/slice.odin index dd8d9868a..170e4cbf3 100644 --- a/core/slice/slice.odin +++ b/core/slice/slice.odin @@ -701,3 +701,27 @@ enumerated_array :: proc(ptr: ^$T) -> []intrinsics.type_elem_type(T) where intrinsics.type_is_enumerated_array(T) { return ([^]intrinsics.type_elem_type(T))(ptr)[:len(T)] } + +// Turn a `[]E` into `bit_set[E]` +// e.g.: +// bs := slice.enum_slice_to_bitset(my_flag_slice, rl.ConfigFlags) +@(require_results) +enum_slice_to_bitset :: proc(enums: []$E, $T: typeid/bit_set[E]) -> (bits: T) where intrinsics.type_is_enum(E) && intrinsics.type_bit_set_elem_type(T) == E { + for v in enums { + bits |= {v} + } + return +} + +// Turn a `bit_set[E]` into a `[]E` +// e.g.: +// sl := slice.bitset_to_enum_slice(flag_buf[:], bs) +@(require_results) +bitset_to_enum_slice :: proc(buf: []$E, bs: $T) -> (slice: []E) where intrinsics.type_is_enum(E) && intrinsics.type_bit_set_elem_type(T) == E { + count := 0 + for v in bs { + buf[count] = v + count += 1 + } + return buf[:count] +} \ No newline at end of file