aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhil <homan.phil@gmail.com>2022-09-01 12:32:33 -0700
committerPhil <homan.phil@gmail.com>2022-09-01 12:32:33 -0700
commit63eec25044d1abc6665ce8409c21e6d58e6aca8a (patch)
treeb1030630d34dd22e9d25f9e91b12843772b9d005
parent7a9b0731cf6e57043c46b8cf4e7b4dba0e4af7c1 (diff)
add sort_by_indices overload and test
-rw-r--r--core/slice/sort.odin12
-rw-r--r--tests/core/slice/test_core_slice.odin16
2 files changed, 27 insertions, 1 deletions
diff --git a/core/slice/sort.odin b/core/slice/sort.odin
index 01d762ad7..8020cede7 100644
--- a/core/slice/sort.odin
+++ b/core/slice/sort.odin
@@ -39,7 +39,9 @@ sort :: proc(data: $T/[]$E) where ORD(E) {
}
-sort_by_indices :: proc(data: $T/[]$E, indices: []int, allocator := context.allocator) -> (sorted: T) {
+sort_by_indices :: proc{ sort_by_indices_allocate, _sort_by_indices}
+
+sort_by_indices_allocate :: proc(data: $T/[]$E, indices: []int, allocator := context.allocator) -> (sorted: T) {
assert(len(data) == len(indices))
sorted = make([]int, len(data), allocator)
for v, i in indices {
@@ -48,6 +50,14 @@ sort_by_indices :: proc(data: $T/[]$E, indices: []int, allocator := context.allo
return
}
+_sort_by_indices :: proc(data, sorted: $T/[]$E, indices: []int) {
+ assert(len(data) == len(indices))
+ assert(len(data) == len(sorted))
+ for v, i in indices {
+ sorted[i] = data[v]
+ }
+}
+
sort_by_indices_overwrite :: proc(data: $T/[]$E, indices: []int) {
assert(len(data) == len(indices))
temp := make([]int, len(data), context.allocator)
diff --git a/tests/core/slice/test_core_slice.odin b/tests/core/slice/test_core_slice.odin
index fb13364fd..8ef3af869 100644
--- a/tests/core/slice/test_core_slice.odin
+++ b/tests/core/slice/test_core_slice.odin
@@ -155,5 +155,21 @@ test_sort_by_indices :: proc(t: ^testing.T) {
}
}
}
+ {
+ indices := make([]int, test_size)
+ swap := make([]int, test_size)
+ for _, i in indices {
+ indices[i] = i
+ }
+
+ slice.sort_by_indices(indices, swap, f_idx)
+ for v, i in swap {
+ idx_pass := v == f_idx[i]
+ expect(t, idx_pass, "Expected the sorted index to be the same as the result from sort_with_indices")
+ if !idx_pass {
+ break
+ }
+ }
+ }
}
}