Skip to content

Commit 6e973ad

Browse files
committed
dispatch-locally
1 parent eaf9847 commit 6e973ad

File tree

3 files changed

+43
-93
lines changed

3 files changed

+43
-93
lines changed

libcxx/include/__algorithm/radix_sort.h

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -323,30 +323,6 @@ __radix_sort(_RandomAccessIterator1 __first, _RandomAccessIterator1 __last, _Ran
323323
std::__radix_sort(__first, __last, __buffer, __identity{}, __low_byte_fn{});
324324
}
325325

326-
template <class _RandomAccessIterator1, class _RandomAccessIterator2>
327-
_LIBCPP_HIDE_FROM_ABI bool
328-
__radix_sort(_RandomAccessIterator1 __first,
329-
_RandomAccessIterator1 __last,
330-
_RandomAccessIterator2 __buffer,
331-
_BoolConstant<true>) {
332-
std::__radix_sort(__first, __last, __buffer, __identity{}, __low_byte_fn{});
333-
return true;
334-
}
335-
336-
template <class _RandomAccessIterator1, class _RandomAccessIterator2>
337-
_LIBCPP_HIDE_FROM_ABI bool
338-
__radix_sort(_RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2, _BoolConstant<false>) {
339-
return false;
340-
}
341-
342-
#else // _LIBCPP_STD_VER > 14
343-
344-
template <class _RandomAccessIterator1, class _RandomAccessIterator2, bool _EnableRadixSort>
345-
_LIBCPP_HIDE_FROM_ABI bool
346-
__radix_sort(_RandomAccessIterator1, _RandomAccessIterator1, _RandomAccessIterator2, _BoolConstant<_EnableRadixSort>) {
347-
return false;
348-
}
349-
350326
#endif // _LIBCPP_STD_VER > 14
351327

352328
_LIBCPP_END_NAMESPACE_STD

libcxx/include/__algorithm/ranges_stable_sort.h

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@
2424
#include <__ranges/access.h>
2525
#include <__ranges/concepts.h>
2626
#include <__ranges/dangling.h>
27-
#include <__type_traits/desugars_to.h>
28-
#include <__type_traits/is_integral.h>
2927
#include <__utility/forward.h>
3028
#include <__utility/move.h>
3129

@@ -47,19 +45,7 @@ struct __stable_sort {
4745
auto __last_iter = ranges::next(__first, __last);
4846

4947
auto&& __projected_comp = std::__make_projected(__comp, __proj);
50-
constexpr auto __default_comp =
51-
__desugars_to_v<__totally_ordered_less_tag, _Comp, iter_value_t<_Iter>, iter_value_t<_Iter> >;
52-
constexpr auto __default_proj = __is_identity<_Proj>::value;
53-
constexpr auto __integral_value = is_integral_v<iter_value_t<_Iter>>;
54-
constexpr auto __integral_projection = __default_proj && __integral_value;
55-
// constexpr auto __integral_projection = is_integral_v<remove_reference_t<invoke_result_t<_Proj&,
56-
// iter_value_t<_Iter>>>>;
57-
// TODO: Support projection in stable_sort
58-
std::__stable_sort_impl<_RangeAlgPolicy>(
59-
std::move(__first),
60-
__last_iter,
61-
__projected_comp,
62-
_BoolConstant < __default_comp && __integral_projection > {});
48+
std::__stable_sort_impl<_RangeAlgPolicy>(std::move(__first), __last_iter, __projected_comp);
6349

6450
return __last_iter;
6551
}

libcxx/include/__algorithm/stable_sort.h

Lines changed: 42 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@
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

297292
template <class _RandomAccessIterator, class _Compare>
298293
inline _LIBCPP_HIDE_FROM_ABI void
299294
stable_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

303298
template <class _RandomAccessIterator>
304299
inline _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

Comments
 (0)