diff options
| author | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2024-05-09 18:03:42 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-09 18:03:42 +0200 |
| commit | 8a1e7bb6fba1fb2c195d7fa6c153d278858cdf61 (patch) | |
| tree | 9dfa4f5e42072c139b27b577782203df186d3054 | |
| parent | 113feacbc7efbfd2076ae04bc6b25ea740b47a50 (diff) | |
| parent | 8f706a14f84d65b9c543976c3c33bbe60129ae9d (diff) | |
Merge pull request #3562 from Kelimion/bitset_to_enum_slice
Bitset to enum slice
| -rw-r--r-- | core/slice/slice.odin | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/core/slice/slice.odin b/core/slice/slice.odin index 170e4cbf3..03791e7dd 100644 --- a/core/slice/slice.odin +++ b/core/slice/slice.odin @@ -706,7 +706,7 @@ enumerated_array :: proc(ptr: ^$T) -> []intrinsics.type_elem_type(T) // 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 { +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} } @@ -717,11 +717,23 @@ enum_slice_to_bitset :: proc(enums: []$E, $T: typeid/bit_set[E]) -> (bits: T) wh // 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 { +bitset_to_enum_slice_with_buffer :: 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 +} + +// Turn a `bit_set[E]` into a `[]E`, allocates +// e.g.: +// sl := slice.bitset_to_enum_slice(bs) +@(require_results) +bitset_to_enum_slice_with_make :: proc(bs: $T, $E: typeid, allocator := context.allocator) -> (slice: []E) where intrinsics.type_is_enum(E), intrinsics.type_bit_set_elem_type(T) == E { + ones := intrinsics.count_ones(transmute(E)bs) + buf := make([]E, int(ones), allocator) + return bitset_to_enum_slice(buf, bs) +} + +bitset_to_enum_slice :: proc{bitset_to_enum_slice_with_make, bitset_to_enum_slice_with_buffer}
\ No newline at end of file |