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