aboutsummaryrefslogtreecommitdiff
path: root/core/slice
diff options
context:
space:
mode:
authorJeroen van Rijn <Kelimion@users.noreply.github.com>2024-05-09 17:21:04 +0200
committerGitHub <noreply@github.com>2024-05-09 17:21:04 +0200
commit113feacbc7efbfd2076ae04bc6b25ea740b47a50 (patch)
tree8a82373af09dd1fb821d427d2f774161d358e368 /core/slice
parentf54977336b27c32eab52b77d94e7b1610f4350cf (diff)
parent7bcf3b1a0d1b72ab25e4942b06bbec3ac1d7539a (diff)
Merge pull request #3559 from Kelimion/bitset_to_enum_slice
Add slice.enum_slice_to_bitset & slice.bitset_to_enum_slice
Diffstat (limited to 'core/slice')
-rw-r--r--core/slice/slice.odin24
1 files changed, 24 insertions, 0 deletions
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