1 | //===----------------------------------------------------------------------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | // <algorithm> |
10 | |
11 | // template<class ForwardIterator, class Predicate> |
12 | // constexpr ForwardIterator // constexpr after C++17 |
13 | // partition_point(ForwardIterator first, ForwardIterator last, Predicate pred); |
14 | |
15 | #include <algorithm> |
16 | #include <cassert> |
17 | |
18 | #include "test_macros.h" |
19 | #include "test_iterators.h" |
20 | |
21 | struct is_odd |
22 | { |
23 | TEST_CONSTEXPR bool operator()(const int& i) const {return i & 1;} |
24 | }; |
25 | |
26 | |
27 | #if TEST_STD_VER > 17 |
28 | TEST_CONSTEXPR bool test_constexpr() { |
29 | int ia[] = {1, 3, 5, 2, 4, 6}; |
30 | int ib[] = {1, 2, 3, 4, 5, 6}; |
31 | return (std::partition_point(std::begin(ia), std::end(ia), is_odd()) == ia+3) |
32 | && (std::partition_point(std::begin(ib), std::end(ib), is_odd()) == ib+1) |
33 | ; |
34 | } |
35 | #endif |
36 | |
37 | |
38 | int main(int, char**) |
39 | { |
40 | { |
41 | const int ia[] = {2, 4, 6, 8, 10}; |
42 | assert(std::partition_point(forward_iterator<const int*>(std::begin(ia)), |
43 | forward_iterator<const int*>(std::end(ia)), |
44 | is_odd()) == forward_iterator<const int*>(ia)); |
45 | } |
46 | { |
47 | const int ia[] = {1, 2, 4, 6, 8}; |
48 | assert(std::partition_point(forward_iterator<const int*>(std::begin(ia)), |
49 | forward_iterator<const int*>(std::end(ia)), |
50 | is_odd()) == forward_iterator<const int*>(ia + 1)); |
51 | } |
52 | { |
53 | const int ia[] = {1, 3, 2, 4, 6}; |
54 | assert(std::partition_point(forward_iterator<const int*>(std::begin(ia)), |
55 | forward_iterator<const int*>(std::end(ia)), |
56 | is_odd()) == forward_iterator<const int*>(ia + 2)); |
57 | } |
58 | { |
59 | const int ia[] = {1, 3, 5, 2, 4, 6}; |
60 | assert(std::partition_point(forward_iterator<const int*>(std::begin(ia)), |
61 | forward_iterator<const int*>(std::end(ia)), |
62 | is_odd()) == forward_iterator<const int*>(ia + 3)); |
63 | } |
64 | { |
65 | const int ia[] = {1, 3, 5, 7, 2, 4}; |
66 | assert(std::partition_point(forward_iterator<const int*>(std::begin(ia)), |
67 | forward_iterator<const int*>(std::end(ia)), |
68 | is_odd()) == forward_iterator<const int*>(ia + 4)); |
69 | } |
70 | { |
71 | const int ia[] = {1, 3, 5, 7, 9, 2}; |
72 | assert(std::partition_point(forward_iterator<const int*>(std::begin(ia)), |
73 | forward_iterator<const int*>(std::end(ia)), |
74 | is_odd()) == forward_iterator<const int*>(ia + 5)); |
75 | } |
76 | { |
77 | const int ia[] = {1, 3, 5, 7, 9, 11}; |
78 | assert(std::partition_point(forward_iterator<const int*>(std::begin(ia)), |
79 | forward_iterator<const int*>(std::end(ia)), |
80 | is_odd()) == forward_iterator<const int*>(ia + 6)); |
81 | } |
82 | { |
83 | const int ia[] = {1, 3, 5, 2, 4, 6, 7}; |
84 | assert(std::partition_point(forward_iterator<const int*>(std::begin(ia)), |
85 | forward_iterator<const int*>(std::begin(ia)), |
86 | is_odd()) == forward_iterator<const int*>(ia)); |
87 | } |
88 | |
89 | #if TEST_STD_VER > 17 |
90 | static_assert(test_constexpr()); |
91 | #endif |
92 | |
93 | return 0; |
94 | } |
95 | |