1919#include < __cstddef/ptrdiff_t.h>
2020#include < __debug_utils/strict_weak_ordering_check.h>
2121#include < __iterator/iterator_traits.h>
22+ #include < __memory/construct_at.h>
2223#include < __memory/destruct_n.h>
2324#include < __memory/unique_ptr.h>
2425#include < __memory/unique_temporary_buffer.h>
@@ -41,7 +42,7 @@ _LIBCPP_PUSH_MACROS
4142_LIBCPP_BEGIN_NAMESPACE_STD
4243
4344template <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 (
4546 _BidirectionalIterator __first1,
4647 _BidirectionalIterator __last1,
4748 typename iterator_traits<_BidirectionalIterator>::value_type* __first2,
@@ -53,19 +54,19 @@ _LIBCPP_HIDE_FROM_ABI void __insertion_sort_move(
5354 __destruct_n __d (0 );
5455 unique_ptr<value_type, __destruct_n&> __h (__first2, __d);
5556 value_type* __last2 = __first2;
56- :: new (( void *) __last2) value_type ( _Ops::__iter_move (__first1));
57+ std::__construct_at ( __last2, _Ops::__iter_move (__first1));
5758 __d.template __incr <value_type>();
5859 for (++__last2; ++__first1 != __last1; ++__last2) {
5960 value_type* __j2 = __last2;
6061 value_type* __i2 = __j2;
6162 if (__comp (*__first1, *--__i2)) {
62- :: new (( void *) __j2) value_type ( std::move (*__i2));
63+ std::__construct_at ( __j2, std::move (*__i2));
6364 __d.template __incr <value_type>();
6465 for (--__j2; __i2 != __first2 && __comp (*__first1, *--__i2); --__j2)
6566 *__j2 = std::move (*__i2);
6667 *__j2 = _Ops::__iter_move (__first1);
6768 } else {
68- :: new (( void *) __j2) value_type ( _Ops::__iter_move (__first1));
69+ std::__construct_at ( __j2, _Ops::__iter_move (__first1));
6970 __d.template __incr <value_type>();
7071 }
7172 }
@@ -74,7 +75,7 @@ _LIBCPP_HIDE_FROM_ABI void __insertion_sort_move(
7475}
7576
7677template <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 (
7879 _InputIterator1 __first1,
7980 _InputIterator1 __last1,
8081 _InputIterator2 __first2,
@@ -89,30 +90,30 @@ _LIBCPP_HIDE_FROM_ABI void __merge_move_construct(
8990 for (; true ; ++__result) {
9091 if (__first1 == __last1) {
9192 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));
9394 __h.release ();
9495 return ;
9596 }
9697 if (__first2 == __last2) {
9798 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));
99100 __h.release ();
100101 return ;
101102 }
102103 if (__comp (*__first2, *__first1)) {
103- :: new (( void *) __result) value_type ( _Ops::__iter_move (__first2));
104+ std::__construct_at ( __result, _Ops::__iter_move (__first2));
104105 __d.template __incr <value_type>();
105106 ++__first2;
106107 } else {
107- :: new (( void *) __result) value_type ( _Ops::__iter_move (__first1));
108+ std::__construct_at ( __result, _Ops::__iter_move (__first1));
108109 __d.template __incr <value_type>();
109110 ++__first1;
110111 }
111112 }
112113}
113114
114115template <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 (
116117 _InputIterator1 __first1,
117118 _InputIterator1 __last1,
118119 _InputIterator2 __first2,
@@ -140,41 +141,43 @@ _LIBCPP_HIDE_FROM_ABI void __merge_move_assign(
140141}
141142
142143template <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);
149151
150152template <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) {
156159 using _Ops = _IterOps<_AlgPolicy>;
157160
158161 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
159162 switch (__len) {
160163 case 0 :
161164 return ;
162165 case 1 :
163- :: new (( void *) __first2) value_type ( _Ops::__iter_move (__first1));
166+ std::__construct_at ( __first2, _Ops::__iter_move (__first1));
164167 return ;
165168 case 2 :
166169 __destruct_n __d (0 );
167170 unique_ptr<value_type, __destruct_n&> __h2 (__first2, __d);
168171 if (__comp (*--__last1, *__first1)) {
169- :: new (( void *) __first2) value_type ( _Ops::__iter_move (__last1));
172+ std::__construct_at ( __first2, _Ops::__iter_move (__last1));
170173 __d.template __incr <value_type>();
171174 ++__first2;
172- :: new (( void *) __first2) value_type ( _Ops::__iter_move (__first1));
175+ std::__construct_at ( __first2, _Ops::__iter_move (__first1));
173176 } else {
174- :: new (( void *) __first2) value_type ( _Ops::__iter_move (__first1));
177+ std::__construct_at ( __first2, _Ops::__iter_move (__first1));
175178 __d.template __incr <value_type>();
176179 ++__first2;
177- :: new (( void *) __first2) value_type ( _Ops::__iter_move (__last1));
180+ std::__construct_at ( __first2, _Ops::__iter_move (__last1));
178181 }
179182 __h2.release ();
180183 return ;
@@ -218,12 +221,13 @@ _LIBCPP_HIDE_FROM_ABI constexpr unsigned __radix_sort_max_bound() {
218221#endif // _LIBCPP_STD_VER >= 17
219222
220223template <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) {
227231 typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
228232 typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
229233 switch (__len) {
@@ -279,7 +283,7 @@ void __stable_sort(_RandomAccessIterator __first,
279283}
280284
281285template <class _AlgPolicy , class _RandomAccessIterator , class _Compare >
282- inline _LIBCPP_HIDE_FROM_ABI void
286+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 void
283287__stable_sort_impl (_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare& __comp) {
284288 using value_type = typename iterator_traits<_RandomAccessIterator>::value_type;
285289 using difference_type = typename iterator_traits<_RandomAccessIterator>::difference_type;
@@ -298,18 +302,18 @@ __stable_sort_impl(_RandomAccessIterator __first, _RandomAccessIterator __last,
298302}
299303
300304template <class _RandomAccessIterator , class _Compare >
301- inline _LIBCPP_HIDE_FROM_ABI void
305+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 void
302306stable_sort (_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) {
303307 std::__stable_sort_impl<_ClassicAlgPolicy>(std::move (__first), std::move (__last), __comp);
304308}
305309
306310template <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) {
308313 std::stable_sort (__first, __last, __less<>());
309314}
310315
311316_LIBCPP_END_NAMESPACE_STD
312-
313317_LIBCPP_POP_MACROS
314318
315319#endif // _LIBCPP___ALGORITHM_STABLE_SORT_H
0 commit comments