24
24
#include < cassert>
25
25
#include < ranges>
26
26
27
+ #include < cstdio>
28
+
27
29
#include " test_iterators.h"
30
+ #include " type_algorithms.h"
28
31
29
32
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 };
33
+ using Expected = std::ranges::swap_ranges_result<int *, int *>;
34
+ int i[3 ] = {1 , 2 , 3 };
35
+ int j[1 ] = {4 };
33
36
std::same_as<Expected> auto r = std::ranges::swap_ranges (i, i + 3 , j, j + 1 );
34
37
assert (r.in1 == i + 1 );
35
38
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 );
39
+ assert (std::ranges::equal (i, std::array{4 , 2 , 3 }));
40
+ assert (std::ranges::equal (j, std::array{1 }));
40
41
std::same_as<Expected> auto r2 = std::ranges::swap_ranges (i, j);
41
42
assert (r2.in1 == i + 1 );
42
43
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 );
44
+ assert (std::ranges::equal (i, std::array{1 , 2 , 3 }));
45
+ assert (std::ranges::equal (j, std::array{4 }));
47
46
std::same_as<Expected> auto r3 = std::ranges::swap_ranges (j, j + 1 , i, i + 3 );
48
47
assert (r3.in1 == j + 1 );
49
48
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 );
49
+ assert (std::ranges::equal (i, std::array{4 , 2 , 3 }));
50
+ assert (std::ranges::equal (j, std::array{1 }));
54
51
std::same_as<Expected> auto r4 = std::ranges::swap_ranges (j, i);
55
52
assert (r4.in1 == j + 1 );
56
53
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 );
54
+ assert (std::ranges::equal (i, std::array{1 , 2 , 3 }));
55
+ assert (std::ranges::equal (j, std::array{4 }));
61
56
}
62
57
63
58
constexpr void test_range () {
64
59
std::array r1 = {1 , 2 , 3 };
65
60
std::array r2 = {4 , 5 , 6 };
66
61
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);
62
+ std::same_as<std::ranges::in_in_result<std::array< int , 3 >::iterator, std::array< int , 3 >::iterator>> auto r =
63
+ std::ranges::swap_ranges (r1, r2);
69
64
assert (r.in1 == r1.end ());
70
65
assert (r.in2 == r2.end ());
71
-
72
66
assert ((r1 == std::array{4 , 5 , 6 }));
73
67
assert ((r2 == std::array{1 , 2 , 3 }));
74
68
}
@@ -78,142 +72,82 @@ constexpr void test_borrowed_input_range() {
78
72
int r1[] = {1 , 2 , 3 };
79
73
int r2[] = {4 , 5 , 6 };
80
74
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 );
75
+ assert (std::ranges::equal (r1, std::array{4 , 5 , 6 }));
76
+ assert (std::ranges::equal (r2, std::array{1 , 2 , 3 }));
87
77
}
88
78
{
89
79
int r1[] = {1 , 2 , 3 };
90
80
int r2[] = {4 , 5 , 6 };
91
81
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 );
82
+ assert (std::ranges::equal (r1, std::array{4 , 5 , 6 }));
83
+ assert (std::ranges::equal (r2, std::array{1 , 2 , 3 }));
98
84
}
99
85
{
100
86
int r1[] = {1 , 2 , 3 };
101
87
int r2[] = {4 , 5 , 6 };
102
88
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 );
89
+ assert (std::ranges::equal (r1, std::array{4 , 5 , 6 }));
90
+ assert (std::ranges::equal (r2, std::array{1 , 2 , 3 }));
109
91
}
110
92
}
111
93
112
94
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 )));
95
+ int i[3 ] = {1 , 2 , 3 };
96
+ int j[3 ] = {4 , 5 , 6 };
97
+ using It = cpp17_input_iterator<int *>;
98
+ using Sent = sentinel_wrapper<It>;
99
+ using Expected = std::ranges::swap_ranges_result<It, It>;
100
+ std::same_as<Expected> auto r = std::ranges::swap_ranges (It (i), Sent (It (i + 3 )), It (j), Sent (It (j + 3 )));
120
101
assert (base (r.in1 ) == i + 3 );
121
102
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 );
103
+ assert (std::ranges::equal (i, std::array{4 , 5 , 6 }));
104
+ assert (std::ranges::equal (j, std::array{1 , 2 , 3 }));
128
105
}
129
106
130
107
template <class Iter1 , class Iter2 >
131
- constexpr void test_iterators () {
108
+ TEST_CONSTEXPR_CXX20 void test_iterators () {
132
109
using Expected = std::ranges::swap_ranges_result<Iter1, Iter2>;
133
- int i [3 ] = {1 , 2 , 3 };
134
- int j [3 ] = {4 , 5 , 6 };
110
+ int a [3 ] = {1 , 2 , 3 };
111
+ int b [3 ] = {4 , 5 , 6 };
135
112
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 );
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 }));
145
118
}
146
119
147
120
constexpr void test_rval_range () {
148
121
{
149
- using Expected = std::ranges::swap_ranges_result<std::array<int , 3 >::iterator, std::ranges::dangling>;
122
+ using Expected = std::ranges::swap_ranges_result<std::array<int , 3 >::iterator, std::ranges::dangling>;
150
123
std::array<int , 3 > r = {1 , 2 , 3 };
151
124
std::same_as<Expected> auto a = std::ranges::swap_ranges (r, std::array{4 , 5 , 6 });
152
125
assert ((r == std::array{4 , 5 , 6 }));
153
126
assert (a.in1 == r.begin () + 3 );
154
127
}
155
128
{
156
129
std::array<int , 3 > r = {1 , 2 , 3 };
157
- using Expected = std::ranges::swap_ranges_result<std::ranges::dangling, std::array<int , 3 >::iterator>;
130
+ using Expected = std::ranges::swap_ranges_result<std::ranges::dangling, std::array<int , 3 >::iterator>;
158
131
std::same_as<Expected> auto b = std::ranges::swap_ranges (std::array{4 , 5 , 6 }, r);
159
132
assert ((r == std::array{4 , 5 , 6 }));
160
133
assert (b.in2 == r.begin () + 3 );
161
134
}
162
135
}
163
136
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
137
constexpr bool test () {
174
138
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
139
test_sentinel ();
213
140
test_different_lengths ();
214
141
test_borrowed_input_range ();
215
142
test_rval_range ();
216
143
144
+ types::for_each (types::cpp20_input_iterator_list<int *>(), []<class Iter1 >() {
145
+ types::for_each (types::cpp20_input_iterator_list<int *>(), []<class Iter2 >() {
146
+ test_iterators<Iter1, Iter2>();
147
+ test_iterators<ProxyIterator<Iter1>, ProxyIterator<Iter2>>();
148
+ });
149
+ });
150
+
217
151
return true ;
218
152
}
219
153
0 commit comments