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
3738template <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
7071template <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
108109template <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
136137template <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
144146template <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
192195template <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
237241template <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
256272template <class _RandomAccessIterator , class _Compare >
257- inline _LIBCPP_HIDE_FROM_ABI void
273+ inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX23 void
258274stable_sort (_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) {
259275 std::__stable_sort_impl<_ClassicAlgPolicy>(std::move (__first), std::move (__last), __comp);
260276}
261277
262278template <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
0 commit comments