Skip to content

Commit f851db3

Browse files
committed
[libc++] [P0879] constexpr std::reverse, partition, *_permutation.
After this patch, the only parts of P0879 that remain missing will be std::nth_element, std::sort, and the heap/partial_sort algorithms. Differential Revision: https://reviews.llvm.org/D93443
1 parent c435567 commit f851db3

File tree

7 files changed

+85
-41
lines changed

7 files changed

+85
-41
lines changed

libcxx/include/algorithm

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ template <class InputIterator, class OutputIterator, class BinaryPredicate>
267267
unique_copy(InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred);
268268
269269
template <class BidirectionalIterator>
270-
void
270+
constexpr void // constexpr in C++20
271271
reverse(BidirectionalIterator first, BidirectionalIterator last);
272272
273273
template <class BidirectionalIterator, class OutputIterator>
@@ -316,7 +316,7 @@ template <class InputIterator, class Predicate>
316316
is_partitioned(InputIterator first, InputIterator last, Predicate pred);
317317
318318
template <class ForwardIterator, class Predicate>
319-
ForwardIterator
319+
constexpr ForwardIterator // constexpr in C++20
320320
partition(ForwardIterator first, ForwardIterator last, Predicate pred);
321321
322322
template <class InputIterator, class OutputIterator1,
@@ -626,19 +626,19 @@ template <class InputIterator1, class InputIterator2, class Compare>
626626
InputIterator2 first2, InputIterator2 last2, Compare comp);
627627
628628
template <class BidirectionalIterator>
629-
bool
629+
constexpr bool // constexpr in C++20
630630
next_permutation(BidirectionalIterator first, BidirectionalIterator last);
631631
632632
template <class BidirectionalIterator, class Compare>
633-
bool
633+
constexpr bool // constexpr in C++20
634634
next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
635635
636636
template <class BidirectionalIterator>
637-
bool
637+
constexpr bool // constexpr in C++20
638638
prev_permutation(BidirectionalIterator first, BidirectionalIterator last);
639639
640640
template <class BidirectionalIterator, class Compare>
641-
bool
641+
constexpr bool // constexpr in C++20
642642
prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp);
643643
644644
} // std
@@ -2321,7 +2321,7 @@ unique_copy(_InputIterator __first, _InputIterator __last, _OutputIterator __res
23212321
// reverse
23222322

23232323
template <class _BidirectionalIterator>
2324-
inline _LIBCPP_INLINE_VISIBILITY
2324+
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
23252325
void
23262326
__reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirectional_iterator_tag)
23272327
{
@@ -2335,7 +2335,7 @@ __reverse(_BidirectionalIterator __first, _BidirectionalIterator __last, bidirec
23352335
}
23362336

23372337
template <class _RandomAccessIterator>
2338-
inline _LIBCPP_INLINE_VISIBILITY
2338+
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
23392339
void
23402340
__reverse(_RandomAccessIterator __first, _RandomAccessIterator __last, random_access_iterator_tag)
23412341
{
@@ -2345,7 +2345,7 @@ __reverse(_RandomAccessIterator __first, _RandomAccessIterator __last, random_ac
23452345
}
23462346

23472347
template <class _BidirectionalIterator>
2348-
inline _LIBCPP_INLINE_VISIBILITY
2348+
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
23492349
void
23502350
reverse(_BidirectionalIterator __first, _BidirectionalIterator __last)
23512351
{
@@ -3393,7 +3393,7 @@ is_partitioned(_InputIterator __first, _InputIterator __last, _Predicate __pred)
33933393
// partition
33943394

33953395
template <class _Predicate, class _ForwardIterator>
3396-
_ForwardIterator
3396+
_LIBCPP_CONSTEXPR_AFTER_CXX17 _ForwardIterator
33973397
__partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred, forward_iterator_tag)
33983398
{
33993399
while (true)
@@ -3416,7 +3416,7 @@ __partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred
34163416
}
34173417

34183418
template <class _Predicate, class _BidirectionalIterator>
3419-
_BidirectionalIterator
3419+
_LIBCPP_CONSTEXPR_AFTER_CXX17 _BidirectionalIterator
34203420
__partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Predicate __pred,
34213421
bidirectional_iterator_tag)
34223422
{
@@ -3441,7 +3441,7 @@ __partition(_BidirectionalIterator __first, _BidirectionalIterator __last, _Pred
34413441
}
34423442

34433443
template <class _ForwardIterator, class _Predicate>
3444-
inline _LIBCPP_INLINE_VISIBILITY
3444+
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
34453445
_ForwardIterator
34463446
partition(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred)
34473447
{
@@ -5760,7 +5760,7 @@ lexicographical_compare(_InputIterator1 __first1, _InputIterator1 __last1,
57605760
// next_permutation
57615761

57625762
template <class _Compare, class _BidirectionalIterator>
5763-
bool
5763+
_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
57645764
__next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
57655765
{
57665766
_BidirectionalIterator __i = __last;
@@ -5787,7 +5787,7 @@ __next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last
57875787
}
57885788

57895789
template <class _BidirectionalIterator, class _Compare>
5790-
inline _LIBCPP_INLINE_VISIBILITY
5790+
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
57915791
bool
57925792
next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
57935793
{
@@ -5796,7 +5796,7 @@ next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last,
57965796
}
57975797

57985798
template <class _BidirectionalIterator>
5799-
inline _LIBCPP_INLINE_VISIBILITY
5799+
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
58005800
bool
58015801
next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
58025802
{
@@ -5807,7 +5807,7 @@ next_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
58075807
// prev_permutation
58085808

58095809
template <class _Compare, class _BidirectionalIterator>
5810-
bool
5810+
_LIBCPP_CONSTEXPR_AFTER_CXX17 bool
58115811
__prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
58125812
{
58135813
_BidirectionalIterator __i = __last;
@@ -5834,7 +5834,7 @@ __prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last
58345834
}
58355835

58365836
template <class _BidirectionalIterator, class _Compare>
5837-
inline _LIBCPP_INLINE_VISIBILITY
5837+
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
58385838
bool
58395839
prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp)
58405840
{
@@ -5843,7 +5843,7 @@ prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last,
58435843
}
58445844

58455845
template <class _BidirectionalIterator>
5846-
inline _LIBCPP_INLINE_VISIBILITY
5846+
inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
58475847
bool
58485848
prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last)
58495849
{

libcxx/test/std/algorithms/alg.modifying.operations/alg.partitions/partition.pass.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
// template<BidirectionalIterator Iter, Predicate<auto, Iter::value_type> Pred>
1212
// requires ShuffleIterator<Iter>
1313
// && CopyConstructible<Pred>
14-
// Iter
14+
// constexpr Iter // constexpr in C++20
1515
// partition(Iter first, Iter last, Pred pred);
1616

1717
#include <algorithm>
@@ -23,11 +23,11 @@
2323

2424
struct is_odd
2525
{
26-
bool operator()(const int& i) const {return i & 1;}
26+
TEST_CONSTEXPR bool operator()(const int& i) const {return i & 1;}
2727
};
2828

2929
template <class Iter>
30-
void
30+
TEST_CONSTEXPR_CXX20 bool
3131
test()
3232
{
3333
// check mixed
@@ -92,6 +92,8 @@ test()
9292
assert(is_odd()(*i));
9393
for (int* i = base(r); i < ia+sa; ++i)
9494
assert(!is_odd()(*i));
95+
96+
return true;
9597
}
9698

9799
int main(int, char**)
@@ -100,5 +102,11 @@ int main(int, char**)
100102
test<random_access_iterator<int*> >();
101103
test<int*>();
102104

103-
return 0;
105+
#if TEST_STD_VER >= 20
106+
static_assert(test<bidirectional_iterator<int*>>());
107+
static_assert(test<random_access_iterator<int*>>());
108+
static_assert(test<int*>());
109+
#endif
110+
111+
return 0;
104112
}

libcxx/test/std/algorithms/alg.modifying.operations/alg.reverse/reverse.pass.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
// template<BidirectionalIterator Iter>
1212
// requires HasSwap<Iter::reference, Iter::reference>
13-
// void
13+
// constexpr void // constexpr in C++20
1414
// reverse(Iter first, Iter last);
1515

1616
#include <algorithm>
@@ -20,7 +20,7 @@
2020
#include "test_iterators.h"
2121

2222
template <class Iter>
23-
void
23+
TEST_CONSTEXPR_CXX20 bool
2424
test()
2525
{
2626
int ia[] = {0};
@@ -50,6 +50,8 @@ test()
5050
assert(id[1] == 2);
5151
assert(id[2] == 1);
5252
assert(id[3] == 0);
53+
54+
return true;
5355
}
5456

5557
int main(int, char**)
@@ -58,5 +60,11 @@ int main(int, char**)
5860
test<random_access_iterator<int*> >();
5961
test<int*>();
6062

61-
return 0;
63+
#if TEST_STD_VER >= 20
64+
static_assert(test<bidirectional_iterator<int*>>());
65+
static_assert(test<random_access_iterator<int*>>());
66+
static_assert(test<int*>());
67+
#endif
68+
69+
return 0;
6270
}

libcxx/test/std/algorithms/alg.sorting/alg.permutation.generators/next_permutation.pass.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
// template<BidirectionalIterator Iter>
1212
// requires ShuffleIterator<Iter>
1313
// && LessThanComparable<Iter::value_type>
14-
// bool
14+
// constexpr bool // constexpr in C++20
1515
// next_permutation(Iter first, Iter last);
1616

1717
#include <algorithm>
@@ -22,7 +22,7 @@
2222

2323
#include <cstdio>
2424

25-
int factorial(int x)
25+
TEST_CONSTEXPR_CXX14 int factorial(int x)
2626
{
2727
int r = 1;
2828
for (; x; --x)
@@ -31,7 +31,7 @@ int factorial(int x)
3131
}
3232

3333
template <class Iter>
34-
void
34+
TEST_CONSTEXPR_CXX20 bool
3535
test()
3636
{
3737
int ia[] = {1, 2, 3, 4, 5, 6};
@@ -56,6 +56,7 @@ test()
5656
} while (x);
5757
assert(count == factorial(e));
5858
}
59+
return true;
5960
}
6061

6162
int main(int, char**)
@@ -64,5 +65,11 @@ int main(int, char**)
6465
test<random_access_iterator<int*> >();
6566
test<int*>();
6667

67-
return 0;
68+
#if TEST_STD_VER >= 20
69+
static_assert(test<bidirectional_iterator<int*>>());
70+
static_assert(test<random_access_iterator<int*>>());
71+
static_assert(test<int*>());
72+
#endif
73+
74+
return 0;
6875
}

libcxx/test/std/algorithms/alg.sorting/alg.permutation.generators/next_permutation_comp.pass.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
// template<BidirectionalIterator Iter, StrictWeakOrder<auto, Iter::value_type> Compare>
1212
// requires ShuffleIterator<Iter>
1313
// && CopyConstructible<Compare>
14-
// bool
14+
// constexpr bool // constexpr in C++20
1515
// next_permutation(Iter first, Iter last, Compare comp);
1616

1717
#include <algorithm>
@@ -23,7 +23,7 @@
2323

2424
#include <cstdio>
2525

26-
int factorial(int x)
26+
TEST_CONSTEXPR_CXX14 int factorial(int x)
2727
{
2828
int r = 1;
2929
for (; x; --x)
@@ -32,7 +32,7 @@ int factorial(int x)
3232
}
3333

3434
template <class Iter>
35-
void
35+
TEST_CONSTEXPR_CXX20 bool
3636
test()
3737
{
3838
typedef std::greater<int> C;
@@ -58,6 +58,7 @@ test()
5858
} while (x);
5959
assert(count == factorial(e));
6060
}
61+
return true;
6162
}
6263

6364
int main(int, char**)
@@ -66,5 +67,11 @@ int main(int, char**)
6667
test<random_access_iterator<int*> >();
6768
test<int*>();
6869

69-
return 0;
70+
#if TEST_STD_VER >= 20
71+
static_assert(test<bidirectional_iterator<int*>>());
72+
static_assert(test<random_access_iterator<int*>>());
73+
static_assert(test<int*>());
74+
#endif
75+
76+
return 0;
7077
}

libcxx/test/std/algorithms/alg.sorting/alg.permutation.generators/prev_permutation.pass.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
// template<BidirectionalIterator Iter>
1212
// requires ShuffleIterator<Iter>
1313
// && LessThanComparable<Iter::value_type>
14-
// bool
14+
// constexpr bool // constexpr in C++20
1515
// prev_permutation(Iter first, Iter last);
1616

1717
#include <algorithm>
@@ -22,7 +22,7 @@
2222

2323
#include <cstdio>
2424

25-
int factorial(int x)
25+
TEST_CONSTEXPR_CXX14 int factorial(int x)
2626
{
2727
int r = 1;
2828
for (; x; --x)
@@ -31,7 +31,7 @@ int factorial(int x)
3131
}
3232

3333
template <class Iter>
34-
void
34+
TEST_CONSTEXPR_CXX20 bool
3535
test()
3636
{
3737
int ia[] = {6, 5, 4, 3, 2, 1};
@@ -56,6 +56,7 @@ test()
5656
} while (x);
5757
assert(count == factorial(e));
5858
}
59+
return true;
5960
}
6061

6162
int main(int, char**)
@@ -64,5 +65,11 @@ int main(int, char**)
6465
test<random_access_iterator<int*> >();
6566
test<int*>();
6667

67-
return 0;
68+
#if TEST_STD_VER >= 20
69+
static_assert(test<bidirectional_iterator<int*>>());
70+
static_assert(test<random_access_iterator<int*>>());
71+
static_assert(test<int*>());
72+
#endif
73+
74+
return 0;
6875
}

0 commit comments

Comments
 (0)