25
25
#include < ranges>
26
26
27
27
#include " test_iterators.h"
28
+ #include " type_algorithms.h"
28
29
29
30
constexpr void test_different_lengths () {
30
- using Expected = std::ranges::swap_ranges_result<int *, int *>;
31
- int i[3 ] = {1 , 2 , 3 };
32
- int j[1 ] = {4 };
31
+ using Expected = std::ranges::swap_ranges_result<int *, int *>;
32
+ int i[3 ] = {1 , 2 , 3 };
33
+ int j[1 ] = {4 };
33
34
std::same_as<Expected> auto r = std::ranges::swap_ranges (i, i + 3 , j, j + 1 );
34
35
assert (r.in1 == i + 1 );
35
36
assert (r.in2 == j + 1 );
36
- assert (i[0 ] == 4 );
37
- assert (i[1 ] == 2 );
38
- assert (i[2 ] == 3 );
39
- assert (j[0 ] == 1 );
37
+ assert (std::ranges::equal (i, std::array{4 , 2 , 3 }));
38
+ assert (std::ranges::equal (j, std::array{1 }));
40
39
std::same_as<Expected> auto r2 = std::ranges::swap_ranges (i, j);
41
40
assert (r2.in1 == i + 1 );
42
41
assert (r2.in2 == j + 1 );
43
- assert (i[0 ] == 1 );
44
- assert (i[1 ] == 2 );
45
- assert (i[2 ] == 3 );
46
- assert (j[0 ] == 4 );
42
+ assert (std::ranges::equal (i, std::array{1 , 2 , 3 }));
43
+ assert (std::ranges::equal (j, std::array{4 }));
47
44
std::same_as<Expected> auto r3 = std::ranges::swap_ranges (j, j + 1 , i, i + 3 );
48
45
assert (r3.in1 == j + 1 );
49
46
assert (r3.in2 == i + 1 );
50
- assert (i[0 ] == 4 );
51
- assert (i[1 ] == 2 );
52
- assert (i[2 ] == 3 );
53
- assert (j[0 ] == 1 );
47
+ assert (std::ranges::equal (i, std::array{4 , 2 , 3 }));
48
+ assert (std::ranges::equal (j, std::array{1 }));
54
49
std::same_as<Expected> auto r4 = std::ranges::swap_ranges (j, i);
55
50
assert (r4.in1 == j + 1 );
56
51
assert (r4.in2 == i + 1 );
57
- assert (i[0 ] == 1 );
58
- assert (i[1 ] == 2 );
59
- assert (i[2 ] == 3 );
60
- assert (j[0 ] == 4 );
52
+ assert (std::ranges::equal (i, std::array{1 , 2 , 3 }));
53
+ assert (std::ranges::equal (j, std::array{4 }));
61
54
}
62
55
63
56
constexpr void test_range () {
64
57
std::array r1 = {1 , 2 , 3 };
65
58
std::array r2 = {4 , 5 , 6 };
66
59
67
-
68
- std::same_as<std::ranges::in_in_result<std::array< int , 3 >::iterator, std::array< int , 3 >::iterator>> auto r = std::ranges::swap_ranges (r1, r2);
60
+ std::same_as<std::ranges::in_in_result<std::array< int , 3 >::iterator, std::array< int , 3 >::iterator>> auto r =
61
+ std::ranges::swap_ranges (r1, r2);
69
62
assert (r.in1 == r1.end ());
70
63
assert (r.in2 == r2.end ());
71
-
72
64
assert ((r1 == std::array{4 , 5 , 6 }));
73
65
assert ((r2 == std::array{1 , 2 , 3 }));
74
66
}
@@ -78,141 +70,101 @@ constexpr void test_borrowed_input_range() {
78
70
int r1[] = {1 , 2 , 3 };
79
71
int r2[] = {4 , 5 , 6 };
80
72
std::ranges::swap_ranges (std::views::all (r1), r2);
81
- assert (r1[0 ] == 4 );
82
- assert (r1[1 ] == 5 );
83
- assert (r1[2 ] == 6 );
84
- assert (r2[0 ] == 1 );
85
- assert (r2[1 ] == 2 );
86
- assert (r2[2 ] == 3 );
73
+ assert (std::ranges::equal (r1, std::array{4 , 5 , 6 }));
74
+ assert (std::ranges::equal (r2, std::array{1 , 2 , 3 }));
87
75
}
88
76
{
89
77
int r1[] = {1 , 2 , 3 };
90
78
int r2[] = {4 , 5 , 6 };
91
79
std::ranges::swap_ranges (r1, std::views::all (r2));
92
- assert (r1[0 ] == 4 );
93
- assert (r1[1 ] == 5 );
94
- assert (r1[2 ] == 6 );
95
- assert (r2[0 ] == 1 );
96
- assert (r2[1 ] == 2 );
97
- assert (r2[2 ] == 3 );
80
+ assert (std::ranges::equal (r1, std::array{4 , 5 , 6 }));
81
+ assert (std::ranges::equal (r2, std::array{1 , 2 , 3 }));
98
82
}
99
83
{
100
84
int r1[] = {1 , 2 , 3 };
101
85
int r2[] = {4 , 5 , 6 };
102
86
std::ranges::swap_ranges (std::views::all (r1), std::views::all (r2));
103
- assert (r1[0 ] == 4 );
104
- assert (r1[1 ] == 5 );
105
- assert (r1[2 ] == 6 );
106
- assert (r2[0 ] == 1 );
107
- assert (r2[1 ] == 2 );
108
- assert (r2[2 ] == 3 );
87
+ assert (std::ranges::equal (r1, std::array{4 , 5 , 6 }));
88
+ assert (std::ranges::equal (r2, std::array{1 , 2 , 3 }));
109
89
}
110
90
}
111
91
112
92
constexpr void test_sentinel () {
113
- int i[3 ] = {1 , 2 , 3 };
114
- int j[3 ] = {4 , 5 , 6 };
115
- using It = cpp17_input_iterator<int *>;
116
- using Sent = sentinel_wrapper<It>;
117
- using Expected = std::ranges::swap_ranges_result<It, It>;
118
- std::same_as<Expected> auto r =
119
- std::ranges::swap_ranges (It (i), Sent (It (i + 3 )), It (j), Sent (It (j + 3 )));
93
+ int i[3 ] = {1 , 2 , 3 };
94
+ int j[3 ] = {4 , 5 , 6 };
95
+ using It = cpp17_input_iterator<int *>;
96
+ using Sent = sentinel_wrapper<It>;
97
+ using Expected = std::ranges::swap_ranges_result<It, It>;
98
+ std::same_as<Expected> auto r = std::ranges::swap_ranges (It (i), Sent (It (i + 3 )), It (j), Sent (It (j + 3 )));
120
99
assert (base (r.in1 ) == i + 3 );
121
100
assert (base (r.in2 ) == j + 3 );
122
- assert (i[0 ] == 4 );
123
- assert (i[1 ] == 5 );
124
- assert (i[2 ] == 6 );
125
- assert (j[0 ] == 1 );
126
- assert (j[1 ] == 2 );
127
- assert (j[2 ] == 3 );
101
+ assert (std::ranges::equal (i, std::array{4 , 5 , 6 }));
102
+ assert (std::ranges::equal (j, std::array{1 , 2 , 3 }));
128
103
}
129
104
130
- template <class Iter1 , class Iter2 >
131
- constexpr void test_iterators () {
132
- using Expected = std::ranges::swap_ranges_result<Iter1, Iter2>;
133
- int i[3 ] = {1 , 2 , 3 };
134
- int j[3 ] = {4 , 5 , 6 };
135
- std::same_as<Expected> auto r =
136
- std::ranges::swap_ranges (Iter1 (i), sentinel_wrapper (Iter1 (i + 3 )), Iter2 (j), sentinel_wrapper (Iter2 (j + 3 )));
137
- assert (base (r.in1 ) == i + 3 );
138
- assert (base (r.in2 ) == j + 3 );
139
- assert (i[0 ] == 4 );
140
- assert (i[1 ] == 5 );
141
- assert (i[2 ] == 6 );
142
- assert (j[0 ] == 1 );
143
- assert (j[1 ] == 2 );
144
- assert (j[2 ] == 3 );
145
- }
105
+ template <class Iter1 >
106
+ struct Test {
107
+ template <class Iter2 >
108
+ TEST_CONSTEXPR_CXX20 void operator ()() {
109
+ using Expected = std::ranges::swap_ranges_result<Iter1, Iter2>;
110
+ int a[3 ] = {1 , 2 , 3 };
111
+ int b[3 ] = {4 , 5 , 6 };
112
+ std::same_as<Expected> auto r =
113
+ std::ranges::swap_ranges (Iter1 (a), sentinel_wrapper (Iter1 (a + 3 )), Iter2 (b), sentinel_wrapper (Iter2 (b + 3 )));
114
+ assert (base (r.in1 ) == a + 3 );
115
+ assert (base (r.in2 ) == b + 3 );
116
+ assert (std::ranges::equal (a, std::array{4 , 5 , 6 }));
117
+ assert (std::ranges::equal (b, std::array{1 , 2 , 3 }));
118
+ }
119
+ };
120
+
121
+ struct TestIterators {
122
+ template <class Iter >
123
+ TEST_CONSTEXPR_CXX20 void operator ()() {
124
+ types::for_each (types::cpp20_input_iterator_list<int *>(), Test<Iter>());
125
+ }
126
+ };
127
+
128
+ template <class Ptr >
129
+ using cpp20_proxy_in_iterator_list =
130
+ types::type_list<Cpp20InputProxyIterator<Ptr >,
131
+ ForwardProxyIterator<Ptr >,
132
+ BidirectionalProxyIterator<Ptr >,
133
+ RandomAccessProxyIterator<Ptr >,
134
+ ContiguousProxyIterator<Ptr >>;
135
+
136
+ struct TestProxyInIterators {
137
+ template <class Iter >
138
+ TEST_CONSTEXPR_CXX20 void operator ()() {
139
+ types::for_each (cpp20_proxy_in_iterator_list<int *>(), Test<Iter>());
140
+ }
141
+ };
146
142
147
143
constexpr void test_rval_range () {
148
144
{
149
- using Expected = std::ranges::swap_ranges_result<std::array<int , 3 >::iterator, std::ranges::dangling>;
145
+ using Expected = std::ranges::swap_ranges_result<std::array<int , 3 >::iterator, std::ranges::dangling>;
150
146
std::array<int , 3 > r = {1 , 2 , 3 };
151
147
std::same_as<Expected> auto a = std::ranges::swap_ranges (r, std::array{4 , 5 , 6 });
152
148
assert ((r == std::array{4 , 5 , 6 }));
153
149
assert (a.in1 == r.begin () + 3 );
154
150
}
155
151
{
156
152
std::array<int , 3 > r = {1 , 2 , 3 };
157
- using Expected = std::ranges::swap_ranges_result<std::ranges::dangling, std::array<int , 3 >::iterator>;
153
+ using Expected = std::ranges::swap_ranges_result<std::ranges::dangling, std::array<int , 3 >::iterator>;
158
154
std::same_as<Expected> auto b = std::ranges::swap_ranges (std::array{4 , 5 , 6 }, r);
159
155
assert ((r == std::array{4 , 5 , 6 }));
160
156
assert (b.in2 == r.begin () + 3 );
161
157
}
162
158
}
163
159
164
- template <class Out >
165
- constexpr void test_proxy_in_iterators () {
166
- test_iterators<ProxyIterator<cpp20_input_iterator<int *>>, Out>();
167
- test_iterators<ProxyIterator<forward_iterator<int *>>, Out>();
168
- test_iterators<ProxyIterator<bidirectional_iterator<int *>>, Out>();
169
- test_iterators<ProxyIterator<random_access_iterator<int *>>, Out>();
170
- test_iterators<ProxyIterator<contiguous_iterator<int *>>, Out>();
171
- }
172
-
173
160
constexpr bool test () {
174
161
test_range ();
175
-
176
- test_iterators<cpp20_input_iterator<int *>, cpp20_input_iterator<int *>>();
177
- test_iterators<cpp20_input_iterator<int *>, forward_iterator<int *>>();
178
- test_iterators<cpp20_input_iterator<int *>, bidirectional_iterator<int *>>();
179
- test_iterators<cpp20_input_iterator<int *>, random_access_iterator<int *>>();
180
- test_iterators<cpp20_input_iterator<int *>, int *>();
181
-
182
- test_iterators<forward_iterator<int *>, cpp20_input_iterator<int *>>();
183
- test_iterators<forward_iterator<int *>, forward_iterator<int *>>();
184
- test_iterators<forward_iterator<int *>, bidirectional_iterator<int *>>();
185
- test_iterators<forward_iterator<int *>, random_access_iterator<int *>>();
186
- test_iterators<forward_iterator<int *>, int *>();
187
-
188
- test_iterators<bidirectional_iterator<int *>, cpp20_input_iterator<int *>>();
189
- test_iterators<bidirectional_iterator<int *>, forward_iterator<int *>>();
190
- test_iterators<bidirectional_iterator<int *>, bidirectional_iterator<int *>>();
191
- test_iterators<bidirectional_iterator<int *>, random_access_iterator<int *>>();
192
- test_iterators<bidirectional_iterator<int *>, int *>();
193
-
194
- test_iterators<random_access_iterator<int *>, cpp20_input_iterator<int *>>();
195
- test_iterators<random_access_iterator<int *>, forward_iterator<int *>>();
196
- test_iterators<random_access_iterator<int *>, bidirectional_iterator<int *>>();
197
- test_iterators<random_access_iterator<int *>, random_access_iterator<int *>>();
198
- test_iterators<random_access_iterator<int *>, int *>();
199
-
200
- test_iterators<int *, cpp20_input_iterator<int *>>();
201
- test_iterators<int *, forward_iterator<int *>>();
202
- test_iterators<int *, bidirectional_iterator<int *>>();
203
- test_iterators<int *, random_access_iterator<int *>>();
204
- test_iterators<int *, int *>();
205
-
206
- test_proxy_in_iterators<ProxyIterator<cpp20_input_iterator<int *>>>();
207
- test_proxy_in_iterators<ProxyIterator<forward_iterator<int *>>>();
208
- test_proxy_in_iterators<ProxyIterator<bidirectional_iterator<int *>>>();
209
- test_proxy_in_iterators<ProxyIterator<random_access_iterator<int *>>>();
210
- test_proxy_in_iterators<ProxyIterator<contiguous_iterator<int *>>>();
211
-
212
162
test_sentinel ();
213
163
test_different_lengths ();
214
164
test_borrowed_input_range ();
215
165
test_rval_range ();
166
+ types::for_each (types::cpp20_input_iterator_list<int *>(), TestIterators ());
167
+ types::for_each (cpp20_proxy_in_iterator_list<int *>(), TestProxyInIterators ());
216
168
217
169
return true ;
218
170
}
0 commit comments