2222#include < __memory/destruct_n.h>
2323#include < __memory/unique_ptr.h>
2424#include < __memory/unique_temporary_buffer.h>
25+ #include < __type_traits/desugars_to.h>
2526#include < __type_traits/enable_if.h>
26- #include < __type_traits/integral_constant.h>
2727#include < __type_traits/is_integral.h>
28- #include < __type_traits/is_same.h>
2928#include < __type_traits/is_trivially_assignable.h>
29+ #include < __type_traits/remove_cvref.h>
3030#include < __utility/move.h>
3131#include < __utility/pair.h>
3232#include < new>
@@ -139,24 +139,20 @@ _LIBCPP_HIDE_FROM_ABI void __merge_move_assign(
139139 *__result = _Ops::__iter_move (__first2);
140140}
141141
142- template <class _AlgPolicy , class _Compare , class _RandomAccessIterator , bool _EnableRadixSort>
143- void __stable_sort (
144- _RandomAccessIterator __first,
145- _RandomAccessIterator __last,
146- _Compare __comp,
147- typename iterator_traits<_RandomAccessIterator>::difference_type __len,
148- typename iterator_traits<_RandomAccessIterator>::value_type* __buff,
149- ptrdiff_t __buff_size,
150- _BoolConstant<_EnableRadixSort>);
142+ template <class _AlgPolicy , class _Compare , class _RandomAccessIterator >
143+ void __stable_sort (_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);
151149
152- template <class _AlgPolicy , class _Compare , class _RandomAccessIterator , bool _EnableRadixSort>
153- void __stable_sort_move (
154- _RandomAccessIterator __first1,
155- _RandomAccessIterator __last1,
156- _Compare __comp,
157- typename iterator_traits<_RandomAccessIterator>::difference_type __len,
158- typename iterator_traits<_RandomAccessIterator>::value_type* __first2,
159- _BoolConstant<_EnableRadixSort> __rs) {
150+ template <class _AlgPolicy , class _Compare , class _RandomAccessIterator >
151+ void __stable_sort_move (_RandomAccessIterator __first1,
152+ _RandomAccessIterator __last1,
153+ _Compare __comp,
154+ typename iterator_traits<_RandomAccessIterator>::difference_type __len,
155+ typename iterator_traits<_RandomAccessIterator>::value_type* __first2) {
160156 using _Ops = _IterOps<_AlgPolicy>;
161157
162158 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
@@ -189,8 +185,8 @@ void __stable_sort_move(
189185 }
190186 typename iterator_traits<_RandomAccessIterator>::difference_type __l2 = __len / 2 ;
191187 _RandomAccessIterator __m = __first1 + __l2;
192- std::__stable_sort<_AlgPolicy, _Compare>(__first1, __m, __comp, __l2, __first2, __l2, __rs );
193- std::__stable_sort<_AlgPolicy, _Compare>(__m, __last1, __comp, __len - __l2, __first2 + __l2, __len - __l2, __rs );
188+ std::__stable_sort<_AlgPolicy, _Compare>(__first1, __m, __comp, __l2, __first2, __l2);
189+ std::__stable_sort<_AlgPolicy, _Compare>(__m, __last1, __comp, __len - __l2, __first2 + __l2, __len - __l2);
194190 std::__merge_move_construct<_AlgPolicy, _Compare>(__first1, __m, __m, __last1, __first2, __comp);
195191}
196192
@@ -219,15 +215,13 @@ struct __radix_sort_max_switch<_Int64, __enable_if_t<is_integral<_Int64>::value
219215 static const unsigned value = (1 << 15 );
220216};
221217
222- template <class _AlgPolicy , class _Compare , class _RandomAccessIterator , bool _EnableRadixSort>
223- void __stable_sort (
224- _RandomAccessIterator __first,
225- _RandomAccessIterator __last,
226- _Compare __comp,
227- typename iterator_traits<_RandomAccessIterator>::difference_type __len,
228- typename iterator_traits<_RandomAccessIterator>::value_type* __buff,
229- ptrdiff_t __buff_size,
230- _BoolConstant<_EnableRadixSort> __rs) {
218+ template <class _AlgPolicy , class _Compare , class _RandomAccessIterator >
219+ void __stable_sort (_RandomAccessIterator __first,
220+ _RandomAccessIterator __last,
221+ _Compare __comp,
222+ typename iterator_traits<_RandomAccessIterator>::difference_type __len,
223+ typename iterator_traits<_RandomAccessIterator>::value_type* __buff,
224+ ptrdiff_t __buff_size) {
231225 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
232226 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
233227 switch (__len) {
@@ -243,9 +237,14 @@ void __stable_sort(
243237 std::__insertion_sort<_AlgPolicy, _Compare>(__first, __last, __comp);
244238 return ;
245239 }
246- if (__len <= __buff_size && __len >= static_cast <difference_type>(__radix_sort_min_switch<value_type>::value) &&
247- __len <= static_cast <difference_type>(__radix_sort_max_switch<value_type>::value)) {
248- if (std::__radix_sort (__first, __last, __buff, __rs)) {
240+ constexpr auto __default_comp =
241+ __desugars_to_v<__totally_ordered_less_tag, __remove_cvref_t <_Compare>, value_type, value_type >;
242+ constexpr auto __integral_value = is_integral_v<value_type >;
243+ constexpr auto __allowed_radix_sort = __default_comp && __integral_value;
244+ if constexpr (__allowed_radix_sort) {
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+ std::__radix_sort (__first, __last, __buff);
249248 return ;
250249 }
251250 }
@@ -254,9 +253,9 @@ void __stable_sort(
254253 if (__len <= __buff_size) {
255254 __destruct_n __d (0 );
256255 unique_ptr<value_type, __destruct_n&> __h2 (__buff, __d);
257- std::__stable_sort_move<_AlgPolicy, _Compare>(__first, __m, __comp, __l2, __buff, __rs );
256+ std::__stable_sort_move<_AlgPolicy, _Compare>(__first, __m, __comp, __l2, __buff);
258257 __d.__set (__l2, (value_type*)nullptr );
259- std::__stable_sort_move<_AlgPolicy, _Compare>(__m, __last, __comp, __len - __l2, __buff + __l2, __rs );
258+ std::__stable_sort_move<_AlgPolicy, _Compare>(__m, __last, __comp, __len - __l2, __buff + __l2);
260259 __d.__set (__len, (value_type*)nullptr );
261260 std::__merge_move_assign<_AlgPolicy, _Compare>(
262261 __buff, __buff + __l2, __buff + __l2, __buff + __len, __first, __comp);
@@ -267,17 +266,14 @@ void __stable_sort(
267266 // __first, __comp);
268267 return ;
269268 }
270- std::__stable_sort<_AlgPolicy, _Compare>(__first, __m, __comp, __l2, __buff, __buff_size, __rs );
271- std::__stable_sort<_AlgPolicy, _Compare>(__m, __last, __comp, __len - __l2, __buff, __buff_size, __rs );
269+ std::__stable_sort<_AlgPolicy, _Compare>(__first, __m, __comp, __l2, __buff, __buff_size);
270+ std::__stable_sort<_AlgPolicy, _Compare>(__m, __last, __comp, __len - __l2, __buff, __buff_size);
272271 std::__inplace_merge<_AlgPolicy>(__first, __m, __last, __comp, __l2, __len - __l2, __buff, __buff_size);
273272}
274273
275- template <class _AlgPolicy , class _RandomAccessIterator , class _Compare , bool _EnableRadixSort = false >
276- inline _LIBCPP_HIDE_FROM_ABI void __stable_sort_impl (
277- _RandomAccessIterator __first,
278- _RandomAccessIterator __last,
279- _Compare& __comp,
280- _BoolConstant<_EnableRadixSort> __rs = _BoolConstant<false >()) {
274+ template <class _AlgPolicy , class _RandomAccessIterator , class _Compare >
275+ inline _LIBCPP_HIDE_FROM_ABI void
276+ __stable_sort_impl (_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare& __comp) {
281277 using value_type = typename iterator_traits<_RandomAccessIterator>::value_type;
282278 using difference_type = typename iterator_traits<_RandomAccessIterator>::difference_type;
283279
@@ -290,27 +286,19 @@ inline _LIBCPP_HIDE_FROM_ABI void __stable_sort_impl(
290286 __buf.second = __unique_buf.get_deleter ().__count_ ;
291287 }
292288
293- std::__stable_sort<_AlgPolicy, __comp_ref_type<_Compare> >(
294- __first, __last, __comp, __len, __buf.first , __buf.second , __rs);
289+ std::__stable_sort<_AlgPolicy, __comp_ref_type<_Compare> >(__first, __last, __comp, __len, __buf.first , __buf.second );
295290 std::__check_strict_weak_ordering_sorted (__first, __last, __comp);
296291}
297292
298293template <class _RandomAccessIterator , class _Compare >
299294inline _LIBCPP_HIDE_FROM_ABI void
300295stable_sort (_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) {
301- std::__stable_sort_impl<_ClassicAlgPolicy>(std::move (__first), std::move (__last), __comp, _BoolConstant< false >() );
296+ std::__stable_sort_impl<_ClassicAlgPolicy>(std::move (__first), std::move (__last), __comp);
302297}
303298
304299template <class _RandomAccessIterator >
305300inline _LIBCPP_HIDE_FROM_ABI void stable_sort (_RandomAccessIterator __first, _RandomAccessIterator __last) {
306- using value_type = typename iterator_traits<_RandomAccessIterator>::value_type;
307- using reference_type = typename iterator_traits<_RandomAccessIterator>::reference;
308- auto __comp = __less<>();
309- std::__stable_sort_impl<_ClassicAlgPolicy>(
310- std::move (__first),
311- std::move (__last),
312- __comp,
313- _BoolConstant < is_integral<value_type>::value && is_same<value_type&, reference_type>::value > ());
301+ std::stable_sort (__first, __last, __less<>());
314302}
315303
316304_LIBCPP_END_NAMESPACE_STD
0 commit comments