xref: /llvm-project/libcxx/test/std/algorithms/alg.nonmodifying/alg.equal/pstl.equal.pass.cpp (revision ed27a4edb03809f0fe38f780765acfb97346c127)
1*ed27a4edSNikolas Klauser //===----------------------------------------------------------------------===//
2*ed27a4edSNikolas Klauser //
3*ed27a4edSNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*ed27a4edSNikolas Klauser // See https://llvm.org/LICENSE.txt for license information.
5*ed27a4edSNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*ed27a4edSNikolas Klauser //
7*ed27a4edSNikolas Klauser //===----------------------------------------------------------------------===//
8*ed27a4edSNikolas Klauser 
9*ed27a4edSNikolas Klauser // UNSUPPORTED: c++03, c++11, c++14
10*ed27a4edSNikolas Klauser 
11*ed27a4edSNikolas Klauser // UNSUPPORTED: libcpp-has-no-incomplete-pstl
12*ed27a4edSNikolas Klauser 
13*ed27a4edSNikolas Klauser // <algorithm>
14*ed27a4edSNikolas Klauser 
15*ed27a4edSNikolas Klauser // template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
16*ed27a4edSNikolas Klauser //   bool equal(ExecutionPolicy&& exec,
17*ed27a4edSNikolas Klauser //              ForwardIterator1 first1, ForwardIterator1 last1,
18*ed27a4edSNikolas Klauser //              ForwardIterator2 first2);
19*ed27a4edSNikolas Klauser //
20*ed27a4edSNikolas Klauser // template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2,
21*ed27a4edSNikolas Klauser //          class BinaryPredicate>
22*ed27a4edSNikolas Klauser //   bool equal(ExecutionPolicy&& exec,
23*ed27a4edSNikolas Klauser //              ForwardIterator1 first1, ForwardIterator1 last1,
24*ed27a4edSNikolas Klauser //              ForwardIterator2 first2, BinaryPredicate pred);
25*ed27a4edSNikolas Klauser //
26*ed27a4edSNikolas Klauser // template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2>
27*ed27a4edSNikolas Klauser //   bool equal(ExecutionPolicy&& exec,
28*ed27a4edSNikolas Klauser //              ForwardIterator1 first1, ForwardIterator1 last1,
29*ed27a4edSNikolas Klauser //              ForwardIterator2 first2, ForwardIterator2 last2);
30*ed27a4edSNikolas Klauser //
31*ed27a4edSNikolas Klauser // template<class ExecutionPolicy, class ForwardIterator1, class ForwardIterator2,
32*ed27a4edSNikolas Klauser //          class BinaryPredicate>
33*ed27a4edSNikolas Klauser //   bool equal(ExecutionPolicy&& exec,
34*ed27a4edSNikolas Klauser //              ForwardIterator1 first1, ForwardIterator1 last1,
35*ed27a4edSNikolas Klauser //              ForwardIterator2 first2, ForwardIterator2 last2,
36*ed27a4edSNikolas Klauser //              BinaryPredicate pred);
37*ed27a4edSNikolas Klauser 
38*ed27a4edSNikolas Klauser #include <algorithm>
39*ed27a4edSNikolas Klauser #include <cassert>
40*ed27a4edSNikolas Klauser #include <iterator>
41*ed27a4edSNikolas Klauser 
42*ed27a4edSNikolas Klauser #include "test_execution_policies.h"
43*ed27a4edSNikolas Klauser #include "test_iterators.h"
44*ed27a4edSNikolas Klauser #include "test_macros.h"
45*ed27a4edSNikolas Klauser 
46*ed27a4edSNikolas Klauser template <class It1, class It2>
47*ed27a4edSNikolas Klauser struct Test {
48*ed27a4edSNikolas Klauser   template <class Policy>
operator ()Test49*ed27a4edSNikolas Klauser   void operator()(Policy&& policy) {
50*ed27a4edSNikolas Klauser     { // 3 iter overloads
51*ed27a4edSNikolas Klauser       // check with equal ranges
52*ed27a4edSNikolas Klauser       {
53*ed27a4edSNikolas Klauser         int a[] = {1, 2, 3, 4};
54*ed27a4edSNikolas Klauser         int b[] = {1, 2, 3, 4};
55*ed27a4edSNikolas Klauser         assert(std::equal(policy, It1(std::begin(a)), It1(std::end(a)), It2(std::begin(b))));
56*ed27a4edSNikolas Klauser       }
57*ed27a4edSNikolas Klauser 
58*ed27a4edSNikolas Klauser       // check with an empty range
59*ed27a4edSNikolas Klauser       {
60*ed27a4edSNikolas Klauser         int a[] = {999};
61*ed27a4edSNikolas Klauser         int b[] = {1, 2, 3};
62*ed27a4edSNikolas Klauser         assert(std::equal(policy, It1(std::begin(a)), It1(std::begin(a)), It2(std::begin(b))));
63*ed27a4edSNikolas Klauser       }
64*ed27a4edSNikolas Klauser 
65*ed27a4edSNikolas Klauser       // check with different ranges
66*ed27a4edSNikolas Klauser       {
67*ed27a4edSNikolas Klauser         int a[] = {1, 2, 3};
68*ed27a4edSNikolas Klauser         int b[] = {3, 2, 1};
69*ed27a4edSNikolas Klauser         assert(!std::equal(policy, It1(std::begin(a)), It1(std::end(a)), It2(std::begin(b))));
70*ed27a4edSNikolas Klauser       }
71*ed27a4edSNikolas Klauser 
72*ed27a4edSNikolas Klauser       // check that the predicate is used
73*ed27a4edSNikolas Klauser       {
74*ed27a4edSNikolas Klauser         int a[] = {2, 4, 6, 8, 10};
75*ed27a4edSNikolas Klauser         int b[] = {12, 14, 16, 18, 20};
76*ed27a4edSNikolas Klauser         assert(std::equal(policy, It1(std::begin(a)), It1(std::end(a)), It2(std::begin(b)), [](int lhs, int rhs) {
77*ed27a4edSNikolas Klauser           return lhs % 2 == rhs % 2;
78*ed27a4edSNikolas Klauser         }));
79*ed27a4edSNikolas Klauser       }
80*ed27a4edSNikolas Klauser     }
81*ed27a4edSNikolas Klauser 
82*ed27a4edSNikolas Klauser     { // 4 iter overloads
83*ed27a4edSNikolas Klauser       // check with equal ranges of equal size
84*ed27a4edSNikolas Klauser       {
85*ed27a4edSNikolas Klauser         int a[] = {1, 2, 3, 4};
86*ed27a4edSNikolas Klauser         int b[] = {1, 2, 3, 4};
87*ed27a4edSNikolas Klauser         assert(std::equal(policy, It1(std::begin(a)), It1(std::end(a)), It2(std::begin(b)), It2(std::end(b))));
88*ed27a4edSNikolas Klauser       }
89*ed27a4edSNikolas Klauser 
90*ed27a4edSNikolas Klauser       // check with unequal ranges of equal size
91*ed27a4edSNikolas Klauser       {
92*ed27a4edSNikolas Klauser         int a[] = {1, 2, 3, 4};
93*ed27a4edSNikolas Klauser         int b[] = {4, 3, 2, 1};
94*ed27a4edSNikolas Klauser         assert(!std::equal(policy, It1(std::begin(a)), It1(std::end(a)), It2(std::begin(b)), It2(std::end(b))));
95*ed27a4edSNikolas Klauser       }
96*ed27a4edSNikolas Klauser 
97*ed27a4edSNikolas Klauser       // check with equal ranges of unequal size
98*ed27a4edSNikolas Klauser       {
99*ed27a4edSNikolas Klauser         {
100*ed27a4edSNikolas Klauser           int a[] = {1, 2, 3, 4};
101*ed27a4edSNikolas Klauser           int b[] = {1, 2, 3, 4, 5};
102*ed27a4edSNikolas Klauser           assert(!std::equal(policy, It1(std::begin(a)), It1(std::end(a)), It2(std::begin(b)), It2(std::end(b))));
103*ed27a4edSNikolas Klauser         }
104*ed27a4edSNikolas Klauser         {
105*ed27a4edSNikolas Klauser           int a[] = {1, 2, 3, 4, 5};
106*ed27a4edSNikolas Klauser           int b[] = {1, 2, 3, 4};
107*ed27a4edSNikolas Klauser           assert(!std::equal(policy, It1(std::begin(a)), It1(std::end(a)), It2(std::begin(b)), It2(std::end(b))));
108*ed27a4edSNikolas Klauser         }
109*ed27a4edSNikolas Klauser       }
110*ed27a4edSNikolas Klauser 
111*ed27a4edSNikolas Klauser       // check empty ranges
112*ed27a4edSNikolas Klauser       {
113*ed27a4edSNikolas Klauser         // empty/empty
114*ed27a4edSNikolas Klauser         {
115*ed27a4edSNikolas Klauser           int a[] = {888};
116*ed27a4edSNikolas Klauser           int b[] = {999};
117*ed27a4edSNikolas Klauser           assert(std::equal(policy, It1(std::begin(a)), It1(std::begin(a)), It2(std::begin(b)), It2(std::begin(b))));
118*ed27a4edSNikolas Klauser         }
119*ed27a4edSNikolas Klauser         // empty/non-empty
120*ed27a4edSNikolas Klauser         {
121*ed27a4edSNikolas Klauser           int a[] = {999};
122*ed27a4edSNikolas Klauser           int b[] = {999};
123*ed27a4edSNikolas Klauser           assert(!std::equal(policy, It1(std::begin(a)), It1(std::begin(a)), It2(std::begin(b)), It2(std::end(b))));
124*ed27a4edSNikolas Klauser         }
125*ed27a4edSNikolas Klauser         // non-empty/empty
126*ed27a4edSNikolas Klauser         {
127*ed27a4edSNikolas Klauser           int a[] = {999};
128*ed27a4edSNikolas Klauser           int b[] = {999};
129*ed27a4edSNikolas Klauser           assert(!std::equal(policy, It1(std::begin(a)), It1(std::end(a)), It2(std::begin(b)), It2(std::begin(b))));
130*ed27a4edSNikolas Klauser         }
131*ed27a4edSNikolas Klauser       }
132*ed27a4edSNikolas Klauser 
133*ed27a4edSNikolas Klauser       // check that the predicate is used
134*ed27a4edSNikolas Klauser       {
135*ed27a4edSNikolas Klauser         int a[] = {2, 4, 6, 8, 10};
136*ed27a4edSNikolas Klauser         int b[] = {12, 14, 16, 18, 20};
137*ed27a4edSNikolas Klauser         assert(std::equal(
138*ed27a4edSNikolas Klauser             policy, It1(std::begin(a)), It1(std::end(a)), It2(std::begin(b)), It2(std::end(b)), [](int lhs, int rhs) {
139*ed27a4edSNikolas Klauser               return lhs % 2 == rhs % 2;
140*ed27a4edSNikolas Klauser             }));
141*ed27a4edSNikolas Klauser       }
142*ed27a4edSNikolas Klauser     }
143*ed27a4edSNikolas Klauser   }
144*ed27a4edSNikolas Klauser };
145*ed27a4edSNikolas Klauser 
main(int,char **)146*ed27a4edSNikolas Klauser int main(int, char**) {
147*ed27a4edSNikolas Klauser   types::for_each(types::forward_iterator_list<int*>{}, types::apply_type_identity{[](auto v) {
148*ed27a4edSNikolas Klauser                     using It1 = typename decltype(v)::type;
149*ed27a4edSNikolas Klauser                     types::for_each(
150*ed27a4edSNikolas Klauser                         types::forward_iterator_list<int*>{},
151*ed27a4edSNikolas Klauser                         TestIteratorWithPolicies<types::partial_instantiation<Test, It1>::template apply>{});
152*ed27a4edSNikolas Klauser                   }});
153*ed27a4edSNikolas Klauser   return 0;
154*ed27a4edSNikolas Klauser }
155