From a61d8daec1eb8f5f22a6190d1b51e784faed8bdf Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 9 May 2024 17:44:05 +0200 Subject: [PATCH 1/4] Add make version of bitset to slice. --- core/slice/slice.odin | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/core/slice/slice.odin b/core/slice/slice.odin index 170e4cbf3..6cb844b40 100644 --- a/core/slice/slice.odin +++ b/core/slice/slice.odin @@ -717,11 +717,27 @@ 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(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] +} + +bitset_to_enum_slice :: proc{bitset_to_enum_slice_with_make, bitset_to_enum_slice_with_buffer} \ No newline at end of file From 858c78b8448dc76025fa5e3dc0f9e0bb6b63834e Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 9 May 2024 17:47:19 +0200 Subject: [PATCH 2/4] Pass new -vet-style check. --- core/slice/slice.odin | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/core/slice/slice.odin b/core/slice/slice.odin index 6cb844b40..606feb22e 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,7 +717,7 @@ 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_with_buffer :: 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 @@ -730,14 +730,19 @@ bitset_to_enum_slice_with_buffer :: proc(buf: []$E, bs: $T) -> (slice: []E) wher // e.g.: // sl := slice.bitset_to_enum_slice(bs) @(require_results) -bitset_to_enum_slice_with_make :: 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_make :: proc(bs: $T, $E: typeid) -> (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 + for _ in bs { count += 1 } - return buf[:count] + slice = make([]E, count) + + i := 0 + for v in bs { + slice[i] = v + i += 1 + } + return } bitset_to_enum_slice :: proc{bitset_to_enum_slice_with_make, bitset_to_enum_slice_with_buffer} \ No newline at end of file From e5af98eabecc820a43f675fc7e57630fddb718a0 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 9 May 2024 17:55:50 +0200 Subject: [PATCH 3/4] Simplify bitset_to_enum_slice --- core/slice/slice.odin | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/core/slice/slice.odin b/core/slice/slice.odin index 606feb22e..fff901cff 100644 --- a/core/slice/slice.odin +++ b/core/slice/slice.odin @@ -731,18 +731,9 @@ bitset_to_enum_slice_with_buffer :: proc(buf: []$E, bs: $T) -> (slice: []E) wher // sl := slice.bitset_to_enum_slice(bs) @(require_results) bitset_to_enum_slice_with_make :: proc(bs: $T, $E: typeid) -> (slice: []E) where intrinsics.type_is_enum(E), intrinsics.type_bit_set_elem_type(T) == E { - count := 0 - for _ in bs { - count += 1 - } - slice = make([]E, count) - - i := 0 - for v in bs { - slice[i] = v - i += 1 - } - return + ones := intrinsics.count_ones(transmute(E)bs) + buf := make([]E, int(ones)) + 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 From 8f706a14f84d65b9c543976c3c33bbe60129ae9d Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 9 May 2024 17:58:48 +0200 Subject: [PATCH 4/4] Add allocator param. --- core/slice/slice.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/slice/slice.odin b/core/slice/slice.odin index fff901cff..03791e7dd 100644 --- a/core/slice/slice.odin +++ b/core/slice/slice.odin @@ -730,9 +730,9 @@ bitset_to_enum_slice_with_buffer :: proc(buf: []$E, bs: $T) -> (slice: []E) wher // e.g.: // sl := slice.bitset_to_enum_slice(bs) @(require_results) -bitset_to_enum_slice_with_make :: proc(bs: $T, $E: typeid) -> (slice: []E) where intrinsics.type_is_enum(E), intrinsics.type_bit_set_elem_type(T) == E { +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)) + buf := make([]E, int(ones), allocator) return bitset_to_enum_slice(buf, bs) }