[libcxx-commits] [libcxx] [libcxx][algorithm] Optimize std::stable_sort via radix sort algorithm (PR #104683)
Дмитрий Изволов via libcxx-commits
libcxx-commits at lists.llvm.org
Sat Dec 7 00:35:33 PST 2024
================
@@ -212,6 +240,22 @@ void __stable_sort(_RandomAccessIterator __first,
std::__insertion_sort<_AlgPolicy, _Compare>(__first, __last, __comp);
return;
}
+
+#if _LIBCPP_STD_VER >= 17
+ constexpr auto __default_comp =
+ __desugars_to_v<__totally_ordered_less_tag, __remove_cvref_t<_Compare>, value_type, value_type >;
+ constexpr auto __integral_value =
+ is_integral_v<value_type > && is_same_v< value_type&, __iter_reference<_RandomAccessIterator>>;
+ constexpr auto __allowed_radix_sort = __default_comp && __integral_value;
+ if constexpr (__allowed_radix_sort) {
+ if (__len <= __buff_size && __len >= static_cast<difference_type>(__radix_sort_min_bound<value_type>()) &&
+ __len <= static_cast<difference_type>(__radix_sort_max_bound<value_type>())) {
+ std::__radix_sort(__first, __last, __buff);
----------------
izvolov wrote:
I've extented test cases so we test both `int` and `float` arrays of sizes relevant to radix sort to ensure that both branches are covered.
https://github.com/llvm/llvm-project/pull/104683
More information about the libcxx-commits
mailing list