Browse Source

Merge pull request #3559 from Kelimion/bitset_to_enum_slice

Add slice.enum_slice_to_bitset & slice.bitset_to_enum_slice
Jeroen van Rijn 1 year ago
parent
commit
113feacbc7
1 changed files with 24 additions and 0 deletions
  1. 24 0
      core/slice/slice.odin

+ 24 - 0
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]
+}