1042dc3c4SHui Xie //===----------------------------------------------------------------------===//
2042dc3c4SHui Xie //
3042dc3c4SHui Xie // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4042dc3c4SHui Xie // See https://llvm.org/LICENSE.txt for license information.
5042dc3c4SHui Xie // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6042dc3c4SHui Xie //
7042dc3c4SHui Xie //===----------------------------------------------------------------------===//
8042dc3c4SHui Xie
9042dc3c4SHui Xie // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20
10042dc3c4SHui Xie
11042dc3c4SHui Xie // constexpr auto end() requires(!(simple-view<Views> && ...))
12042dc3c4SHui Xie // constexpr auto end() const requires(range<const Views>&&...)
13042dc3c4SHui Xie
14042dc3c4SHui Xie #include <ranges>
15042dc3c4SHui Xie #include <tuple>
16042dc3c4SHui Xie
17042dc3c4SHui Xie #include "types.h"
18042dc3c4SHui Xie
19042dc3c4SHui Xie // ID | simple | common | bidi | random | sized | #views | v.end() | as_const(v)
20042dc3c4SHui Xie // | | | | access | | | | .end()
21042dc3c4SHui Xie // ---|--------|--------|------|--------|-------|--------|----------------|---------------
22042dc3c4SHui Xie // 1 | Y | Y | Y | Y | Y | 1 | iterator<true> | iterator<true>
23042dc3c4SHui Xie // 2 | Y | Y | Y | Y | Y | >1 | iterator<true> | iterator<true>
24042dc3c4SHui Xie // 3 | Y | N | Y | Y | N | 1 | sentinel<true> | sentinel<true>
25042dc3c4SHui Xie // 4 | Y | N | Y | Y | N | >1 | sentinel<true> | sentinel<true>
26042dc3c4SHui Xie // 5 | Y | Y | Y | N | Y | 1 | iterator<true> | iterator<true>
27042dc3c4SHui Xie // 6 | Y | Y | Y | N | Y | >1 | sentinel<true> | sentinel<true>
28042dc3c4SHui Xie // 7 | Y | Y | Y | N | N | 1 | iterator<true> | iterator<true>
29042dc3c4SHui Xie // 8 | Y | Y | Y | N | N | >1 | sentinel<true> | sentinel<true>
30042dc3c4SHui Xie // 9 | Y | Y | N | N | Y | 1 | iterator<true> | iterator<true>
31042dc3c4SHui Xie // 10 | Y | Y | N | N | Y | >1 | iterator<true> | iterator<true>
32042dc3c4SHui Xie // 11 | Y | Y | N | N | N | 1 | iterator<true> | iterator<true>
33042dc3c4SHui Xie // 12 | Y | Y | N | N | N | >1 | iterator<true> | iterator<true>
34042dc3c4SHui Xie // 13 | Y | N | Y | Y | Y | 1 | iterator<true> | iterator<true>
35042dc3c4SHui Xie // 14 | Y | N | Y | Y | Y | >1 | iterator<true> | iterator<true>
36042dc3c4SHui Xie // 15 | Y | N | Y | N | Y | 1 | sentinel<true> | sentinel<true>
37042dc3c4SHui Xie // 16 | Y | N | Y | N | Y | >1 | sentinel<true> | sentinel<true>
38042dc3c4SHui Xie // 17 | Y | N | Y | N | N | 1 | sentinel<true> | sentinel<true>
39042dc3c4SHui Xie // 18 | Y | N | Y | N | N | >1 | sentinel<true> | sentinel<true>
40042dc3c4SHui Xie // 19 | Y | N | N | N | Y | 1 | sentinel<true> | sentinel<true>
41042dc3c4SHui Xie // 20 | Y | N | N | N | Y | >1 | sentinel<true> | sentinel<true>
42042dc3c4SHui Xie // 21 | Y | N | N | N | N | 1 | sentinel<true> | sentinel<true>
43042dc3c4SHui Xie // 22 | Y | N | N | N | N | >1 | sentinel<true> | sentinel<true>
44042dc3c4SHui Xie // 23 | N | Y | Y | Y | Y | 1 | iterator<false>| iterator<true>
45042dc3c4SHui Xie // 24 | N | Y | Y | Y | Y | >1 | iterator<false>| iterator<true>
46042dc3c4SHui Xie // 25 | N | N | Y | Y | N | 1 | sentinel<false>| sentinel<true>
47042dc3c4SHui Xie // 26 | N | N | Y | Y | N | >1 | sentinel<false>| sentinel<true>
48042dc3c4SHui Xie // 27 | N | Y | Y | N | Y | 1 | iterator<false>| iterator<true>
49042dc3c4SHui Xie // 28 | N | Y | Y | N | Y | >1 | sentinel<false>| sentinel<true>
50042dc3c4SHui Xie // 29 | N | Y | Y | N | N | 1 | iterator<false>| iterator<true>
51042dc3c4SHui Xie // 30 | N | Y | Y | N | N | >1 | sentinel<false>| sentinel<true>
52042dc3c4SHui Xie // 31 | N | Y | N | N | Y | 1 | iterator<false>| iterator<true>
53042dc3c4SHui Xie // 32 | N | Y | N | N | Y | >1 | iterator<false>| iterator<true>
54042dc3c4SHui Xie // 33 | N | Y | N | N | N | 1 | iterator<false>| iterator<true>
55042dc3c4SHui Xie // 34 | N | Y | N | N | N | >1 | iterator<false>| iterator<true>
56042dc3c4SHui Xie // 35 | N | N | Y | Y | Y | 1 | iterator<false>| iterator<true>
57042dc3c4SHui Xie // 36 | N | N | Y | Y | Y | >1 | iterator<false>| iterator<true>
58042dc3c4SHui Xie // 37 | N | N | Y | N | Y | 1 | sentinel<false>| sentinel<true>
59042dc3c4SHui Xie // 38 | N | N | Y | N | Y | >1 | sentinel<false>| sentinel<true>
60042dc3c4SHui Xie // 39 | N | N | Y | N | N | 1 | sentinel<false>| sentinel<true>
61042dc3c4SHui Xie // 40 | N | N | Y | N | N | >1 | sentinel<false>| sentinel<true>
62042dc3c4SHui Xie // 41 | N | N | N | N | Y | 1 | sentinel<false>| sentinel<true>
63042dc3c4SHui Xie // 42 | N | N | N | N | Y | >1 | sentinel<false>| sentinel<true>
64042dc3c4SHui Xie // 43 | N | N | N | N | N | 1 | sentinel<false>| sentinel<true>
65042dc3c4SHui Xie // 44 | N | N | N | N | N | >1 | sentinel<false>| sentinel<true>
66042dc3c4SHui Xie
test()67042dc3c4SHui Xie constexpr bool test() {
68042dc3c4SHui Xie int buffer1[5] = {1, 2, 3, 4, 5};
69042dc3c4SHui Xie int buffer2[1] = {1};
70042dc3c4SHui Xie int buffer3[3] = {1, 2, 3};
71042dc3c4SHui Xie {
72042dc3c4SHui Xie // test ID 1
73042dc3c4SHui Xie std::ranges::zip_view v{SimpleCommonRandomAccessSized(buffer1)};
74042dc3c4SHui Xie static_assert(std::ranges::common_range<decltype(v)>);
75042dc3c4SHui Xie assert(v.begin() + 5 == v.end());
76042dc3c4SHui Xie static_assert(std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
77042dc3c4SHui Xie }
78042dc3c4SHui Xie {
79042dc3c4SHui Xie // test ID 2
80042dc3c4SHui Xie std::ranges::zip_view v{SimpleCommonRandomAccessSized(buffer1), SimpleCommonRandomAccessSized(buffer2)};
81042dc3c4SHui Xie static_assert(std::ranges::common_range<decltype(v)>);
82042dc3c4SHui Xie assert(v.begin() + 1 == v.end());
83042dc3c4SHui Xie static_assert(std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
84042dc3c4SHui Xie }
85042dc3c4SHui Xie {
86042dc3c4SHui Xie // test ID 3
87042dc3c4SHui Xie std::ranges::zip_view v{NonSizedRandomAccessView(buffer1)};
88042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
89042dc3c4SHui Xie assert(v.begin() + 5 == v.end());
90042dc3c4SHui Xie static_assert(std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
91042dc3c4SHui Xie }
92042dc3c4SHui Xie {
93042dc3c4SHui Xie // test ID 4
94042dc3c4SHui Xie std::ranges::zip_view v{NonSizedRandomAccessView(buffer1), NonSizedRandomAccessView(buffer3)};
95042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
96042dc3c4SHui Xie assert(v.begin() + 3 == v.end());
97042dc3c4SHui Xie static_assert(std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
98042dc3c4SHui Xie }
99042dc3c4SHui Xie {
100042dc3c4SHui Xie // test ID 5
101042dc3c4SHui Xie std::ranges::zip_view v{SizedBidiCommon(buffer1)};
102042dc3c4SHui Xie static_assert(std::ranges::common_range<decltype(v)>);
103042dc3c4SHui Xie assert(std::next(v.begin(), 5) == v.end());
104042dc3c4SHui Xie static_assert(std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
105042dc3c4SHui Xie }
106042dc3c4SHui Xie {
107042dc3c4SHui Xie // test ID 6
108042dc3c4SHui Xie std::ranges::zip_view v{SizedBidiCommon(buffer1), SizedBidiCommon(buffer2)};
109042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
110042dc3c4SHui Xie assert(++v.begin() == v.end());
111042dc3c4SHui Xie static_assert(std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
112042dc3c4SHui Xie }
113042dc3c4SHui Xie {
114042dc3c4SHui Xie // test ID 7
115042dc3c4SHui Xie std::ranges::zip_view v{BidiCommonView(buffer1)};
116042dc3c4SHui Xie static_assert(std::ranges::common_range<decltype(v)>);
117042dc3c4SHui Xie assert(std::next(v.begin(), 5) == v.end());
118042dc3c4SHui Xie static_assert(std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
119042dc3c4SHui Xie }
120042dc3c4SHui Xie {
121042dc3c4SHui Xie // test ID 8
122042dc3c4SHui Xie std::ranges::zip_view v{BidiCommonView(buffer1), BidiCommonView(buffer2)};
123042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
124042dc3c4SHui Xie assert(++v.begin() == v.end());
125042dc3c4SHui Xie static_assert(std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
126042dc3c4SHui Xie }
127042dc3c4SHui Xie {
128042dc3c4SHui Xie // test ID 9
129042dc3c4SHui Xie std::ranges::zip_view v{ForwardSizedView(buffer1)};
130042dc3c4SHui Xie static_assert(std::ranges::common_range<decltype(v)>);
131042dc3c4SHui Xie assert(std::next(v.begin(), 5) == v.end());
132042dc3c4SHui Xie static_assert(std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
133042dc3c4SHui Xie }
134042dc3c4SHui Xie {
135042dc3c4SHui Xie // test ID 10
136042dc3c4SHui Xie std::ranges::zip_view v{ForwardSizedView(buffer1), ForwardSizedView(buffer2)};
137042dc3c4SHui Xie static_assert(std::ranges::common_range<decltype(v)>);
138042dc3c4SHui Xie assert(++v.begin() == v.end());
139042dc3c4SHui Xie static_assert(std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
140042dc3c4SHui Xie }
141042dc3c4SHui Xie {
142042dc3c4SHui Xie // test ID 11
143042dc3c4SHui Xie std::ranges::zip_view v{InputCommonView(buffer1)};
144042dc3c4SHui Xie static_assert(std::ranges::common_range<decltype(v)>);
145042dc3c4SHui Xie assert(std::ranges::next(v.begin(), 5) == v.end());
146042dc3c4SHui Xie static_assert(std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
147042dc3c4SHui Xie }
148042dc3c4SHui Xie {
149042dc3c4SHui Xie // test ID 12
150042dc3c4SHui Xie std::ranges::zip_view v{InputCommonView(buffer1), InputCommonView(buffer2)};
151042dc3c4SHui Xie static_assert(std::ranges::common_range<decltype(v)>);
152042dc3c4SHui Xie assert(++v.begin() == v.end());
153042dc3c4SHui Xie static_assert(std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
154042dc3c4SHui Xie }
155042dc3c4SHui Xie {
156042dc3c4SHui Xie // test ID 13
157*f5832babSStephan T. Lavavej std::ranges::zip_view v{SimpleNonCommonRandomAccessSized(buffer1)};
158042dc3c4SHui Xie static_assert(std::ranges::common_range<decltype(v)>);
159042dc3c4SHui Xie assert(v.begin() + 5 == v.end());
160042dc3c4SHui Xie static_assert(std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
161042dc3c4SHui Xie }
162042dc3c4SHui Xie {
163042dc3c4SHui Xie // test ID 14
164*f5832babSStephan T. Lavavej std::ranges::zip_view v{SimpleNonCommonRandomAccessSized(buffer1), SimpleNonCommonRandomAccessSized(buffer2)};
165042dc3c4SHui Xie static_assert(std::ranges::common_range<decltype(v)>);
166042dc3c4SHui Xie assert(v.begin() + 1 == v.end());
167042dc3c4SHui Xie static_assert(std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
168042dc3c4SHui Xie }
169042dc3c4SHui Xie {
170042dc3c4SHui Xie // test ID 15
171042dc3c4SHui Xie std::ranges::zip_view v{SizedBidiNonCommonView(buffer1)};
172042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
173042dc3c4SHui Xie assert(std::next(v.begin(), 5) == v.end());
174042dc3c4SHui Xie static_assert(std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
175042dc3c4SHui Xie }
176042dc3c4SHui Xie {
177042dc3c4SHui Xie // test ID 16
178042dc3c4SHui Xie std::ranges::zip_view v{SizedBidiNonCommonView(buffer1), SizedBidiNonCommonView(buffer2)};
179042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
180042dc3c4SHui Xie assert(++v.begin() == v.end());
181042dc3c4SHui Xie static_assert(std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
182042dc3c4SHui Xie }
183042dc3c4SHui Xie {
184042dc3c4SHui Xie // test ID 17
185042dc3c4SHui Xie std::ranges::zip_view v{BidiNonCommonView(buffer1)};
186042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
187042dc3c4SHui Xie assert(std::next(v.begin(), 5) == v.end());
188042dc3c4SHui Xie static_assert(std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
189042dc3c4SHui Xie }
190042dc3c4SHui Xie {
191042dc3c4SHui Xie // test ID 18
192042dc3c4SHui Xie std::ranges::zip_view v{BidiNonCommonView(buffer1), BidiNonCommonView(buffer2)};
193042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
194042dc3c4SHui Xie assert(++v.begin() == v.end());
195042dc3c4SHui Xie static_assert(std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
196042dc3c4SHui Xie }
197042dc3c4SHui Xie {
198042dc3c4SHui Xie // test ID 19
199042dc3c4SHui Xie std::ranges::zip_view v{ForwardSizedNonCommon(buffer1)};
200042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
201042dc3c4SHui Xie assert(std::next(v.begin(), 5) == v.end());
202042dc3c4SHui Xie static_assert(std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
203042dc3c4SHui Xie }
204042dc3c4SHui Xie {
205042dc3c4SHui Xie // test ID 20
206042dc3c4SHui Xie std::ranges::zip_view v{ForwardSizedNonCommon(buffer1), ForwardSizedNonCommon(buffer2)};
207042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
208042dc3c4SHui Xie assert(++v.begin() == v.end());
209042dc3c4SHui Xie static_assert(std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
210042dc3c4SHui Xie }
211042dc3c4SHui Xie {
212042dc3c4SHui Xie // test ID 21
213042dc3c4SHui Xie std::ranges::zip_view v{InputNonCommonView(buffer1)};
214042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
215042dc3c4SHui Xie assert(std::ranges::next(v.begin(), 5) == v.end());
216042dc3c4SHui Xie static_assert(std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
217042dc3c4SHui Xie }
218042dc3c4SHui Xie {
219042dc3c4SHui Xie // test ID 22
220042dc3c4SHui Xie std::ranges::zip_view v{InputNonCommonView(buffer1), InputNonCommonView(buffer2)};
221042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
222042dc3c4SHui Xie assert(++v.begin() == v.end());
223042dc3c4SHui Xie static_assert(std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
224042dc3c4SHui Xie }
225042dc3c4SHui Xie {
226042dc3c4SHui Xie // test ID 23
227042dc3c4SHui Xie std::ranges::zip_view v{NonSimpleCommonRandomAccessSized(buffer1)};
228042dc3c4SHui Xie static_assert(std::ranges::common_range<decltype(v)>);
229042dc3c4SHui Xie assert(v.begin() + 5 == v.end());
230042dc3c4SHui Xie static_assert(!std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
231042dc3c4SHui Xie }
232042dc3c4SHui Xie {
233042dc3c4SHui Xie // test ID 24
234042dc3c4SHui Xie std::ranges::zip_view v{NonSimpleCommonRandomAccessSized(buffer1), NonSimpleCommonRandomAccessSized(buffer2)};
235042dc3c4SHui Xie static_assert(std::ranges::common_range<decltype(v)>);
236042dc3c4SHui Xie assert(v.begin() + 1 == v.end());
237042dc3c4SHui Xie static_assert(!std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
238042dc3c4SHui Xie }
239042dc3c4SHui Xie {
240042dc3c4SHui Xie // test ID 25
241042dc3c4SHui Xie std::ranges::zip_view v{NonSimpleNonSizedRandomAccessView(buffer1)};
242042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
243042dc3c4SHui Xie assert(v.begin() + 5 == v.end());
244042dc3c4SHui Xie static_assert(!std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
245042dc3c4SHui Xie }
246042dc3c4SHui Xie {
247042dc3c4SHui Xie // test ID 26
248042dc3c4SHui Xie std::ranges::zip_view v{NonSimpleNonSizedRandomAccessView(buffer1), NonSimpleNonSizedRandomAccessView(buffer3)};
249042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
250042dc3c4SHui Xie assert(v.begin() + 3 == v.end());
251042dc3c4SHui Xie static_assert(!std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
252042dc3c4SHui Xie }
253042dc3c4SHui Xie {
254042dc3c4SHui Xie // test ID 27
255042dc3c4SHui Xie std::ranges::zip_view v{NonSimpleSizedBidiCommon(buffer1)};
256042dc3c4SHui Xie static_assert(std::ranges::common_range<decltype(v)>);
257042dc3c4SHui Xie assert(std::next(v.begin(), 5) == v.end());
258042dc3c4SHui Xie static_assert(!std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
259042dc3c4SHui Xie }
260042dc3c4SHui Xie {
261042dc3c4SHui Xie // test ID 28
262042dc3c4SHui Xie std::ranges::zip_view v{NonSimpleSizedBidiCommon(buffer1), NonSimpleSizedBidiCommon(buffer2)};
263042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
264042dc3c4SHui Xie assert(++v.begin() == v.end());
265042dc3c4SHui Xie static_assert(!std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
266042dc3c4SHui Xie }
267042dc3c4SHui Xie {
268042dc3c4SHui Xie // test ID 29
269042dc3c4SHui Xie std::ranges::zip_view v{NonSimpleBidiCommonView(buffer1)};
270042dc3c4SHui Xie static_assert(std::ranges::common_range<decltype(v)>);
271042dc3c4SHui Xie assert(std::next(v.begin(), 5) == v.end());
272042dc3c4SHui Xie static_assert(!std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
273042dc3c4SHui Xie }
274042dc3c4SHui Xie {
275042dc3c4SHui Xie // test ID 30
276042dc3c4SHui Xie std::ranges::zip_view v{NonSimpleBidiCommonView(buffer1), NonSimpleBidiCommonView(buffer2)};
277042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
278042dc3c4SHui Xie assert(++v.begin() == v.end());
279042dc3c4SHui Xie static_assert(!std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
280042dc3c4SHui Xie }
281042dc3c4SHui Xie {
282042dc3c4SHui Xie // test ID 31
283042dc3c4SHui Xie std::ranges::zip_view v{NonSimpleForwardSizedView(buffer1)};
284042dc3c4SHui Xie static_assert(std::ranges::common_range<decltype(v)>);
285042dc3c4SHui Xie assert(std::next(v.begin(), 5) == v.end());
286042dc3c4SHui Xie static_assert(!std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
287042dc3c4SHui Xie }
288042dc3c4SHui Xie {
289042dc3c4SHui Xie // test ID 32
290042dc3c4SHui Xie std::ranges::zip_view v{NonSimpleForwardSizedView(buffer1), NonSimpleForwardSizedView(buffer2)};
291042dc3c4SHui Xie static_assert(std::ranges::common_range<decltype(v)>);
292042dc3c4SHui Xie assert(++v.begin() == v.end());
293042dc3c4SHui Xie static_assert(!std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
294042dc3c4SHui Xie }
295042dc3c4SHui Xie {
296042dc3c4SHui Xie // test ID 33
297042dc3c4SHui Xie std::ranges::zip_view v{NonSimpleInputCommonView(buffer1)};
298042dc3c4SHui Xie static_assert(std::ranges::common_range<decltype(v)>);
299042dc3c4SHui Xie assert(std::ranges::next(v.begin(), 5) == v.end());
300042dc3c4SHui Xie static_assert(!std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
301042dc3c4SHui Xie }
302042dc3c4SHui Xie {
303042dc3c4SHui Xie // test ID 34
304042dc3c4SHui Xie std::ranges::zip_view v{NonSimpleInputCommonView(buffer1), NonSimpleInputCommonView(buffer2)};
305042dc3c4SHui Xie static_assert(std::ranges::common_range<decltype(v)>);
306042dc3c4SHui Xie assert(++v.begin() == v.end());
307042dc3c4SHui Xie static_assert(!std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
308042dc3c4SHui Xie }
309042dc3c4SHui Xie {
310042dc3c4SHui Xie // test ID 35
311*f5832babSStephan T. Lavavej std::ranges::zip_view v{NonSimpleNonCommonRandomAccessSized(buffer1)};
312042dc3c4SHui Xie static_assert(std::ranges::common_range<decltype(v)>);
313042dc3c4SHui Xie assert(v.begin() + 5 == v.end());
314042dc3c4SHui Xie static_assert(!std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
315042dc3c4SHui Xie }
316042dc3c4SHui Xie {
317042dc3c4SHui Xie // test ID 36
318*f5832babSStephan T. Lavavej std::ranges::zip_view v{NonSimpleNonCommonRandomAccessSized(buffer1), NonSimpleNonCommonRandomAccessSized(buffer2)};
319042dc3c4SHui Xie static_assert(std::ranges::common_range<decltype(v)>);
320042dc3c4SHui Xie assert(v.begin() + 1 == v.end());
321042dc3c4SHui Xie static_assert(!std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
322042dc3c4SHui Xie }
323042dc3c4SHui Xie {
324042dc3c4SHui Xie // test ID 37
325042dc3c4SHui Xie std::ranges::zip_view v{NonSimpleSizedBidiNonCommonView(buffer1)};
326042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
327042dc3c4SHui Xie assert(std::next(v.begin(), 5) == v.end());
328042dc3c4SHui Xie static_assert(!std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
329042dc3c4SHui Xie }
330042dc3c4SHui Xie {
331042dc3c4SHui Xie // test ID 38
332042dc3c4SHui Xie std::ranges::zip_view v{NonSimpleSizedBidiNonCommonView(buffer1), NonSimpleSizedBidiNonCommonView(buffer2)};
333042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
334042dc3c4SHui Xie assert(++v.begin() == v.end());
335042dc3c4SHui Xie static_assert(!std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
336042dc3c4SHui Xie }
337042dc3c4SHui Xie {
338042dc3c4SHui Xie // test ID 39
339042dc3c4SHui Xie std::ranges::zip_view v{NonSimpleBidiNonCommonView(buffer1)};
340042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
341042dc3c4SHui Xie assert(std::next(v.begin(), 5) == v.end());
342042dc3c4SHui Xie static_assert(!std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
343042dc3c4SHui Xie }
344042dc3c4SHui Xie {
345042dc3c4SHui Xie // test ID 40
346042dc3c4SHui Xie std::ranges::zip_view v{NonSimpleBidiNonCommonView(buffer1), NonSimpleBidiNonCommonView(buffer2)};
347042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
348042dc3c4SHui Xie assert(++v.begin() == v.end());
349042dc3c4SHui Xie static_assert(!std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
350042dc3c4SHui Xie }
351042dc3c4SHui Xie {
352042dc3c4SHui Xie // test ID 41
353042dc3c4SHui Xie std::ranges::zip_view v{NonSimpleForwardSizedNonCommon(buffer1)};
354042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
355042dc3c4SHui Xie assert(std::next(v.begin(), 5) == v.end());
356042dc3c4SHui Xie static_assert(!std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
357042dc3c4SHui Xie }
358042dc3c4SHui Xie {
359042dc3c4SHui Xie // test ID 42
360042dc3c4SHui Xie std::ranges::zip_view v{NonSimpleForwardSizedNonCommon(buffer1), NonSimpleForwardSizedNonCommon(buffer2)};
361042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
362042dc3c4SHui Xie assert(++v.begin() == v.end());
363042dc3c4SHui Xie static_assert(!std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
364042dc3c4SHui Xie }
365042dc3c4SHui Xie {
366042dc3c4SHui Xie // test ID 43
367042dc3c4SHui Xie std::ranges::zip_view v{NonSimpleInputNonCommonView(buffer1)};
368042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
369042dc3c4SHui Xie assert(std::ranges::next(v.begin(), 5) == v.end());
370042dc3c4SHui Xie static_assert(!std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
371042dc3c4SHui Xie }
372042dc3c4SHui Xie {
373042dc3c4SHui Xie // test ID 44
374042dc3c4SHui Xie std::ranges::zip_view v{NonSimpleInputNonCommonView(buffer1), NonSimpleInputNonCommonView(buffer2)};
375042dc3c4SHui Xie static_assert(!std::ranges::common_range<decltype(v)>);
376042dc3c4SHui Xie assert(++v.begin() == v.end());
377042dc3c4SHui Xie static_assert(!std::is_same_v<decltype(v.end()), decltype(std::as_const(v).end())>);
378042dc3c4SHui Xie }
379042dc3c4SHui Xie {
380042dc3c4SHui Xie // end should go to the minimum length when zip is common and random_access sized
381042dc3c4SHui Xie std::ranges::zip_view v(std::views::iota(0, 4), std::views::iota(0, 8));
382042dc3c4SHui Xie auto it = --(v.end());
383042dc3c4SHui Xie auto [x, y] = *it;
384042dc3c4SHui Xie assert(x == 3);
385042dc3c4SHui Xie assert(y == 3); // y should not go to the end "7"
386042dc3c4SHui Xie }
387042dc3c4SHui Xie return true;
388042dc3c4SHui Xie }
389042dc3c4SHui Xie
main(int,char **)390042dc3c4SHui Xie int main(int, char**) {
391042dc3c4SHui Xie test();
392042dc3c4SHui Xie static_assert(test());
393042dc3c4SHui Xie
394042dc3c4SHui Xie return 0;
395042dc3c4SHui Xie }
396