1*a2b3ab8fSHui //===----------------------------------------------------------------------===//
2*a2b3ab8fSHui //
3*a2b3ab8fSHui // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*a2b3ab8fSHui // See https://llvm.org/LICENSE.txt for license information.
5*a2b3ab8fSHui // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*a2b3ab8fSHui //
7*a2b3ab8fSHui //===----------------------------------------------------------------------===//
8*a2b3ab8fSHui
9*a2b3ab8fSHui // UNSUPPORTED: c++03, c++11, c++14, c++17
10*a2b3ab8fSHui
11*a2b3ab8fSHui // constexpr iterator& operator++();
12*a2b3ab8fSHui // constexpr iterator operator++(int);
13*a2b3ab8fSHui
14*a2b3ab8fSHui #include <cassert>
15*a2b3ab8fSHui #include <ranges>
16*a2b3ab8fSHui
17*a2b3ab8fSHui #include "test_iterators.h"
18*a2b3ab8fSHui
19*a2b3ab8fSHui template <class Iter>
testOne()20*a2b3ab8fSHui constexpr void testOne() {
21*a2b3ab8fSHui constexpr auto make_subrange = []<std::size_t N>(int(&buffer)[N]) {
22*a2b3ab8fSHui return std::ranges::subrange<Iter>{Iter{buffer}, Iter{buffer + N}};
23*a2b3ab8fSHui };
24*a2b3ab8fSHui
25*a2b3ab8fSHui // next subrange does not reach the end
26*a2b3ab8fSHui {
27*a2b3ab8fSHui int buffer[] = {0, 1, 2, -1, 4, 5, -1, 7};
28*a2b3ab8fSHui auto input = make_subrange(buffer);
29*a2b3ab8fSHui std::ranges::split_view sv(input, -1);
30*a2b3ab8fSHui using SplitIter = std::ranges::iterator_t<decltype(sv)>;
31*a2b3ab8fSHui
32*a2b3ab8fSHui // ++it
33*a2b3ab8fSHui {
34*a2b3ab8fSHui auto it = sv.begin();
35*a2b3ab8fSHui
36*a2b3ab8fSHui decltype(auto) it1 = ++it;
37*a2b3ab8fSHui static_assert(std::is_same_v<decltype(it1), SplitIter&>);
38*a2b3ab8fSHui assert(&it1 == &it);
39*a2b3ab8fSHui
40*a2b3ab8fSHui assert(base((*it).begin()) == buffer + 4);
41*a2b3ab8fSHui assert(base((*it).end()) == buffer + 6);
42*a2b3ab8fSHui
43*a2b3ab8fSHui ++it;
44*a2b3ab8fSHui assert(base((*it).begin()) == buffer + 7);
45*a2b3ab8fSHui assert(base((*it).end()) == buffer + 8);
46*a2b3ab8fSHui }
47*a2b3ab8fSHui
48*a2b3ab8fSHui // it++
49*a2b3ab8fSHui {
50*a2b3ab8fSHui auto it = sv.begin();
51*a2b3ab8fSHui auto original = it;
52*a2b3ab8fSHui
53*a2b3ab8fSHui decltype(auto) it1 = it++;
54*a2b3ab8fSHui static_assert(std::is_same_v<decltype(it1), SplitIter>);
55*a2b3ab8fSHui assert(it1 == original);
56*a2b3ab8fSHui
57*a2b3ab8fSHui assert(base((*it).begin()) == buffer + 4);
58*a2b3ab8fSHui assert(base((*it).end()) == buffer + 6);
59*a2b3ab8fSHui
60*a2b3ab8fSHui it++;
61*a2b3ab8fSHui assert(base((*it).begin()) == buffer + 7);
62*a2b3ab8fSHui assert(base((*it).end()) == buffer + 8);
63*a2b3ab8fSHui }
64*a2b3ab8fSHui }
65*a2b3ab8fSHui
66*a2b3ab8fSHui // next's begin is the end
67*a2b3ab8fSHui {
68*a2b3ab8fSHui int buffer[] = {0, 1, 2};
69*a2b3ab8fSHui auto input = make_subrange(buffer);
70*a2b3ab8fSHui std::ranges::split_view sv(input, -1);
71*a2b3ab8fSHui using SplitIter = std::ranges::iterator_t<decltype(sv)>;
72*a2b3ab8fSHui
73*a2b3ab8fSHui // ++it
74*a2b3ab8fSHui {
75*a2b3ab8fSHui auto it = sv.begin();
76*a2b3ab8fSHui
77*a2b3ab8fSHui decltype(auto) it1 = ++it; // trailing_empty is false
78*a2b3ab8fSHui static_assert(std::is_same_v<decltype(it1), SplitIter&>);
79*a2b3ab8fSHui assert(&it1 == &it);
80*a2b3ab8fSHui
81*a2b3ab8fSHui assert(it == sv.end());
82*a2b3ab8fSHui }
83*a2b3ab8fSHui
84*a2b3ab8fSHui // it++
85*a2b3ab8fSHui {
86*a2b3ab8fSHui auto it = sv.begin();
87*a2b3ab8fSHui auto original = it;
88*a2b3ab8fSHui
89*a2b3ab8fSHui decltype(auto) it1 = it++; // trailing_empty is false
90*a2b3ab8fSHui static_assert(std::is_same_v<decltype(it1), SplitIter>);
91*a2b3ab8fSHui assert(it1 == original);
92*a2b3ab8fSHui
93*a2b3ab8fSHui assert(it == sv.end());
94*a2b3ab8fSHui }
95*a2b3ab8fSHui }
96*a2b3ab8fSHui
97*a2b3ab8fSHui // next's end is the end
98*a2b3ab8fSHui {
99*a2b3ab8fSHui int buffer[] = {0, 1, 2, -1};
100*a2b3ab8fSHui auto input = make_subrange(buffer);
101*a2b3ab8fSHui std::ranges::split_view sv(input, -1);
102*a2b3ab8fSHui using SplitIter = std::ranges::iterator_t<decltype(sv)>;
103*a2b3ab8fSHui
104*a2b3ab8fSHui // ++it
105*a2b3ab8fSHui {
106*a2b3ab8fSHui auto it = sv.begin();
107*a2b3ab8fSHui
108*a2b3ab8fSHui decltype(auto) it1 = ++it; // trailing_empty is true
109*a2b3ab8fSHui static_assert(std::is_same_v<decltype(it1), SplitIter&>);
110*a2b3ab8fSHui assert(&it1 == &it);
111*a2b3ab8fSHui
112*a2b3ab8fSHui assert(it != sv.end());
113*a2b3ab8fSHui assert(base((*it).begin()) == buffer + 4);
114*a2b3ab8fSHui assert(base((*it).begin()) == buffer + 4);
115*a2b3ab8fSHui
116*a2b3ab8fSHui ++it;
117*a2b3ab8fSHui assert(it == sv.end());
118*a2b3ab8fSHui }
119*a2b3ab8fSHui
120*a2b3ab8fSHui // it++
121*a2b3ab8fSHui {
122*a2b3ab8fSHui auto it = sv.begin();
123*a2b3ab8fSHui auto original = it;
124*a2b3ab8fSHui
125*a2b3ab8fSHui decltype(auto) it1 = it++; // trailing_empty is true
126*a2b3ab8fSHui static_assert(std::is_same_v<decltype(it1), SplitIter>);
127*a2b3ab8fSHui assert(it1 == original);
128*a2b3ab8fSHui
129*a2b3ab8fSHui assert(it != sv.end());
130*a2b3ab8fSHui
131*a2b3ab8fSHui assert(base((*it).begin()) == buffer + 4);
132*a2b3ab8fSHui assert(base((*it).begin()) == buffer + 4);
133*a2b3ab8fSHui
134*a2b3ab8fSHui it++;
135*a2b3ab8fSHui assert(it == sv.end());
136*a2b3ab8fSHui }
137*a2b3ab8fSHui }
138*a2b3ab8fSHui }
139*a2b3ab8fSHui
test()140*a2b3ab8fSHui constexpr bool test() {
141*a2b3ab8fSHui testOne<forward_iterator<int*>>();
142*a2b3ab8fSHui testOne<bidirectional_iterator<int*>>();
143*a2b3ab8fSHui testOne<random_access_iterator<int*>>();
144*a2b3ab8fSHui testOne<contiguous_iterator<int*>>();
145*a2b3ab8fSHui testOne<int*>();
146*a2b3ab8fSHui
147*a2b3ab8fSHui return true;
148*a2b3ab8fSHui }
149*a2b3ab8fSHui
main(int,char **)150*a2b3ab8fSHui int main(int, char**) {
151*a2b3ab8fSHui test();
152*a2b3ab8fSHui static_assert(test());
153*a2b3ab8fSHui
154*a2b3ab8fSHui return 0;
155*a2b3ab8fSHui }
156