24
24
#include < __utility/move.h>
25
25
#include < __utility/pair.h>
26
26
#include < new>
27
+ #include < vector>
27
28
28
29
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
29
30
# pragma GCC system_header
@@ -35,7 +36,7 @@ _LIBCPP_PUSH_MACROS
35
36
_LIBCPP_BEGIN_NAMESPACE_STD
36
37
37
38
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 (
39
40
_BidirectionalIterator __first1,
40
41
_BidirectionalIterator __last1,
41
42
typename iterator_traits<_BidirectionalIterator>::value_type* __first2,
@@ -68,7 +69,7 @@ _LIBCPP_HIDE_FROM_ABI void __insertion_sort_move(
68
69
}
69
70
70
71
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 (
72
73
_InputIterator1 __first1,
73
74
_InputIterator1 __last1,
74
75
_InputIterator2 __first2,
@@ -106,7 +107,7 @@ _LIBCPP_HIDE_FROM_ABI void __merge_move_construct(
106
107
}
107
108
108
109
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 (
110
111
_InputIterator1 __first1,
111
112
_InputIterator1 __last1,
112
113
_InputIterator2 __first2,
@@ -134,19 +135,21 @@ _LIBCPP_HIDE_FROM_ABI void __merge_move_assign(
134
135
}
135
136
136
137
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);
143
145
144
146
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) {
150
153
using _Ops = _IterOps<_AlgPolicy>;
151
154
152
155
typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
@@ -190,12 +193,13 @@ struct __stable_sort_switch {
190
193
};
191
194
192
195
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) {
199
203
typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
200
204
typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
201
205
switch (__len) {
@@ -235,34 +239,47 @@ void __stable_sort(_RandomAccessIterator __first,
235
239
}
236
240
237
241
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
239
243
__stable_sort_impl (_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare& __comp) {
240
244
using value_type = typename iterator_traits<_RandomAccessIterator>::value_type;
241
245
using difference_type = typename iterator_traits<_RandomAccessIterator>::difference_type;
242
246
243
247
difference_type __len = __last - __first;
244
248
pair<value_type*, ptrdiff_t > __buf (0 , 0 );
245
249
unique_ptr<value_type, __return_temporary_buffer> __h;
250
+ std::vector<value_type> __h_vec;
246
251
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
247
259
// TODO: Remove the use of std::get_temporary_buffer
248
260
_LIBCPP_SUPPRESS_DEPRECATED_PUSH
249
261
__buf = std::get_temporary_buffer<value_type>(__len);
250
262
_LIBCPP_SUPPRESS_DEPRECATED_POP
251
263
__h.reset (__buf.first );
264
+ #endif
265
+ #if _LIBCPP_STD_VER >= 23
266
+ }
267
+ #endif
252
268
}
253
269
254
270
std::__stable_sort<_AlgPolicy, __comp_ref_type<_Compare> >(__first, __last, __comp, __len, __buf.first , __buf.second );
255
271
std::__check_strict_weak_ordering_sorted (__first, __last, __comp);
256
272
}
257
273
258
274
template <class _RandomAccessIterator , class _Compare >
259
- inline _LIBCPP_HIDE_FROM_ABI void
275
+ inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void
260
276
stable_sort (_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) {
261
277
std::__stable_sort_impl<_ClassicAlgPolicy>(std::move (__first), std::move (__last), __comp);
262
278
}
263
279
264
280
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) {
266
283
std::stable_sort (__first, __last, __less<>());
267
284
}
268
285
0 commit comments