1111#include < numeric>
1212
1313template <typename T>
14- X86_SIMD_SORT_INLINE void std_argselect_withnan (
15- T *arr, arrsize_t *arg, arrsize_t k, arrsize_t left, arrsize_t right)
14+ X86_SIMD_SORT_INLINE void std_argselect_withnan (const T *arr,
15+ arrsize_t *arg,
16+ arrsize_t k,
17+ arrsize_t left,
18+ arrsize_t right)
1619{
1720 std::nth_element (arg + left,
1821 arg + k,
@@ -32,8 +35,10 @@ X86_SIMD_SORT_INLINE void std_argselect_withnan(
3235
3336/* argsort using std::sort */
3437template <typename T>
35- X86_SIMD_SORT_INLINE void
36- std_argsort_withnan (T *arr, arrsize_t *arg, arrsize_t left, arrsize_t right)
38+ X86_SIMD_SORT_INLINE void std_argsort_withnan (const T *arr,
39+ arrsize_t *arg,
40+ arrsize_t left,
41+ arrsize_t right)
3742{
3843 std::sort (arg + left,
3944 arg + right,
@@ -53,7 +58,7 @@ std_argsort_withnan(T *arr, arrsize_t *arg, arrsize_t left, arrsize_t right)
5358/* argsort using std::sort */
5459template <typename T>
5560X86_SIMD_SORT_INLINE void
56- std_argsort (T *arr, arrsize_t *arg, arrsize_t left, arrsize_t right)
61+ std_argsort (const T *arr, arrsize_t *arg, arrsize_t left, arrsize_t right)
5762{
5863 std::sort (arg + left,
5964 arg + right,
@@ -172,7 +177,7 @@ X86_SIMD_SORT_INLINE int32_t partition_vec(type_t *arg,
172177 * last element that is less than equal to the pivot.
173178 */
174179template <typename vtype, typename argtype, typename type_t >
175- X86_SIMD_SORT_INLINE arrsize_t argpartition (type_t *arr,
180+ X86_SIMD_SORT_INLINE arrsize_t argpartition (const type_t *arr,
176181 arrsize_t *arg,
177182 arrsize_t left,
178183 arrsize_t right,
@@ -291,7 +296,7 @@ template <typename vtype,
291296 typename argtype,
292297 int num_unroll,
293298 typename type_t = typename vtype::type_t >
294- X86_SIMD_SORT_INLINE arrsize_t argpartition_unrolled (type_t *arr,
299+ X86_SIMD_SORT_INLINE arrsize_t argpartition_unrolled (const type_t *arr,
295300 arrsize_t *arg,
296301 arrsize_t left,
297302 arrsize_t right,
@@ -422,7 +427,7 @@ X86_SIMD_SORT_INLINE arrsize_t argpartition_unrolled(type_t *arr,
422427}
423428
424429template <typename vtype, typename type_t >
425- X86_SIMD_SORT_INLINE type_t get_pivot_64bit (type_t *arr,
430+ X86_SIMD_SORT_INLINE type_t get_pivot_64bit (const type_t *arr,
426431 arrsize_t *arg,
427432 const arrsize_t left,
428433 const arrsize_t right)
@@ -468,7 +473,7 @@ X86_SIMD_SORT_INLINE type_t get_pivot_64bit(type_t *arr,
468473}
469474
470475template <typename vtype, typename argtype, typename type_t >
471- X86_SIMD_SORT_INLINE void argsort_ (type_t *arr,
476+ X86_SIMD_SORT_INLINE void argsort_ (const type_t *arr,
472477 arrsize_t *arg,
473478 arrsize_t left,
474479 arrsize_t right,
@@ -549,7 +554,7 @@ X86_SIMD_SORT_INLINE void argsort_(type_t *arr,
549554}
550555
551556template <typename vtype, typename argtype, typename type_t >
552- X86_SIMD_SORT_INLINE void argselect_ (type_t *arr,
557+ X86_SIMD_SORT_INLINE void argselect_ (const type_t *arr,
553558 arrsize_t *arg,
554559 arrsize_t pos,
555560 arrsize_t left,
@@ -590,7 +595,7 @@ template <typename T,
590595 typename full_vector,
591596 template <typename ...>
592597 typename half_vector>
593- X86_SIMD_SORT_INLINE void xss_argsort (T *arr,
598+ X86_SIMD_SORT_INLINE void xss_argsort (const T *arr,
594599 arrsize_t *arg,
595600 arrsize_t arrsize,
596601 bool hasnan = false ,
@@ -669,29 +674,25 @@ X86_SIMD_SORT_INLINE void xss_argsort(T *arr,
669674}
670675
671676template <typename T>
672- X86_SIMD_SORT_INLINE void avx512_argsort (T *arr,
677+ X86_SIMD_SORT_INLINE void avx512_argsort (const T *arr,
673678 arrsize_t *arg,
674679 arrsize_t arrsize,
675680 bool hasnan = false ,
676681 bool descending = false )
677682{
678- // Safe: argsort never mutates arr; const is dropped only for SIMD type instantiation
679- using base_t = std::remove_const_t <T>;
680- xss_argsort<base_t , zmm_vector, ymm_vector>(
681- const_cast <base_t *>(arr), arg, arrsize, hasnan, descending);
683+ xss_argsort<T, zmm_vector, ymm_vector>(
684+ arr, arg, arrsize, hasnan, descending);
682685}
683686
684687template <typename T>
685- X86_SIMD_SORT_INLINE void avx2_argsort (T *arr,
688+ X86_SIMD_SORT_INLINE void avx2_argsort (const T *arr,
686689 arrsize_t *arg,
687690 arrsize_t arrsize,
688691 bool hasnan = false ,
689692 bool descending = false )
690693{
691- // Safe: argsort never mutates arr; const is dropped only for SIMD type instantiation
692- using base_t = std::remove_const_t <T>;
693- xss_argsort<base_t , avx2_vector, avx2_half_vector>(
694- const_cast <base_t *>(arr), arg, arrsize, hasnan, descending);
694+ xss_argsort<T, avx2_vector, avx2_half_vector>(
695+ arr, arg, arrsize, hasnan, descending);
695696}
696697
697698/* argselect methods for 32-bit and 64-bit dtypes */
@@ -700,7 +701,7 @@ template <typename T,
700701 typename full_vector,
701702 template <typename ...>
702703 typename half_vector>
703- X86_SIMD_SORT_INLINE void xss_argselect (T *arr,
704+ X86_SIMD_SORT_INLINE void xss_argselect (const T *arr,
704705 arrsize_t *arg,
705706 arrsize_t k,
706707 arrsize_t arrsize,
@@ -735,29 +736,24 @@ X86_SIMD_SORT_INLINE void xss_argselect(T *arr,
735736}
736737
737738template <typename T>
738- X86_SIMD_SORT_INLINE void avx512_argselect (T *arr,
739+ X86_SIMD_SORT_INLINE void avx512_argselect (const T *arr,
739740 arrsize_t *arg,
740741 arrsize_t k,
741742 arrsize_t arrsize,
742743 bool hasnan = false )
743744{
744- // Safe: argselect never mutates arr; const is dropped only for SIMD type instantiation
745- using base_t = std::remove_const_t <T>;
746- xss_argselect<base_t , zmm_vector, ymm_vector>(
747- const_cast <base_t *>(arr), arg, k, arrsize, hasnan);
745+ xss_argselect<T, zmm_vector, ymm_vector>(arr, arg, k, arrsize, hasnan);
748746}
749747
750748template <typename T>
751- X86_SIMD_SORT_INLINE void avx2_argselect (T *arr,
749+ X86_SIMD_SORT_INLINE void avx2_argselect (const T *arr,
752750 arrsize_t *arg,
753751 arrsize_t k,
754752 arrsize_t arrsize,
755753 bool hasnan = false )
756754{
757- // Safe: argselect never mutates arr; const is dropped only for SIMD type instantiation
758- using base_t = std::remove_const_t <T>;
759- xss_argselect<base_t , avx2_vector, avx2_half_vector>(
760- const_cast <base_t *>(arr), arg, k, arrsize, hasnan);
755+ xss_argselect<T, avx2_vector, avx2_half_vector>(
756+ arr, arg, k, arrsize, hasnan);
761757}
762758
763759#endif // XSS_COMMON_ARGSORT
0 commit comments