Skip to content

Commit 3c17883

Browse files
committed
constexpr stable sort; tests
1 parent 6ed2a6b commit 3c17883

File tree

5 files changed

+209
-104
lines changed

5 files changed

+209
-104
lines changed

libcxx/include/__algorithm/inplace_merge.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ template <class _AlgPolicy,
6767
class _InputIterator2,
6868
class _Sent2,
6969
class _OutputIterator>
70-
_LIBCPP_HIDE_FROM_ABI void __half_inplace_merge(
70+
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void __half_inplace_merge(
7171
_InputIterator1 __first1,
7272
_Sent1 __last1,
7373
_InputIterator2 __first2,
@@ -92,7 +92,7 @@ _LIBCPP_HIDE_FROM_ABI void __half_inplace_merge(
9292
}
9393

9494
template <class _AlgPolicy, class _Compare, class _BidirectionalIterator>
95-
_LIBCPP_HIDE_FROM_ABI void __buffered_inplace_merge(
95+
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void __buffered_inplace_merge(
9696
_BidirectionalIterator __first,
9797
_BidirectionalIterator __middle,
9898
_BidirectionalIterator __last,
@@ -123,7 +123,7 @@ _LIBCPP_HIDE_FROM_ABI void __buffered_inplace_merge(
123123
}
124124

125125
template <class _AlgPolicy, class _Compare, class _BidirectionalIterator>
126-
void __inplace_merge(
126+
_LIBCPP_CONSTEXPR_SINCE_CXX23 void __inplace_merge(
127127
_BidirectionalIterator __first,
128128
_BidirectionalIterator __middle,
129129
_BidirectionalIterator __last,

libcxx/include/__algorithm/sort.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ __selection_sort(_BidirectionalIterator __first, _BidirectionalIterator __last,
280280
// Sort the iterator range [__first, __last) using the comparator __comp using
281281
// the insertion sort algorithm.
282282
template <class _AlgPolicy, class _Compare, class _BidirectionalIterator>
283-
_LIBCPP_HIDE_FROM_ABI void
283+
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void
284284
__insertion_sort(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp) {
285285
using _Ops = _IterOps<_AlgPolicy>;
286286

libcxx/include/__algorithm/stable_sort.h

Lines changed: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include <__utility/move.h>
2525
#include <__utility/pair.h>
2626
#include <new>
27+
#include <vector>
2728

2829
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
2930
# pragma GCC system_header
@@ -35,7 +36,7 @@ _LIBCPP_PUSH_MACROS
3536
_LIBCPP_BEGIN_NAMESPACE_STD
3637

3738
template <class _AlgPolicy, class _Compare, class _BidirectionalIterator>
38-
_LIBCPP_HIDE_FROM_ABI void __insertion_sort_move(
39+
_LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI void __insertion_sort_move(
3940
_BidirectionalIterator __first1,
4041
_BidirectionalIterator __last1,
4142
typename iterator_traits<_BidirectionalIterator>::value_type* __first2,
@@ -68,7 +69,7 @@ _LIBCPP_HIDE_FROM_ABI void __insertion_sort_move(
6869
}
6970

7071
template <class _AlgPolicy, class _Compare, class _InputIterator1, class _InputIterator2>
71-
_LIBCPP_HIDE_FROM_ABI void __merge_move_construct(
72+
_LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI void __merge_move_construct(
7273
_InputIterator1 __first1,
7374
_InputIterator1 __last1,
7475
_InputIterator2 __first2,
@@ -106,7 +107,7 @@ _LIBCPP_HIDE_FROM_ABI void __merge_move_construct(
106107
}
107108

108109
template <class _AlgPolicy, class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator>
109-
_LIBCPP_HIDE_FROM_ABI void __merge_move_assign(
110+
_LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI void __merge_move_assign(
110111
_InputIterator1 __first1,
111112
_InputIterator1 __last1,
112113
_InputIterator2 __first2,
@@ -134,19 +135,21 @@ _LIBCPP_HIDE_FROM_ABI void __merge_move_assign(
134135
}
135136

136137
template <class _AlgPolicy, class _Compare, class _RandomAccessIterator>
137-
void __stable_sort(_RandomAccessIterator __first,
138-
_RandomAccessIterator __last,
139-
_Compare __comp,
140-
typename iterator_traits<_RandomAccessIterator>::difference_type __len,
141-
typename iterator_traits<_RandomAccessIterator>::value_type* __buff,
142-
ptrdiff_t __buff_size);
138+
_LIBCPP_CONSTEXPR_SINCE_CXX23 void __stable_sort(
139+
_RandomAccessIterator __first,
140+
_RandomAccessIterator __last,
141+
_Compare __comp,
142+
typename iterator_traits<_RandomAccessIterator>::difference_type __len,
143+
typename iterator_traits<_RandomAccessIterator>::value_type* __buff,
144+
ptrdiff_t __buff_size);
143145

144146
template <class _AlgPolicy, class _Compare, class _RandomAccessIterator>
145-
void __stable_sort_move(_RandomAccessIterator __first1,
146-
_RandomAccessIterator __last1,
147-
_Compare __comp,
148-
typename iterator_traits<_RandomAccessIterator>::difference_type __len,
149-
typename iterator_traits<_RandomAccessIterator>::value_type* __first2) {
147+
_LIBCPP_CONSTEXPR_SINCE_CXX23 void __stable_sort_move(
148+
_RandomAccessIterator __first1,
149+
_RandomAccessIterator __last1,
150+
_Compare __comp,
151+
typename iterator_traits<_RandomAccessIterator>::difference_type __len,
152+
typename iterator_traits<_RandomAccessIterator>::value_type* __first2) {
150153
using _Ops = _IterOps<_AlgPolicy>;
151154

152155
typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
@@ -190,12 +193,13 @@ struct __stable_sort_switch {
190193
};
191194

192195
template <class _AlgPolicy, class _Compare, class _RandomAccessIterator>
193-
void __stable_sort(_RandomAccessIterator __first,
194-
_RandomAccessIterator __last,
195-
_Compare __comp,
196-
typename iterator_traits<_RandomAccessIterator>::difference_type __len,
197-
typename iterator_traits<_RandomAccessIterator>::value_type* __buff,
198-
ptrdiff_t __buff_size) {
196+
_LIBCPP_CONSTEXPR_SINCE_CXX23 void __stable_sort(
197+
_RandomAccessIterator __first,
198+
_RandomAccessIterator __last,
199+
_Compare __comp,
200+
typename iterator_traits<_RandomAccessIterator>::difference_type __len,
201+
typename iterator_traits<_RandomAccessIterator>::value_type* __buff,
202+
ptrdiff_t __buff_size) {
199203
typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
200204
typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
201205
switch (__len) {
@@ -235,34 +239,47 @@ void __stable_sort(_RandomAccessIterator __first,
235239
}
236240

237241
template <class _AlgPolicy, class _RandomAccessIterator, class _Compare>
238-
inline _LIBCPP_HIDE_FROM_ABI void
242+
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void
239243
__stable_sort_impl(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare& __comp) {
240244
using value_type = typename iterator_traits<_RandomAccessIterator>::value_type;
241245
using difference_type = typename iterator_traits<_RandomAccessIterator>::difference_type;
242246

243247
difference_type __len = __last - __first;
244248
pair<value_type*, ptrdiff_t> __buf(0, 0);
245249
unique_ptr<value_type, __return_temporary_buffer> __h;
250+
std::vector<value_type> __h_vec;
246251
if (__len > static_cast<difference_type>(__stable_sort_switch<value_type>::value)) {
252+
#if _LIBCPP_STD_VER >= 23
253+
if consteval {
254+
__h_vec.reserve(__len);
255+
__buf.first = __h_vec.data();
256+
__buf.second = __h_vec.size();
257+
} else {
258+
#else
247259
// TODO: Remove the use of std::get_temporary_buffer
248260
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
249261
__buf = std::get_temporary_buffer<value_type>(__len);
250262
_LIBCPP_SUPPRESS_DEPRECATED_POP
251263
__h.reset(__buf.first);
264+
#endif
265+
#if _LIBCPP_STD_VER >= 23
266+
}
267+
#endif
252268
}
253269

254270
std::__stable_sort<_AlgPolicy, __comp_ref_type<_Compare> >(__first, __last, __comp, __len, __buf.first, __buf.second);
255271
std::__check_strict_weak_ordering_sorted(__first, __last, __comp);
256272
}
257273

258274
template <class _RandomAccessIterator, class _Compare>
259-
inline _LIBCPP_HIDE_FROM_ABI void
275+
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void
260276
stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) {
261277
std::__stable_sort_impl<_ClassicAlgPolicy>(std::move(__first), std::move(__last), __comp);
262278
}
263279

264280
template <class _RandomAccessIterator>
265-
inline _LIBCPP_HIDE_FROM_ABI void stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last) {
281+
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void
282+
stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last) {
266283
std::stable_sort(__first, __last, __less<>());
267284
}
268285

libcxx/include/__memory/destruct_n.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,25 @@ struct __destruct_n {
2525
size_t __size_;
2626

2727
template <class _Tp>
28-
_LIBCPP_HIDE_FROM_ABI void __process(_Tp* __p, false_type) _NOEXCEPT {
28+
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void __process(_Tp* __p, false_type) _NOEXCEPT {
2929
for (size_t __i = 0; __i < __size_; ++__i, ++__p)
3030
__p->~_Tp();
3131
}
3232

3333
template <class _Tp>
34-
_LIBCPP_HIDE_FROM_ABI void __process(_Tp*, true_type) _NOEXCEPT {}
34+
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void __process(_Tp*, true_type) _NOEXCEPT {}
3535

36-
_LIBCPP_HIDE_FROM_ABI void __incr(false_type) _NOEXCEPT { ++__size_; }
37-
_LIBCPP_HIDE_FROM_ABI void __incr(true_type) _NOEXCEPT {}
36+
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void __incr(false_type) _NOEXCEPT { ++__size_; }
37+
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void __incr(true_type) _NOEXCEPT {}
3838

3939
_LIBCPP_HIDE_FROM_ABI void __set(size_t __s, false_type) _NOEXCEPT { __size_ = __s; }
4040
_LIBCPP_HIDE_FROM_ABI void __set(size_t, true_type) _NOEXCEPT {}
4141

4242
public:
43-
_LIBCPP_HIDE_FROM_ABI explicit __destruct_n(size_t __s) _NOEXCEPT : __size_(__s) {}
43+
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 explicit __destruct_n(size_t __s) _NOEXCEPT : __size_(__s) {}
4444

4545
template <class _Tp>
46-
_LIBCPP_HIDE_FROM_ABI void __incr() _NOEXCEPT {
46+
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void __incr() _NOEXCEPT {
4747
__incr(integral_constant<bool, is_trivially_destructible<_Tp>::value>());
4848
}
4949

@@ -53,7 +53,7 @@ struct __destruct_n {
5353
}
5454

5555
template <class _Tp>
56-
_LIBCPP_HIDE_FROM_ABI void operator()(_Tp* __p) _NOEXCEPT {
56+
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void operator()(_Tp* __p) _NOEXCEPT {
5757
__process(__p, integral_constant<bool, is_trivially_destructible<_Tp>::value>());
5858
}
5959
};

0 commit comments

Comments
 (0)