26
26
27
27
#include " almost_satisfies_types.h"
28
28
#include " test_iterators.h"
29
+ #include " type_algorithms.h"
29
30
30
31
template <class Iter , class Out = int *, class Sent = sentinel_wrapper<Iter>>
31
- concept HasRotateCopyIt = requires(Iter first, Sent last, Out out) { std::ranges::rotate_copy (first, first, last, out); };
32
+ concept HasRotateCopyIt =
33
+ requires (Iter first, Sent last, Out out) { std::ranges::rotate_copy (first, first, last, out); };
32
34
33
35
template <class Range , class Out = int *>
34
36
concept HasRotateCopyR = requires(Range range, Out out) { std::ranges::rotate_copy (range, nullptr , out); };
@@ -54,11 +56,8 @@ template <class Iter, class OutIter, class Sent, int N>
54
56
constexpr void test (std::array<int , N> value, std::size_t middle, std::array<int , N> expected) {
55
57
{
56
58
std::array<int , N> out;
57
- std::same_as<std::ranges::in_out_result<Iter, OutIter>> decltype (auto ) ret =
58
- std::ranges::rotate_copy (Iter (value.data ()),
59
- Iter (value.data () + middle),
60
- Sent (Iter (value.data () + value.size ())),
61
- OutIter (out.data ()));
59
+ std::same_as<std::ranges::in_out_result<Iter, OutIter>> decltype (auto ) ret = std::ranges::rotate_copy (
60
+ Iter (value.data ()), Iter (value.data () + middle), Sent (Iter (value.data () + value.size ())), OutIter (out.data ()));
62
61
assert (base (ret.in ) == value.data () + value.size ());
63
62
assert (base (ret.out ) == out.data () + out.size ());
64
63
assert (out == expected);
@@ -74,7 +73,7 @@ constexpr void test(std::array<int, N> value, std::size_t middle, std::array<int
74
73
}
75
74
}
76
75
77
- template <class Iter , class OutIter , class Sent >
76
+ template <class Iter , class OutIter , class Sent = Iter >
78
77
constexpr void test_iterators () {
79
78
// simple test
80
79
test<Iter, OutIter, Sent, 4 >({1 , 2 , 3 , 4 }, 2 , {3 , 4 , 1 , 2 });
@@ -101,41 +100,33 @@ constexpr void test_iterators() {
101
100
test<Iter, OutIter, Sent, 7 >({1 , 2 , 3 , 4 , 5 , 6 , 7 }, 7 , {1 , 2 , 3 , 4 , 5 , 6 , 7 });
102
101
}
103
102
104
- template <class Iter , class Sent = Iter>
105
- constexpr void test_out_iterators () {
106
- test_iterators<Iter, cpp20_output_iterator<int *>, Sent>();
107
- test_iterators<Iter, forward_iterator<int *>, Sent>();
108
- test_iterators<Iter, bidirectional_iterator<int *>, Sent>();
109
- test_iterators<Iter, random_access_iterator<int *>, Sent>();
110
- test_iterators<Iter, contiguous_iterator<int *>, Sent>();
111
- test_iterators<Iter, int *, Sent>();
112
- }
113
-
114
103
constexpr bool test () {
115
- test_out_iterators<forward_iterator<int *>>();
116
- test_out_iterators<bidirectional_iterator<int *>>();
117
- test_out_iterators<random_access_iterator<int *>>();
118
- test_out_iterators<contiguous_iterator<int *>>();
119
- test_out_iterators<int *>();
120
- test_out_iterators<const int *>();
104
+ types::for_each (types::forward_iterator_list<int *>(), []<class Iter >() {
105
+ types::for_each (types::cpp20_output_iterator_list<int *>(), []<class OutIter >() {
106
+ test_iterators<Iter, OutIter>();
107
+ });
108
+ });
121
109
122
110
{
123
111
struct AssignmentCounter {
124
112
int * counter;
125
113
126
114
constexpr AssignmentCounter (int * counter_) : counter(counter_) {}
127
- constexpr AssignmentCounter& operator =(const AssignmentCounter&) { ++*counter; return *this ; }
115
+ constexpr AssignmentCounter& operator =(const AssignmentCounter&) {
116
+ ++*counter;
117
+ return *this ;
118
+ }
128
119
};
129
120
130
121
{
131
- int c = 0 ;
122
+ int c = 0 ;
132
123
AssignmentCounter a[] = {&c, &c, &c, &c};
133
124
AssignmentCounter b[] = {&c, &c, &c, &c};
134
125
std::ranges::rotate_copy (a, a + 2 , a + 4 , b);
135
126
assert (c == 4 );
136
127
}
137
128
{
138
- int c = 0 ;
129
+ int c = 0 ;
139
130
AssignmentCounter a[] = {&c, &c, &c, &c};
140
131
AssignmentCounter b[] = {&c, &c, &c, &c};
141
132
std::ranges::rotate_copy (a, a + 2 , b);
0 commit comments