2121#include < __memory/destruct_n.h>
2222#include < __memory/unique_ptr.h>
2323#include < __memory/unique_temporary_buffer.h>
24+ #include < __type_traits/desugars_to.h>
2425#include < __type_traits/enable_if.h>
25- #include < __type_traits/integral_constant.h>
2626#include < __type_traits/is_integral.h>
27- #include < __type_traits/is_same.h>
2827#include < __type_traits/is_trivially_assignable.h>
28+ #include < __type_traits/remove_cvref.h>
2929#include < __utility/move.h>
3030#include < __utility/pair.h>
3131#include < new>
@@ -138,24 +138,20 @@ _LIBCPP_HIDE_FROM_ABI void __merge_move_assign(
138138 *__result = _Ops::__iter_move (__first2);
139139}
140140
141- template <class _AlgPolicy , class _Compare , class _RandomAccessIterator , bool _EnableRadixSort>
142- void __stable_sort (
143- _RandomAccessIterator __first,
144- _RandomAccessIterator __last,
145- _Compare __comp,
146- typename iterator_traits<_RandomAccessIterator>::difference_type __len,
147- typename iterator_traits<_RandomAccessIterator>::value_type* __buff,
148- ptrdiff_t __buff_size,
149- _BoolConstant<_EnableRadixSort>);
141+ template <class _AlgPolicy , class _Compare , class _RandomAccessIterator >
142+ void __stable_sort (_RandomAccessIterator __first,
143+ _RandomAccessIterator __last,
144+ _Compare __comp,
145+ typename iterator_traits<_RandomAccessIterator>::difference_type __len,
146+ typename iterator_traits<_RandomAccessIterator>::value_type* __buff,
147+ ptrdiff_t __buff_size);
150148
151- template <class _AlgPolicy , class _Compare , class _RandomAccessIterator , bool _EnableRadixSort>
152- void __stable_sort_move (
153- _RandomAccessIterator __first1,
154- _RandomAccessIterator __last1,
155- _Compare __comp,
156- typename iterator_traits<_RandomAccessIterator>::difference_type __len,
157- typename iterator_traits<_RandomAccessIterator>::value_type* __first2,
158- _BoolConstant<_EnableRadixSort> __rs) {
149+ template <class _AlgPolicy , class _Compare , class _RandomAccessIterator >
150+ void __stable_sort_move (_RandomAccessIterator __first1,
151+ _RandomAccessIterator __last1,
152+ _Compare __comp,
153+ typename iterator_traits<_RandomAccessIterator>::difference_type __len,
154+ typename iterator_traits<_RandomAccessIterator>::value_type* __first2) {
159155 using _Ops = _IterOps<_AlgPolicy>;
160156
161157 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
@@ -188,8 +184,8 @@ void __stable_sort_move(
188184 }
189185 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2 ;
190186 _RandomAccessIterator __m = __first1 + __l2;
191- std::__stable_sort<_AlgPolicy, _Compare>(__first1, __m, __comp, __l2, __first2, __l2, __rs );
192- std::__stable_sort<_AlgPolicy, _Compare>(__m, __last1, __comp, __len - __l2, __first2 + __l2, __len - __l2, __rs );
187+ std::__stable_sort<_AlgPolicy, _Compare>(__first1, __m, __comp, __l2, __first2, __l2);
188+ std::__stable_sort<_AlgPolicy, _Compare>(__m, __last1, __comp, __len - __l2, __first2 + __l2, __len - __l2);
193189 std::__merge_move_construct<_AlgPolicy, _Compare>(__first1, __m, __m, __last1, __first2, __comp);
194190}
195191
@@ -218,15 +214,13 @@ struct __radix_sort_max_switch<_Int64, __enable_if_t<is_integral<_Int64>::value
218214 static const unsigned value = (1 << 15 );
219215};
220216
221- template <class _AlgPolicy , class _Compare , class _RandomAccessIterator , bool _EnableRadixSort>
222- void __stable_sort (
223- _RandomAccessIterator __first,
224- _RandomAccessIterator __last,
225- _Compare __comp,
226- typename iterator_traits<_RandomAccessIterator>::difference_type __len,
227- typename iterator_traits<_RandomAccessIterator>::value_type* __buff,
228- ptrdiff_t __buff_size,
229- _BoolConstant<_EnableRadixSort> __rs) {
217+ template <class _AlgPolicy , class _Compare , class _RandomAccessIterator >
218+ void __stable_sort (_RandomAccessIterator __first,
219+ _RandomAccessIterator __last,
220+ _Compare __comp,
221+ typename iterator_traits<_RandomAccessIterator>::difference_type __len,
222+ typename iterator_traits<_RandomAccessIterator>::value_type* __buff,
223+ ptrdiff_t __buff_size) {
230224 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
231225 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
232226 switch (__len) {
@@ -242,9 +236,14 @@ void __stable_sort(
242236 std::__insertion_sort<_AlgPolicy, _Compare>(__first, __last, __comp);
243237 return ;
244238 }
245- if (__len <= __buff_size && __len >= static_cast <difference_type>(__radix_sort_min_switch<value_type>::value) &&
246- __len <= static_cast <difference_type>(__radix_sort_max_switch<value_type>::value)) {
247- if (std::__radix_sort (__first, __last, __buff, __rs)) {
239+ constexpr auto __default_comp =
240+ __desugars_to_v<__totally_ordered_less_tag, __remove_cvref_t <_Compare>, value_type, value_type >;
241+ constexpr auto __integral_value = is_integral_v<value_type >;
242+ constexpr auto __allowed_radix_sort = __default_comp && __integral_value;
243+ if constexpr (__allowed_radix_sort) {
244+ if (__len <= __buff_size && __len >= static_cast <difference_type>(__radix_sort_min_switch<value_type>::value) &&
245+ __len <= static_cast <difference_type>(__radix_sort_max_switch<value_type>::value)) {
246+ std::__radix_sort (__first, __last, __buff);
248247 return ;
249248 }
250249 }
@@ -253,9 +252,9 @@ void __stable_sort(
253252 if (__len <= __buff_size) {
254253 __destruct_n __d (0 );
255254 unique_ptr<value_type, __destruct_n&> __h2 (__buff, __d);
256- std::__stable_sort_move<_AlgPolicy, _Compare>(__first, __m, __comp, __l2, __buff, __rs );
255+ std::__stable_sort_move<_AlgPolicy, _Compare>(__first, __m, __comp, __l2, __buff);
257256 __d.__set (__l2, (value_type*)nullptr );
258- std::__stable_sort_move<_AlgPolicy, _Compare>(__m, __last, __comp, __len - __l2, __buff + __l2, __rs );
257+ std::__stable_sort_move<_AlgPolicy, _Compare>(__m, __last, __comp, __len - __l2, __buff + __l2);
259258 __d.__set (__len, (value_type*)nullptr );
260259 std::__merge_move_assign<_AlgPolicy, _Compare>(
261260 __buff, __buff + __l2, __buff + __l2, __buff + __len, __first, __comp);
@@ -266,17 +265,14 @@ void __stable_sort(
266265 // __first, __comp);
267266 return ;
268267 }
269- std::__stable_sort<_AlgPolicy, _Compare>(__first, __m, __comp, __l2, __buff, __buff_size, __rs );
270- std::__stable_sort<_AlgPolicy, _Compare>(__m, __last, __comp, __len - __l2, __buff, __buff_size, __rs );
268+ std::__stable_sort<_AlgPolicy, _Compare>(__first, __m, __comp, __l2, __buff, __buff_size);
269+ std::__stable_sort<_AlgPolicy, _Compare>(__m, __last, __comp, __len - __l2, __buff, __buff_size);
271270 std::__inplace_merge<_AlgPolicy>(__first, __m, __last, __comp, __l2, __len - __l2, __buff, __buff_size);
272271}
273272
274- template <class _AlgPolicy , class _RandomAccessIterator , class _Compare , bool _EnableRadixSort = false >
275- inline _LIBCPP_HIDE_FROM_ABI void __stable_sort_impl (
276- _RandomAccessIterator __first,
277- _RandomAccessIterator __last,
278- _Compare& __comp,
279- _BoolConstant<_EnableRadixSort> __rs = _BoolConstant<false >()) {
273+ template <class _AlgPolicy , class _RandomAccessIterator , class _Compare >
274+ inline _LIBCPP_HIDE_FROM_ABI void
275+ __stable_sort_impl (_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare& __comp) {
280276 using value_type = typename iterator_traits<_RandomAccessIterator>::value_type;
281277 using difference_type = typename iterator_traits<_RandomAccessIterator>::difference_type;
282278
@@ -289,27 +285,19 @@ inline _LIBCPP_HIDE_FROM_ABI void __stable_sort_impl(
289285 __buf.second = __unique_buf.get_deleter ().__count_ ;
290286 }
291287
292- std::__stable_sort<_AlgPolicy, __comp_ref_type<_Compare> >(
293- __first, __last, __comp, __len, __buf.first , __buf.second , __rs);
288+ std::__stable_sort<_AlgPolicy, __comp_ref_type<_Compare> >(__first, __last, __comp, __len, __buf.first , __buf.second );
294289 std::__check_strict_weak_ordering_sorted (__first, __last, __comp);
295290}
296291
297292template <class _RandomAccessIterator , class _Compare >
298293inline _LIBCPP_HIDE_FROM_ABI void
299294stable_sort (_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) {
300- std::__stable_sort_impl<_ClassicAlgPolicy>(std::move (__first), std::move (__last), __comp, _BoolConstant< false >() );
295+ std::__stable_sort_impl<_ClassicAlgPolicy>(std::move (__first), std::move (__last), __comp);
301296}
302297
303298template <class _RandomAccessIterator >
304299inline _LIBCPP_HIDE_FROM_ABI void stable_sort (_RandomAccessIterator __first, _RandomAccessIterator __last) {
305- using value_type = typename iterator_traits<_RandomAccessIterator>::value_type;
306- using reference_type = typename iterator_traits<_RandomAccessIterator>::reference;
307- auto __comp = __less<>();
308- std::__stable_sort_impl<_ClassicAlgPolicy>(
309- std::move (__first),
310- std::move (__last),
311- __comp,
312- _BoolConstant < is_integral<value_type>::value && is_same<value_type&, reference_type>::value > ());
300+ std::stable_sort (__first, __last, __less<>());
313301}
314302
315303_LIBCPP_END_NAMESPACE_STD
0 commit comments