mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-05 15:18:49 +00:00
Merge pull request #3562 from Kelimion/bitset_to_enum_slice
Bitset to enum slice
This commit is contained in:
+15
-3
@@ -706,7 +706,7 @@ enumerated_array :: proc(ptr: ^$T) -> []intrinsics.type_elem_type(T)
|
|||||||
// e.g.:
|
// e.g.:
|
||||||
// bs := slice.enum_slice_to_bitset(my_flag_slice, rl.ConfigFlags)
|
// bs := slice.enum_slice_to_bitset(my_flag_slice, rl.ConfigFlags)
|
||||||
@(require_results)
|
@(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 {
|
for v in enums {
|
||||||
bits |= {v}
|
bits |= {v}
|
||||||
}
|
}
|
||||||
@@ -717,11 +717,23 @@ enum_slice_to_bitset :: proc(enums: []$E, $T: typeid/bit_set[E]) -> (bits: T) wh
|
|||||||
// e.g.:
|
// e.g.:
|
||||||
// sl := slice.bitset_to_enum_slice(flag_buf[:], bs)
|
// sl := slice.bitset_to_enum_slice(flag_buf[:], bs)
|
||||||
@(require_results)
|
@(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
|
count := 0
|
||||||
for v in bs {
|
for v in bs {
|
||||||
buf[count] = v
|
buf[count] = v
|
||||||
count += 1
|
count += 1
|
||||||
}
|
}
|
||||||
return buf[:count]
|
return buf[:count]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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}
|
||||||
Reference in New Issue
Block a user