xref: /llvm-project/libcxx/test/std/algorithms/alg.nonmodifying/mismatch/ranges_mismatch.pass.cpp (revision d05bada59205b9bcf1195a6eac7e09b721e3b79b)
1c2cd15a6SNikolas Klauser //===----------------------------------------------------------------------===//
2c2cd15a6SNikolas Klauser //
3c2cd15a6SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4c2cd15a6SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information.
5c2cd15a6SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6c2cd15a6SNikolas Klauser //
7c2cd15a6SNikolas Klauser //===----------------------------------------------------------------------===//
8c2cd15a6SNikolas Klauser 
9c2cd15a6SNikolas Klauser // UNSUPPORTED: c++03, c++11, c++14, c++17
10c2cd15a6SNikolas Klauser 
11c2cd15a6SNikolas Klauser // template <input_iterator I1, sentinel_for<_I1> S1, input_iterator I2, sentinel_for<_I2> S2,
12c2cd15a6SNikolas Klauser //           class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity>
13c2cd15a6SNikolas Klauser //   requires indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
14c2cd15a6SNikolas Klauser // constexpr mismatch_result<_I1, _I2>
15c2cd15a6SNikolas Klauser // ranges::mismatch()(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {})
16c2cd15a6SNikolas Klauser 
17c2cd15a6SNikolas Klauser // template <input_range R1, input_range R2,
18c2cd15a6SNikolas Klauser //           class Pred = ranges::equal_to, class Proj1 = identity, class Proj2 = identity>
19c2cd15a6SNikolas Klauser //   requires indirectly_comparable<iterator_t<R1>, iterator_t<R2>, Pred, Proj1, Proj2>
20c2cd15a6SNikolas Klauser // constexpr mismatch_result<borrowed_iterator_t<R1>, borrowed_iterator_t<R2>>
21c2cd15a6SNikolas Klauser // ranges::mismatch(R1&& r1, R2&& r2, Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {})
22c2cd15a6SNikolas Klauser 
23c2cd15a6SNikolas Klauser #include <algorithm>
24c2cd15a6SNikolas Klauser #include <array>
25c2cd15a6SNikolas Klauser #include <cassert>
26faef447eSNikolas Klauser #include <functional>
27c2cd15a6SNikolas Klauser #include <ranges>
28c2cd15a6SNikolas Klauser 
29c2cd15a6SNikolas Klauser #include "test_iterators.h"
30c2cd15a6SNikolas Klauser 
31c2cd15a6SNikolas Klauser template <class Iter1, class Iter2>
test_iterators(Iter1 begin1,Iter1 end1,Iter2 begin2,Iter2 end2,int * expected1,int * expected2)32c2cd15a6SNikolas Klauser constexpr void test_iterators(Iter1 begin1, Iter1 end1, Iter2 begin2, Iter2 end2, int* expected1, int* expected2) {
33c2cd15a6SNikolas Klauser   using Expected = std::ranges::mismatch_result<Iter1, Iter2>;
34c2cd15a6SNikolas Klauser   std::same_as<Expected> auto ret = std::ranges::mismatch(std::move(begin1), sentinel_wrapper<Iter1>(std::move(end1)),
35c2cd15a6SNikolas Klauser                                                           std::move(begin2), sentinel_wrapper<Iter2>(std::move(end2)));
36c2cd15a6SNikolas Klauser   assert(base(ret.in1) == expected1);
37c2cd15a6SNikolas Klauser   assert(base(ret.in2) == expected2);
38c2cd15a6SNikolas Klauser }
39c2cd15a6SNikolas Klauser 
40c2cd15a6SNikolas Klauser template <class Iter1, class Iter2>
test_iters()41c2cd15a6SNikolas Klauser constexpr void test_iters() {
42c2cd15a6SNikolas Klauser   int a[] = {1, 2, 3, 4, 5};
43c2cd15a6SNikolas Klauser   int b[] = {1, 2, 3, 5, 4};
44c2cd15a6SNikolas Klauser 
45c2cd15a6SNikolas Klauser   test_iterators(Iter1(a), Iter1(a + 5), Iter2(b), Iter2(b + 5), a + 3, b + 3);
46c2cd15a6SNikolas Klauser }
47c2cd15a6SNikolas Klauser 
test()48c2cd15a6SNikolas Klauser constexpr bool test() {
49c2cd15a6SNikolas Klauser   test_iters<cpp17_input_iterator<int*>, cpp17_input_iterator<int*>>();
50c2cd15a6SNikolas Klauser   test_iters<cpp17_input_iterator<int*>, cpp20_input_iterator<int*>>();
51c2cd15a6SNikolas Klauser   test_iters<cpp17_input_iterator<int*>, forward_iterator<int*>>();
52c2cd15a6SNikolas Klauser   test_iters<cpp17_input_iterator<int*>, bidirectional_iterator<int*>>();
53c2cd15a6SNikolas Klauser   test_iters<cpp17_input_iterator<int*>, random_access_iterator<int*>>();
54c2cd15a6SNikolas Klauser   test_iters<cpp17_input_iterator<int*>, contiguous_iterator<int*>>();
55c2cd15a6SNikolas Klauser   test_iters<cpp17_input_iterator<int*>, int*>();
56c2cd15a6SNikolas Klauser 
57c2cd15a6SNikolas Klauser   test_iters<cpp20_input_iterator<int*>, cpp17_input_iterator<int*>>();
58c2cd15a6SNikolas Klauser   test_iters<cpp20_input_iterator<int*>, cpp20_input_iterator<int*>>();
59c2cd15a6SNikolas Klauser   test_iters<cpp20_input_iterator<int*>, forward_iterator<int*>>();
60c2cd15a6SNikolas Klauser   test_iters<cpp20_input_iterator<int*>, bidirectional_iterator<int*>>();
61c2cd15a6SNikolas Klauser   test_iters<cpp20_input_iterator<int*>, random_access_iterator<int*>>();
62c2cd15a6SNikolas Klauser   test_iters<cpp20_input_iterator<int*>, contiguous_iterator<int*>>();
63c2cd15a6SNikolas Klauser   test_iters<cpp20_input_iterator<int*>, int*>();
64c2cd15a6SNikolas Klauser 
65c2cd15a6SNikolas Klauser   test_iters<forward_iterator<int*>, cpp17_input_iterator<int*>>();
66c2cd15a6SNikolas Klauser   test_iters<forward_iterator<int*>, cpp20_input_iterator<int*>>();
67c2cd15a6SNikolas Klauser   test_iters<forward_iterator<int*>, forward_iterator<int*>>();
68c2cd15a6SNikolas Klauser   test_iters<forward_iterator<int*>, bidirectional_iterator<int*>>();
69c2cd15a6SNikolas Klauser   test_iters<forward_iterator<int*>, random_access_iterator<int*>>();
70c2cd15a6SNikolas Klauser   test_iters<forward_iterator<int*>, contiguous_iterator<int*>>();
71c2cd15a6SNikolas Klauser   test_iters<forward_iterator<int*>, int*>();
72c2cd15a6SNikolas Klauser 
73c2cd15a6SNikolas Klauser   test_iters<bidirectional_iterator<int*>, cpp17_input_iterator<int*>>();
74c2cd15a6SNikolas Klauser   test_iters<bidirectional_iterator<int*>, cpp20_input_iterator<int*>>();
75c2cd15a6SNikolas Klauser   test_iters<bidirectional_iterator<int*>, forward_iterator<int*>>();
76c2cd15a6SNikolas Klauser   test_iters<bidirectional_iterator<int*>, bidirectional_iterator<int*>>();
77c2cd15a6SNikolas Klauser   test_iters<bidirectional_iterator<int*>, random_access_iterator<int*>>();
78c2cd15a6SNikolas Klauser   test_iters<bidirectional_iterator<int*>, contiguous_iterator<int*>>();
79c2cd15a6SNikolas Klauser   test_iters<bidirectional_iterator<int*>, int*>();
80c2cd15a6SNikolas Klauser 
81c2cd15a6SNikolas Klauser   test_iters<random_access_iterator<int*>, cpp17_input_iterator<int*>>();
82c2cd15a6SNikolas Klauser   test_iters<random_access_iterator<int*>, cpp20_input_iterator<int*>>();
83c2cd15a6SNikolas Klauser   test_iters<random_access_iterator<int*>, forward_iterator<int*>>();
84c2cd15a6SNikolas Klauser   test_iters<random_access_iterator<int*>, bidirectional_iterator<int*>>();
85c2cd15a6SNikolas Klauser   test_iters<random_access_iterator<int*>, random_access_iterator<int*>>();
86c2cd15a6SNikolas Klauser   test_iters<random_access_iterator<int*>, contiguous_iterator<int*>>();
87c2cd15a6SNikolas Klauser   test_iters<random_access_iterator<int*>, int*>();
88c2cd15a6SNikolas Klauser 
89c2cd15a6SNikolas Klauser   test_iters<contiguous_iterator<int*>, cpp17_input_iterator<int*>>();
90c2cd15a6SNikolas Klauser   test_iters<contiguous_iterator<int*>, cpp20_input_iterator<int*>>();
91c2cd15a6SNikolas Klauser   test_iters<contiguous_iterator<int*>, forward_iterator<int*>>();
92c2cd15a6SNikolas Klauser   test_iters<contiguous_iterator<int*>, bidirectional_iterator<int*>>();
93c2cd15a6SNikolas Klauser   test_iters<contiguous_iterator<int*>, random_access_iterator<int*>>();
94c2cd15a6SNikolas Klauser   test_iters<contiguous_iterator<int*>, contiguous_iterator<int*>>();
95c2cd15a6SNikolas Klauser   test_iters<contiguous_iterator<int*>, int*>();
96c2cd15a6SNikolas Klauser 
97c2cd15a6SNikolas Klauser   test_iters<int*, cpp17_input_iterator<int*>>();
98c2cd15a6SNikolas Klauser   test_iters<int*, cpp20_input_iterator<int*>>();
99c2cd15a6SNikolas Klauser   test_iters<int*, forward_iterator<int*>>();
100c2cd15a6SNikolas Klauser   test_iters<int*, bidirectional_iterator<int*>>();
101c2cd15a6SNikolas Klauser   test_iters<int*, random_access_iterator<int*>>();
102c2cd15a6SNikolas Klauser   test_iters<int*, contiguous_iterator<int*>>();
103c2cd15a6SNikolas Klauser   test_iters<int*, int*>();
104c2cd15a6SNikolas Klauser 
105c2cd15a6SNikolas Klauser   { // test with a range
106c2cd15a6SNikolas Klauser     std::array<int, 5> a = {1, 2, 3, 4, 5};
107c2cd15a6SNikolas Klauser     std::array<int, 5> b = {1, 2, 3, 5, 4};
108*d05bada5SDuo Wang     using Expected = std::ranges::mismatch_result<std::array<int, 5>::iterator, std::array<int, 5>::iterator>;
109c2cd15a6SNikolas Klauser     std::same_as<Expected> auto ret = std::ranges::mismatch(a, b);
110c2cd15a6SNikolas Klauser     assert(ret.in1 == a.begin() + 3);
111c2cd15a6SNikolas Klauser     assert(ret.in2 == b.begin() + 3);
112c2cd15a6SNikolas Klauser   }
113c2cd15a6SNikolas Klauser 
114c2cd15a6SNikolas Klauser   { // test with non-iterator sentinel
115c2cd15a6SNikolas Klauser     int a[] = {1, 2, 3, 4, 5};
116c2cd15a6SNikolas Klauser     int b[] = {1, 2, 3, 5, 4};
117c2cd15a6SNikolas Klauser 
118c2cd15a6SNikolas Klauser     using Iter = int*;
119c2cd15a6SNikolas Klauser     using Sentinel = sentinel_wrapper<Iter>;
120c2cd15a6SNikolas Klauser     using Expected = std::ranges::mismatch_result<Iter, Iter>;
121c2cd15a6SNikolas Klauser 
122c2cd15a6SNikolas Klauser     std::same_as<Expected> auto r = std::ranges::mismatch(Iter(a), Sentinel(a + 5), Iter(b), Sentinel(b + 5));
123c2cd15a6SNikolas Klauser     assert(r.in1 == a + 3);
124c2cd15a6SNikolas Klauser     assert(r.in2 == b + 3);
125c2cd15a6SNikolas Klauser   }
126c2cd15a6SNikolas Klauser 
127c2cd15a6SNikolas Klauser   { // test with different array sizes
128c2cd15a6SNikolas Klauser     {
129c2cd15a6SNikolas Klauser       int a[] = {1, 2, 3};
130c2cd15a6SNikolas Klauser       int b[] = {1, 2};
131c2cd15a6SNikolas Klauser       test_iterators(a, a + 3, b, b + 2, a + 2, b + 2);
132c2cd15a6SNikolas Klauser       using Expected = std::ranges::mismatch_result<int*, int*>;
133c2cd15a6SNikolas Klauser       std::same_as<Expected> auto ret = std::ranges::mismatch(a, b);
134c2cd15a6SNikolas Klauser       assert(ret.in1 == a + 2);
135c2cd15a6SNikolas Klauser       assert(ret.in2 == b + 2);
136c2cd15a6SNikolas Klauser     }
137c2cd15a6SNikolas Klauser     {
138c2cd15a6SNikolas Klauser       int a[] = {1, 2};
139c2cd15a6SNikolas Klauser       int b[] = {1, 2, 3};
140c2cd15a6SNikolas Klauser       test_iterators(a, a + 2, b, b + 3, a + 2, b + 2);
141c2cd15a6SNikolas Klauser       using Expected = std::ranges::mismatch_result<int*, int*>;
142c2cd15a6SNikolas Klauser       std::same_as<Expected> auto ret = std::ranges::mismatch(a, b);
143c2cd15a6SNikolas Klauser       assert(ret.in1 == a + 2);
144c2cd15a6SNikolas Klauser       assert(ret.in2 == b + 2);
145c2cd15a6SNikolas Klauser     }
146c2cd15a6SNikolas Klauser   }
147c2cd15a6SNikolas Klauser 
148c2cd15a6SNikolas Klauser   { // test with borrowed ranges
149c2cd15a6SNikolas Klauser     int r1[] = {1, 2, 3, 4, 5};
150c2cd15a6SNikolas Klauser     int r2[] = {1, 2, 3, 5, 4};
151c2cd15a6SNikolas Klauser 
152c2cd15a6SNikolas Klauser     using Expected = std::ranges::mismatch_result<int*, int*>;
153c2cd15a6SNikolas Klauser     {
154c2cd15a6SNikolas Klauser       std::same_as<Expected> auto ret = std::ranges::mismatch(r1, std::views::all(r2));
155c2cd15a6SNikolas Klauser       assert(ret.in1 == r1 + 3);
156c2cd15a6SNikolas Klauser       assert(ret.in2 == r2 + 3);
157c2cd15a6SNikolas Klauser     }
158c2cd15a6SNikolas Klauser     {
159c2cd15a6SNikolas Klauser       std::same_as<Expected> auto ret = std::ranges::mismatch(std::views::all(r1), r2);
160c2cd15a6SNikolas Klauser       assert(ret.in1 == r1 + 3);
161c2cd15a6SNikolas Klauser       assert(ret.in2 == r2 + 3);
162c2cd15a6SNikolas Klauser     }
163c2cd15a6SNikolas Klauser     {
164c2cd15a6SNikolas Klauser       std::same_as<Expected> auto ret = std::ranges::mismatch(std::views::all(r1), std::views::all(r2));
165c2cd15a6SNikolas Klauser       assert(ret.in1 == r1 + 3);
166c2cd15a6SNikolas Klauser       assert(ret.in2 == r2 + 3);
167c2cd15a6SNikolas Klauser     }
168c2cd15a6SNikolas Klauser   }
169c2cd15a6SNikolas Klauser 
170c2cd15a6SNikolas Klauser   { // test structured bindings
171c2cd15a6SNikolas Klauser     int a[] = {1, 2, 3, 4};
172c2cd15a6SNikolas Klauser     int b[] = {1, 2, 4, 8, 16};
173c2cd15a6SNikolas Klauser     auto [ai, bi] = std::ranges::mismatch(a, b);
174c2cd15a6SNikolas Klauser     assert(ai == a + 2);
175c2cd15a6SNikolas Klauser     assert(bi == b + 2);
176c2cd15a6SNikolas Klauser     auto [aj, bj] = std::ranges::mismatch(a, a+4, b, b+5);
177c2cd15a6SNikolas Klauser     assert(aj == a + 2);
178c2cd15a6SNikolas Klauser     assert(bj == b + 2);
179c2cd15a6SNikolas Klauser   }
180c2cd15a6SNikolas Klauser 
181c2cd15a6SNikolas Klauser   { // test predicate
182c2cd15a6SNikolas Klauser     {
183c2cd15a6SNikolas Klauser       int a[] = {7, 6, 9, 3, 5, 1, 2, 4};
184c2cd15a6SNikolas Klauser       int b[] = {6, 5, 8, 2, 5, 1, 2, 4};
185c2cd15a6SNikolas Klauser       auto ret = std::ranges::mismatch(a, a + 8, b, b + 8, std::ranges::greater{});
186c2cd15a6SNikolas Klauser       assert(ret.in1 == a + 4);
187c2cd15a6SNikolas Klauser       assert(ret.in2 == b + 4);
188c2cd15a6SNikolas Klauser       assert(*ret.in1 == 5);
189c2cd15a6SNikolas Klauser       assert(*ret.in2 == 5);
190c2cd15a6SNikolas Klauser     }
191c2cd15a6SNikolas Klauser 
192c2cd15a6SNikolas Klauser     {
193c2cd15a6SNikolas Klauser       int a[] = {7, 6, 9, 3, 5, 1, 2, 4};
194c2cd15a6SNikolas Klauser       int b[] = {6, 5, 8, 2, 5, 1, 2, 4};
195c2cd15a6SNikolas Klauser       auto ret = std::ranges::mismatch(a, b, std::ranges::greater{});
196c2cd15a6SNikolas Klauser       assert(ret.in1 == a + 4);
197c2cd15a6SNikolas Klauser       assert(ret.in2 == b + 4);
198c2cd15a6SNikolas Klauser       assert(*ret.in1 == 5);
199c2cd15a6SNikolas Klauser       assert(*ret.in2 == 5);
200c2cd15a6SNikolas Klauser     }
201c2cd15a6SNikolas Klauser   }
202c2cd15a6SNikolas Klauser 
203c2cd15a6SNikolas Klauser   { // test projection
204c2cd15a6SNikolas Klauser     {
205c2cd15a6SNikolas Klauser       int a[] = {7, 6, 9, 3, 5, 1, 2, 4};
206c2cd15a6SNikolas Klauser       int b[] = {6, 5, 8, 2, 5, 1, 2, 4};
207c2cd15a6SNikolas Klauser       auto ret = std::ranges::mismatch(a, b,
208c2cd15a6SNikolas Klauser                                        std::ranges::greater{},
209c2cd15a6SNikolas Klauser                                        [](int i) { return i == 5 ? +100 : i; },
210c2cd15a6SNikolas Klauser                                        [](int i) { return i == 5 ? -100 : i; });
211c2cd15a6SNikolas Klauser       assert(ret.in1 == a + 5);
212c2cd15a6SNikolas Klauser       assert(ret.in2 == b + 5);
213c2cd15a6SNikolas Klauser       assert(*ret.in1 == 1);
214c2cd15a6SNikolas Klauser       assert(*ret.in2 == 1);
215c2cd15a6SNikolas Klauser     }
216c2cd15a6SNikolas Klauser     {
217c2cd15a6SNikolas Klauser       int a[] = {7, 6, 9, 3, 5, 1, 2, 4};
218c2cd15a6SNikolas Klauser       auto ret = std::ranges::mismatch(a, a,
219c2cd15a6SNikolas Klauser                                        std::less<double>{},
220c2cd15a6SNikolas Klauser                                        [](int i) { return i * 1.01; },
221c2cd15a6SNikolas Klauser                                        [c = 0](int i) mutable { return c++ < 5 ? i * 1.02 : i; });
222c2cd15a6SNikolas Klauser       assert(ret.in1 == a + 5);
223c2cd15a6SNikolas Klauser       assert(ret.in2 == a + 5);
224c2cd15a6SNikolas Klauser       assert(*ret.in1 == 1);
225c2cd15a6SNikolas Klauser       assert(*ret.in2 == 1);
226c2cd15a6SNikolas Klauser     }
227c2cd15a6SNikolas Klauser     {
228c2cd15a6SNikolas Klauser       int a[] = {7, 6, 9, 3, 5, 1, 2, 4};
229c2cd15a6SNikolas Klauser       int b[] = {6, 5, 8, 2, 5, 1, 2, 4};
230c2cd15a6SNikolas Klauser       auto ret = std::ranges::mismatch(a, a + 8, b, b + 8,
231c2cd15a6SNikolas Klauser                                        std::ranges::greater{},
232c2cd15a6SNikolas Klauser                                        [](int i) { return i == 5 ? +100 : i; },
233c2cd15a6SNikolas Klauser                                        [](int i) { return i == 5 ? -100 : i; });
234c2cd15a6SNikolas Klauser       assert(ret.in1 == a + 5);
235c2cd15a6SNikolas Klauser       assert(ret.in2 == b + 5);
236c2cd15a6SNikolas Klauser       assert(*ret.in1 == 1);
237c2cd15a6SNikolas Klauser       assert(*ret.in2 == 1);
238c2cd15a6SNikolas Klauser     }
239c2cd15a6SNikolas Klauser     {
240c2cd15a6SNikolas Klauser       int a[] = {7, 6, 9, 3, 5, 1, 2, 4};
241c2cd15a6SNikolas Klauser       auto ret = std::ranges::mismatch(a, a + 8, a, a + 8,
242c2cd15a6SNikolas Klauser                                        std::less<double>{},
243c2cd15a6SNikolas Klauser                                        [](int i) { return i * 1.01; },
244c2cd15a6SNikolas Klauser                                        [c = 0](int i) mutable { return c++ < 5 ? i * 1.02 : i; });
245c2cd15a6SNikolas Klauser       assert(ret.in1 == a + 5);
246c2cd15a6SNikolas Klauser       assert(ret.in2 == a + 5);
247c2cd15a6SNikolas Klauser       assert(*ret.in1 == 1);
248c2cd15a6SNikolas Klauser       assert(*ret.in2 == 1);
249c2cd15a6SNikolas Klauser     }
250c2cd15a6SNikolas Klauser   }
251c2cd15a6SNikolas Klauser 
252c2cd15a6SNikolas Klauser   { // test predicate and projection call count
253c2cd15a6SNikolas Klauser     {
254c2cd15a6SNikolas Klauser       int pred_count = 0;
255c2cd15a6SNikolas Klauser       int proj1_count = 0;
256c2cd15a6SNikolas Klauser       int proj2_count = 0;
257c2cd15a6SNikolas Klauser       int a[] = {7, 6, 9, 3, 5, 1, 2, 4};
258c2cd15a6SNikolas Klauser       auto ret = std::ranges::mismatch(a, a,
259c2cd15a6SNikolas Klauser                                        [&](int lhs, int rhs) { ++pred_count; return lhs == rhs; },
260c2cd15a6SNikolas Klauser                                        [&](int i) { ++proj1_count; return i; },
261c2cd15a6SNikolas Klauser                                        [&](int i) { ++proj2_count; return i; });
262c2cd15a6SNikolas Klauser       assert(ret.in1 == a + 8);
263c2cd15a6SNikolas Klauser       assert(ret.in2 == a + 8);
264c2cd15a6SNikolas Klauser       assert(pred_count == 8);
265c2cd15a6SNikolas Klauser       assert(proj1_count == 8);
266c2cd15a6SNikolas Klauser       assert(proj2_count == 8);
267c2cd15a6SNikolas Klauser     }
268c2cd15a6SNikolas Klauser     {
269c2cd15a6SNikolas Klauser       int pred_count = 0;
270c2cd15a6SNikolas Klauser       int proj1_count = 0;
271c2cd15a6SNikolas Klauser       int proj2_count = 0;
272c2cd15a6SNikolas Klauser       int a[] = {7, 6, 9, 3, 5, 1, 2, 4};
273c2cd15a6SNikolas Klauser       auto ret = std::ranges::mismatch(a, a + 8, a, a + 8,
274c2cd15a6SNikolas Klauser                                        [&](int lhs, int rhs) { ++pred_count; return lhs == rhs; },
275c2cd15a6SNikolas Klauser                                        [&](int i) { ++proj1_count; return i; },
276c2cd15a6SNikolas Klauser                                        [&](int i) { ++proj2_count; return i; });
277c2cd15a6SNikolas Klauser       assert(ret.in1 == a + 8);
278c2cd15a6SNikolas Klauser       assert(ret.in2 == a + 8);
279c2cd15a6SNikolas Klauser       assert(pred_count == 8);
280c2cd15a6SNikolas Klauser       assert(proj1_count == 8);
281c2cd15a6SNikolas Klauser       assert(proj2_count == 8);
282c2cd15a6SNikolas Klauser     }
283c2cd15a6SNikolas Klauser   }
284c2cd15a6SNikolas Klauser 
285c2cd15a6SNikolas Klauser   return true;
286c2cd15a6SNikolas Klauser }
287c2cd15a6SNikolas Klauser 
main(int,char **)288c2cd15a6SNikolas Klauser int main(int, char**) {
289c2cd15a6SNikolas Klauser   test();
290c2cd15a6SNikolas Klauser   static_assert(test());
291c2cd15a6SNikolas Klauser 
292c2cd15a6SNikolas Klauser   return 0;
293c2cd15a6SNikolas Klauser }
294