Skip to content

Commit 1891087

Browse files
author
Raghuveer Devulapalli
committed
Make object_qsort fully generic in arrsize type
- Change arrsize parameter and all related indexing/size variables in object_qsort to use a template parameter ArrSize instead of fixed-size types. - Add static_asserts to ensure ArrSize and key_func return type are either 32-bit or 64-bit. - Change the type of the arg vector from uint32_t to ArrSize for consistency and correctness.
1 parent 61c47d7 commit 1891087

File tree

1 file changed

+13
-10
lines changed

1 file changed

+13
-10
lines changed

lib/x86simdsort.h

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -70,29 +70,32 @@ XSS_EXPORT_SYMBOL void keyvalue_partial_sort(T1 *key,
7070
bool descending = false);
7171

7272
// sort an object
73-
template <typename T, typename Func>
74-
XSS_EXPORT_SYMBOL void object_qsort(T *arr, uint32_t arrsize, Func key_func)
73+
template <typename T, typename U, typename Func>
74+
XSS_EXPORT_SYMBOL void object_qsort(T *arr, U arrsize, Func key_func)
7575
{
76-
/* (1) Create a vector a keys */
77-
using return_type_of =
78-
typename decltype(std::function {key_func})::result_type;
76+
static_assert(std::is_integral<U>::value, "arrsize must be an integral type");
77+
static_assert(sizeof(U) == sizeof(int32_t) || sizeof(U) == sizeof(int64_t),
78+
"arrsize must be 32 or 64 bits");
79+
using return_type_of = typename decltype(std::function{key_func})::result_type;
80+
static_assert(sizeof(return_type_of) == sizeof(int32_t) || sizeof(return_type_of) == sizeof(int64_t),
81+
"key_func return type must be 32 or 64 bits");
7982
std::vector<return_type_of> keys(arrsize);
80-
for (size_t ii = 0; ii < arrsize; ++ii) {
83+
for (U ii = 0; ii < arrsize; ++ii) {
8184
keys[ii] = key_func(arr[ii]);
8285
}
8386

8487
/* (2) Call arg based on keys using the keyvalue sort */
85-
std::vector<uint32_t> arg(arrsize);
88+
std::vector<U> arg(arrsize);
8689
std::iota(arg.begin(), arg.end(), 0);
8790
x86simdsort::keyvalue_qsort(keys.data(), arg.data(), arrsize);
8891

8992
/* (3) Permute obj array in-place */
9093
std::vector<bool> done(arrsize);
91-
for (size_t i = 0; i < arrsize; ++i) {
94+
for (U i = 0; i < arrsize; ++i) {
9295
if (done[i]) { continue; }
9396
done[i] = true;
94-
size_t prev_j = i;
95-
size_t j = arg[i];
97+
U prev_j = i;
98+
U j = arg[i];
9699
while (i != j) {
97100
std::swap(arr[prev_j], arr[j]);
98101
done[j] = true;

0 commit comments

Comments
 (0)