[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>

`