Skip to content

Commit ee8899b

Browse files
committed
dispatch-locally
1 parent 154e022 commit ee8899b

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
@@ -22,11 +22,11 @@
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

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

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

Comments
 (0)