19
19
#include < __cstddef/ptrdiff_t.h>
20
20
#include < __debug_utils/strict_weak_ordering_check.h>
21
21
#include < __iterator/iterator_traits.h>
22
+ #include < __memory/construct_at.h>
22
23
#include < __memory/destruct_n.h>
23
24
#include < __memory/unique_ptr.h>
24
25
#include < __memory/unique_temporary_buffer.h>
@@ -41,7 +42,7 @@ _LIBCPP_PUSH_MACROS
41
42
_LIBCPP_BEGIN_NAMESPACE_STD
42
43
43
44
template <class _AlgPolicy , class _Compare , class _BidirectionalIterator >
44
- _LIBCPP_HIDE_FROM_ABI void __insertion_sort_move (
45
+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 void __insertion_sort_move (
45
46
_BidirectionalIterator __first1,
46
47
_BidirectionalIterator __last1,
47
48
typename iterator_traits<_BidirectionalIterator>::value_type* __first2,
@@ -53,19 +54,19 @@ _LIBCPP_HIDE_FROM_ABI void __insertion_sort_move(
53
54
__destruct_n __d (0 );
54
55
unique_ptr<value_type, __destruct_n&> __h (__first2, __d);
55
56
value_type* __last2 = __first2;
56
- :: new (( void *) __last2) value_type ( _Ops::__iter_move (__first1));
57
+ std::__construct_at ( __last2, _Ops::__iter_move (__first1));
57
58
__d.template __incr <value_type>();
58
59
for (++__last2; ++__first1 != __last1; ++__last2) {
59
60
value_type* __j2 = __last2;
60
61
value_type* __i2 = __j2;
61
62
if (__comp (*__first1, *--__i2)) {
62
- :: new (( void *) __j2) value_type ( std::move (*__i2));
63
+ std::__construct_at ( __j2, std::move (*__i2));
63
64
__d.template __incr <value_type>();
64
65
for (--__j2; __i2 != __first2 && __comp (*__first1, *--__i2); --__j2)
65
66
*__j2 = std::move (*__i2);
66
67
*__j2 = _Ops::__iter_move (__first1);
67
68
} else {
68
- :: new (( void *) __j2) value_type ( _Ops::__iter_move (__first1));
69
+ std::__construct_at ( __j2, _Ops::__iter_move (__first1));
69
70
__d.template __incr <value_type>();
70
71
}
71
72
}
@@ -74,7 +75,7 @@ _LIBCPP_HIDE_FROM_ABI void __insertion_sort_move(
74
75
}
75
76
76
77
template <class _AlgPolicy , class _Compare , class _InputIterator1 , class _InputIterator2 >
77
- _LIBCPP_HIDE_FROM_ABI void __merge_move_construct (
78
+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 void __merge_move_construct (
78
79
_InputIterator1 __first1,
79
80
_InputIterator1 __last1,
80
81
_InputIterator2 __first2,
@@ -89,30 +90,30 @@ _LIBCPP_HIDE_FROM_ABI void __merge_move_construct(
89
90
for (; true ; ++__result) {
90
91
if (__first1 == __last1) {
91
92
for (; __first2 != __last2; ++__first2, (void )++__result, __d.template __incr <value_type>())
92
- :: new (( void *) __result) value_type ( _Ops::__iter_move (__first2));
93
+ std::__construct_at ( __result, _Ops::__iter_move (__first2));
93
94
__h.release ();
94
95
return ;
95
96
}
96
97
if (__first2 == __last2) {
97
98
for (; __first1 != __last1; ++__first1, (void )++__result, __d.template __incr <value_type>())
98
- :: new (( void *) __result) value_type ( _Ops::__iter_move (__first1));
99
+ std::__construct_at ( __result, _Ops::__iter_move (__first1));
99
100
__h.release ();
100
101
return ;
101
102
}
102
103
if (__comp (*__first2, *__first1)) {
103
- :: new (( void *) __result) value_type ( _Ops::__iter_move (__first2));
104
+ std::__construct_at ( __result, _Ops::__iter_move (__first2));
104
105
__d.template __incr <value_type>();
105
106
++__first2;
106
107
} else {
107
- :: new (( void *) __result) value_type ( _Ops::__iter_move (__first1));
108
+ std::__construct_at ( __result, _Ops::__iter_move (__first1));
108
109
__d.template __incr <value_type>();
109
110
++__first1;
110
111
}
111
112
}
112
113
}
113
114
114
115
template <class _AlgPolicy , class _Compare , class _InputIterator1 , class _InputIterator2 , class _OutputIterator >
115
- _LIBCPP_HIDE_FROM_ABI void __merge_move_assign (
116
+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 void __merge_move_assign (
116
117
_InputIterator1 __first1,
117
118
_InputIterator1 __last1,
118
119
_InputIterator2 __first2,
@@ -140,41 +141,43 @@ _LIBCPP_HIDE_FROM_ABI void __merge_move_assign(
140
141
}
141
142
142
143
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);
144
+ _LIBCPP_CONSTEXPR_SINCE_CXX26 void __stable_sort (
145
+ _RandomAccessIterator __first,
146
+ _RandomAccessIterator __last,
147
+ _Compare __comp,
148
+ typename iterator_traits<_RandomAccessIterator>::difference_type __len,
149
+ typename iterator_traits<_RandomAccessIterator>::value_type* __buff,
150
+ ptrdiff_t __buff_size);
149
151
150
152
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) {
153
+ _LIBCPP_CONSTEXPR_SINCE_CXX26 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) {
156
159
using _Ops = _IterOps<_AlgPolicy>;
157
160
158
161
typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
159
162
switch (__len) {
160
163
case 0 :
161
164
return ;
162
165
case 1 :
163
- :: new (( void *) __first2) value_type ( _Ops::__iter_move (__first1));
166
+ std::__construct_at ( __first2, _Ops::__iter_move (__first1));
164
167
return ;
165
168
case 2 :
166
169
__destruct_n __d (0 );
167
170
unique_ptr<value_type, __destruct_n&> __h2 (__first2, __d);
168
171
if (__comp (*--__last1, *__first1)) {
169
- :: new (( void *) __first2) value_type ( _Ops::__iter_move (__last1));
172
+ std::__construct_at ( __first2, _Ops::__iter_move (__last1));
170
173
__d.template __incr <value_type>();
171
174
++__first2;
172
- :: new (( void *) __first2) value_type ( _Ops::__iter_move (__first1));
175
+ std::__construct_at ( __first2, _Ops::__iter_move (__first1));
173
176
} else {
174
- :: new (( void *) __first2) value_type ( _Ops::__iter_move (__first1));
177
+ std::__construct_at ( __first2, _Ops::__iter_move (__first1));
175
178
__d.template __incr <value_type>();
176
179
++__first2;
177
- :: new (( void *) __first2) value_type ( _Ops::__iter_move (__last1));
180
+ std::__construct_at ( __first2, _Ops::__iter_move (__last1));
178
181
}
179
182
__h2.release ();
180
183
return ;
@@ -218,12 +221,13 @@ _LIBCPP_HIDE_FROM_ABI constexpr unsigned __radix_sort_max_bound() {
218
221
#endif // _LIBCPP_STD_VER >= 17
219
222
220
223
template <class _AlgPolicy , class _Compare , class _RandomAccessIterator >
221
- void __stable_sort (_RandomAccessIterator __first,
222
- _RandomAccessIterator __last,
223
- _Compare __comp,
224
- typename iterator_traits<_RandomAccessIterator>::difference_type __len,
225
- typename iterator_traits<_RandomAccessIterator>::value_type* __buff,
226
- ptrdiff_t __buff_size) {
224
+ _LIBCPP_CONSTEXPR_SINCE_CXX26 void __stable_sort (
225
+ _RandomAccessIterator __first,
226
+ _RandomAccessIterator __last,
227
+ _Compare __comp,
228
+ typename iterator_traits<_RandomAccessIterator>::difference_type __len,
229
+ typename iterator_traits<_RandomAccessIterator>::value_type* __buff,
230
+ ptrdiff_t __buff_size) {
227
231
typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
228
232
typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
229
233
switch (__len) {
@@ -279,7 +283,7 @@ void __stable_sort(_RandomAccessIterator __first,
279
283
}
280
284
281
285
template <class _AlgPolicy , class _RandomAccessIterator , class _Compare >
282
- inline _LIBCPP_HIDE_FROM_ABI void
286
+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 void
283
287
__stable_sort_impl (_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare& __comp) {
284
288
using value_type = typename iterator_traits<_RandomAccessIterator>::value_type;
285
289
using difference_type = typename iterator_traits<_RandomAccessIterator>::difference_type;
@@ -298,18 +302,18 @@ __stable_sort_impl(_RandomAccessIterator __first, _RandomAccessIterator __last,
298
302
}
299
303
300
304
template <class _RandomAccessIterator , class _Compare >
301
- inline _LIBCPP_HIDE_FROM_ABI void
305
+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 void
302
306
stable_sort (_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) {
303
307
std::__stable_sort_impl<_ClassicAlgPolicy>(std::move (__first), std::move (__last), __comp);
304
308
}
305
309
306
310
template <class _RandomAccessIterator >
307
- inline _LIBCPP_HIDE_FROM_ABI void stable_sort (_RandomAccessIterator __first, _RandomAccessIterator __last) {
311
+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 void
312
+ stable_sort (_RandomAccessIterator __first, _RandomAccessIterator __last) {
308
313
std::stable_sort (__first, __last, __less<>());
309
314
}
310
315
311
316
_LIBCPP_END_NAMESPACE_STD
312
-
313
317
_LIBCPP_POP_MACROS
314
318
315
319
#endif // _LIBCPP___ALGORITHM_STABLE_SORT_H
0 commit comments