24
24
25
25
#include " almost_satisfies_types.h"
26
26
#include " test_iterators.h"
27
+ #include " type_algorithms.h"
27
28
28
29
// Test constraints of the (iterator, sentinel) overload.
29
30
// ======================================================
30
31
31
32
template <class Iter = int *, class Sent = int *>
32
- concept HasRotateIter =
33
- requires (Iter&& iter, Sent&& sent) {
34
- std::ranges::rotate (std::forward<Iter>(iter), std::forward<Iter>(iter), std::forward<Sent>(sent));
35
- };
33
+ concept HasRotateIter = requires (Iter&& iter, Sent&& sent) {
34
+ std::ranges::rotate (std::forward<Iter>(iter), std::forward<Iter>(iter), std::forward<Sent>(sent));
35
+ };
36
36
37
37
static_assert (HasRotateIter<int *, int *>);
38
38
@@ -48,10 +48,9 @@ static_assert(!HasRotateIter<int*, SentinelForNotWeaklyEqualityComparableWith>);
48
48
// =========================================
49
49
50
50
template <class Range >
51
- concept HasRotateRange =
52
- requires (Range&& range, std::ranges::iterator_t <Range> iter) {
53
- std::ranges::rotate (std::forward<Range>(range), iter);
54
- };
51
+ concept HasRotateRange = requires (Range&& range, std::ranges::iterator_t <Range> iter) {
52
+ std::ranges::rotate (std::forward<Range>(range), iter);
53
+ };
55
54
56
55
template <class T >
57
56
using R = UncheckedRange<T>;
@@ -73,10 +72,10 @@ constexpr void test_one(const std::array<int, N> input, std::size_t mid_index, s
73
72
assert (mid_index <= N);
74
73
75
74
{ // (iterator, sentinel) overload.
76
- auto in = input;
75
+ auto in = input;
77
76
auto begin = Iter (in.data ());
78
- auto mid = Iter (in.data () + mid_index);
79
- auto end = Sent (Iter (in.data () + in.size ()));
77
+ auto mid = Iter (in.data () + mid_index);
78
+ auto end = Sent (Iter (in.data () + in.size ()));
80
79
81
80
std::same_as<std::ranges::subrange<Iter>> decltype (auto ) result = std::ranges::rotate (begin, mid, end);
82
81
assert (base (result.begin ()) == in.data () + in.size () - mid_index);
@@ -85,10 +84,10 @@ constexpr void test_one(const std::array<int, N> input, std::size_t mid_index, s
85
84
}
86
85
87
86
{ // (range) overload.
88
- auto in = input;
87
+ auto in = input;
89
88
auto begin = Iter (in.data ());
90
- auto mid = Iter (in.data () + mid_index);
91
- auto end = Sent (Iter (in.data () + in.size ()));
89
+ auto mid = Iter (in.data () + mid_index);
90
+ auto end = Sent (Iter (in.data () + in.size ()));
92
91
auto range = std::ranges::subrange (std::move (begin), std::move (end));
93
92
94
93
std::same_as<std::ranges::subrange<Iter>> decltype (auto ) result = std::ranges::rotate (range, mid);
@@ -132,32 +131,21 @@ constexpr void test_iter_sent() {
132
131
test_one<Iter, Sent, 7 >({1 , 2 , 3 , 4 , 5 , 6 , 7 }, 7 , {1 , 2 , 3 , 4 , 5 , 6 , 7 });
133
132
}
134
133
135
- template <class Iter >
136
- constexpr void test_iter () {
137
- test_iter_sent<Iter, Iter>();
138
- test_iter_sent<Iter, sentinel_wrapper<Iter>>();
139
- }
140
-
141
- constexpr void test_iterators () {
142
- test_iter<forward_iterator<int *>>();
143
- test_iter<bidirectional_iterator<int *>>();
144
- test_iter<random_access_iterator<int *>>();
145
- test_iter<contiguous_iterator<int *>>();
146
- test_iter<int *>();
147
- }
148
-
149
134
constexpr bool test () {
150
- test_iterators ();
135
+ types::for_each (types::forward_iterator_list<int *>(), []<class Iter >() {
136
+ test_iter_sent<Iter, Iter>();
137
+ test_iter_sent<Iter, sentinel_wrapper<Iter>>();
138
+ });
151
139
152
140
{ // Complexity: at most `last - first` swaps.
153
141
const std::array input = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };
154
- auto expected = static_cast <int >(input.size ());
142
+ auto expected = static_cast <int >(input.size ());
155
143
156
144
{
157
- auto in = input;
158
- int swaps = 0 ;
145
+ auto in = input;
146
+ int swaps = 0 ;
159
147
auto begin = adl::Iterator::TrackSwaps (in.data (), swaps);
160
- auto end = adl::Iterator::TrackSwaps (in.data () + in.size (), swaps);
148
+ auto end = adl::Iterator::TrackSwaps (in.data () + in.size (), swaps);
161
149
162
150
for (std::size_t mid = 0 ; mid != input.size (); ++mid) {
163
151
std::ranges::rotate (begin, begin + mid, end);
@@ -166,10 +154,10 @@ constexpr bool test() {
166
154
}
167
155
168
156
{
169
- auto in = input;
170
- int swaps = 0 ;
157
+ auto in = input;
158
+ int swaps = 0 ;
171
159
auto begin = adl::Iterator::TrackSwaps (in.data (), swaps);
172
- auto end = adl::Iterator::TrackSwaps (in.data () + in.size (), swaps);
160
+ auto end = adl::Iterator::TrackSwaps (in.data () + in.size (), swaps);
173
161
auto range = std::ranges::subrange (begin, end);
174
162
175
163
for (std::size_t mid = 0 ; mid != input.size (); ++mid) {
0 commit comments