2121#include < array>
2222#include < cassert>
2323#include < ranges>
24+ #include < vector>
2425
2526#include " almost_satisfies_types.h"
2627#include " test_iterators.h"
2930// ======================================================
3031
3132template <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+ };
3636
3737static_assert (HasRotateIter<int *, int *>);
3838
@@ -48,10 +48,9 @@ static_assert(!HasRotateIter<int*, SentinelForNotWeaklyEqualityComparableWith>);
4848// =========================================
4949
5050template <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+ };
5554
5655template <class T >
5756using R = UncheckedRange<T>;
@@ -73,10 +72,10 @@ constexpr void test_one(const std::array<int, N> input, std::size_t mid_index, s
7372 assert (mid_index <= N);
7473
7574 { // (iterator, sentinel) overload.
76- auto in = input;
75+ auto in = input;
7776 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 ()));
8079
8180 std::same_as<std::ranges::subrange<Iter>> decltype (auto ) result = std::ranges::rotate (begin, mid, end);
8281 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
8584 }
8685
8786 { // (range) overload.
88- auto in = input;
87+ auto in = input;
8988 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 ()));
9291 auto range = std::ranges::subrange (std::move (begin), std::move (end));
9392
9493 std::same_as<std::ranges::subrange<Iter>> decltype (auto ) result = std::ranges::rotate (range, mid);
@@ -146,18 +145,39 @@ constexpr void test_iterators() {
146145 test_iter<int *>();
147146}
148147
148+ template <std::size_t N>
149+ TEST_CONSTEXPR_CXX20 bool test_bit_iterator () {
150+ for (int offset = -1 ; offset <= 1 ; ++offset) {
151+ std::vector<bool > a (N, false );
152+ std::size_t mid = N / 2 + offset;
153+ for (std::size_t i = mid; i < N; ++i)
154+ a[i] = true ;
155+
156+ // (iterator, sentinel)-overload
157+ std::ranges::rotate (std::ranges::begin (a), std::ranges::begin (a) + mid, std::ranges::end (a));
158+ for (std::size_t i = 0 ; i < N; ++i)
159+ assert (a[i] == (i < N - mid));
160+
161+ // range-overload
162+ std::ranges::rotate (a, std::ranges::begin (a) + (N - mid));
163+ for (std::size_t i = 0 ; i < N; ++i)
164+ assert (a[i] == (i >= mid));
165+ }
166+ return true ;
167+ };
168+
149169constexpr bool test () {
150170 test_iterators ();
151171
152172 { // Complexity: at most `last - first` swaps.
153173 const std::array input = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };
154- auto expected = static_cast <int >(input.size ());
174+ auto expected = static_cast <int >(input.size ());
155175
156176 {
157- auto in = input;
158- int swaps = 0 ;
177+ auto in = input;
178+ int swaps = 0 ;
159179 auto begin = adl::Iterator::TrackSwaps (in.data (), swaps);
160- auto end = adl::Iterator::TrackSwaps (in.data () + in.size (), swaps);
180+ auto end = adl::Iterator::TrackSwaps (in.data () + in.size (), swaps);
161181
162182 for (std::size_t mid = 0 ; mid != input.size (); ++mid) {
163183 std::ranges::rotate (begin, begin + mid, end);
@@ -166,10 +186,10 @@ constexpr bool test() {
166186 }
167187
168188 {
169- auto in = input;
170- int swaps = 0 ;
189+ auto in = input;
190+ int swaps = 0 ;
171191 auto begin = adl::Iterator::TrackSwaps (in.data (), swaps);
172- auto end = adl::Iterator::TrackSwaps (in.data () + in.size (), swaps);
192+ auto end = adl::Iterator::TrackSwaps (in.data () + in.size (), swaps);
173193 auto range = std::ranges::subrange (begin, end);
174194
175195 for (std::size_t mid = 0 ; mid != input.size (); ++mid) {
@@ -179,6 +199,11 @@ constexpr bool test() {
179199 }
180200 }
181201
202+ test_bit_iterator<8 >();
203+ test_bit_iterator<16 >();
204+ test_bit_iterator<64 >();
205+ test_bit_iterator<100 >();
206+
182207 return true ;
183208}
184209
0 commit comments