Browse Source

Simplify bitset_to_enum_slice

Jeroen van Rijn 1 year ago
parent
commit
e5af98eabe
1 changed files with 3 additions and 12 deletions
  1. 3 12
      core/slice/slice.odin

+ 3 - 12
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)
 //    sl := slice.bitset_to_enum_slice(bs)
 @(require_results)
 @(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) -> (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}
 bitset_to_enum_slice :: proc{bitset_to_enum_slice_with_make, bitset_to_enum_slice_with_buffer}