Skip to content

Commit 26d5a32

Browse files
committed
constexpr stable sort; tests
1 parent c28e268 commit 26d5a32

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
@@ -68,7 +68,7 @@ template <class _AlgPolicy,
6868
class _InputIterator2,
6969
class _Sent2,
7070
class _OutputIterator>
71-
_LIBCPP_HIDE_FROM_ABI void __half_inplace_merge(
71+
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void __half_inplace_merge(
7272
_InputIterator1 __first1,
7373
_Sent1 __last1,
7474
_InputIterator2 __first2,
@@ -93,7 +93,7 @@ _LIBCPP_HIDE_FROM_ABI void __half_inplace_merge(
9393
}
9494

9595
template <class _AlgPolicy, class _Compare, class _BidirectionalIterator>
96-
_LIBCPP_HIDE_FROM_ABI void __buffered_inplace_merge(
96+
_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void __buffered_inplace_merge(
9797
_BidirectionalIterator __first,
9898
_BidirectionalIterator __middle,
9999
_BidirectionalIterator __last,
@@ -124,7 +124,7 @@ _LIBCPP_HIDE_FROM_ABI void __buffered_inplace_merge(
124124
}
125125

126126
template <class _AlgPolicy, class _Compare, class _BidirectionalIterator>
127-
void __inplace_merge(
127+
_LIBCPP_CONSTEXPR_SINCE_CXX23 void __inplace_merge(
128128
_BidirectionalIterator __first,
129129
_BidirectionalIterator __middle,
130130
_BidirectionalIterator __last,

libcxx/include/__algorithm/sort.h

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

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,32 +239,45 @@ 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
__unique_temporary_buffer<value_type> __unique_buf;
245249
pair<value_type*, ptrdiff_t> __buf(0, 0);
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
__unique_buf = std::__allocate_unique_temporary_buffer<value_type>(__len);
248260
__buf.first = __unique_buf.get();
249261
__buf.second = __unique_buf.get_deleter().__count_;
262+
#endif
263+
#if _LIBCPP_STD_VER >= 23
264+
}
265+
#endif
250266
}
251267

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

256272
template <class _RandomAccessIterator, class _Compare>
257-
inline _LIBCPP_HIDE_FROM_ABI void
273+
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void
258274
stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) {
259275
std::__stable_sort_impl<_ClassicAlgPolicy>(std::move(__first), std::move(__last), __comp);
260276
}
261277

262278
template <class _RandomAccessIterator>
263-
inline _LIBCPP_HIDE_FROM_ABI void stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last) {
279+
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void
280+
stable_sort(_RandomAccessIterator __first, _RandomAccessIterator __last) {
264281
std::stable_sort(__first, __last, __less<>());
265282
}
266283

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)