[libc++] [P0879] constexpr std::sort · llvm/llvm-project@493f140 (original) (raw)
`@@ -351,11 +351,11 @@ template <class ForwardIterator, class Compare>
`
351
351
` is_sorted_until(ForwardIterator first, ForwardIterator last, Compare comp);
`
352
352
``
353
353
`template
`
354
``
`-
void
`
``
354
`+
constexpr void // constexpr in C++20
`
355
355
` sort(RandomAccessIterator first, RandomAccessIterator last);
`
356
356
``
357
357
`template <class RandomAccessIterator, class Compare>
`
358
``
`-
void
`
``
358
`+
constexpr void // constexpr in C++20
`
359
359
` sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp);
`
360
360
``
361
361
`template
`
`@@ -4047,7 +4047,6 @@ template <class _Compare, class _RandomAccessIterator>
`
4047
4047
`void
`
4048
4048
`__sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
`
4049
4049
`{
`
4050
``
`-
// _Compare is known to be a reference type
`
4051
4050
`typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
`
4052
4051
`typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
`
4053
4052
`const difference_type __limit = is_trivially_copy_constructible::value &&
`
`@@ -4236,47 +4235,13 @@ __sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __c
`
4236
4235
` }
`
4237
4236
`}
`
4238
4237
``
4239
``
`-
// This forwarder keeps the top call and the recursive calls using the same instantiation, forcing a reference _Compare
`
4240
``
`-
template <class _RandomAccessIterator, class _Compare>
`
4241
``
`-
inline _LIBCPP_INLINE_VISIBILITY
`
4242
``
`-
void
`
4243
``
`-
sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
`
4244
``
`-
{
`
4245
``
`-
typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
`
4246
``
`-
_VSTD::__sort<_Comp_ref>(__first, __last, _Comp_ref(__comp));
`
4247
``
`-
}
`
4248
``
-
4249
``
`-
template
`
4250
``
`-
inline _LIBCPP_INLINE_VISIBILITY
`
4251
``
`-
void
`
4252
``
`-
sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
`
4253
``
`-
{
`
4254
``
`-
_VSTD::sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
`
4255
``
`-
}
`
4256
``
-
4257
``
`-
template
`
4258
``
`-
inline _LIBCPP_INLINE_VISIBILITY
`
4259
``
`-
void
`
4260
``
`-
sort(_Tp** __first, _Tp** __last)
`
4261
``
`-
{
`
4262
``
`-
_VSTD::sort((uintptr_t*)__first, (uintptr_t*)__last, __less());
`
4263
``
`-
}
`
4264
``
-
4265
``
`-
template
`
4266
``
`-
inline _LIBCPP_INLINE_VISIBILITY
`
4267
``
`-
void
`
4268
``
`-
sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last)
`
4269
``
`-
{
`
4270
``
`-
_VSTD::sort(__first.base(), __last.base());
`
4271
``
`-
}
`
4272
``
-
4273
``
`-
template <class _Tp, class _Compare>
`
``
4238
`+
template <class _Compare, class _Tp>
`
4274
4239
`inline _LIBCPP_INLINE_VISIBILITY
`
4275
4240
`void
`
4276
``
`-
sort(__wrap_iter<_Tp*> __first, __wrap_iter<_Tp*> __last, _Compare __comp)
`
``
4241
`+
__sort(_Tp** __first, _Tp** __last, __less<_Tp*>&)
`
4277
4242
`{
`
4278
``
`-
typedef typename add_lvalue_reference<_Compare>::type _Comp_ref;
`
4279
``
`-
_VSTD::sort<_Tp*, _Comp_ref>(__first.base(), __last.base(), __comp);
`
``
4243
`+
__less __comp;
`
``
4244
`+
_VSTD::__sort<__less&, uintptr_t*>((uintptr_t*)__first, (uintptr_t*)__last, __comp);
`
4280
4245
`}
`
4281
4246
``
4282
4247
`_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void __sort<__less&, char*>(char*, char*, __less&))
`
`@@ -5478,6 +5443,29 @@ nth_element(_RandomAccessIterator __first, _RandomAccessIterator __nth, _RandomA
`
5478
5443
`_VSTD::nth_element(__first, __nth, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
`
5479
5444
`}
`
5480
5445
``
``
5446
`+
// sort
`
``
5447
+
``
5448
`+
template <class _RandomAccessIterator, class _Compare>
`
``
5449
`+
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
`
``
5450
`+
void
`
``
5451
`+
sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
`
``
5452
`+
{
`
``
5453
`+
typedef typename __comp_ref_type<_Compare>::type _Comp_ref;
`
``
5454
`+
if (__libcpp_is_constant_evaluated()) {
`
``
5455
`+
_VSTD::__partial_sort<_Comp_ref>(__first, __last, __last, _Comp_ref(__comp));
`
``
5456
`+
} else {
`
``
5457
`+
_VSTD::__sort<_Comp_ref>(_VSTD::__unwrap_iter(__first), _VSTD::__unwrap_iter(__last), _Comp_ref(__comp));
`
``
5458
`+
}
`
``
5459
`+
}
`
``
5460
+
``
5461
`+
template
`
``
5462
`+
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
`
``
5463
`+
void
`
``
5464
`+
sort(_RandomAccessIterator __first, _RandomAccessIterator __last)
`
``
5465
`+
{
`
``
5466
`+
_VSTD::sort(__first, __last, __less<typename iterator_traits<_RandomAccessIterator>::value_type>());
`
``
5467
`+
}
`
``
5468
+
5481
5469
`// includes
`
5482
5470
``
5483
5471
`template <class _Compare, class _InputIterator1, class _InputIterator2>
`