Merge pull request #3559 from Kelimion/bitset_to_enum_slice

Add slice.enum_slice_to_bitset & slice.bitset_to_enum_slice
This commit is contained in:
Jeroen van Rijn
2024-05-09 17:21:04 +02:00
committed by GitHub

View File

@@ -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]
}