2121#include < array>
2222#include < cassert>
2323#include < ranges>
24+ #include < vector>
2425
2526#include " almost_satisfies_types.h"
27+ #include " test_macros.h"
2628#include " test_iterators.h"
2729
2830// Test constraints of the (iterator, sentinel) overload.
2931// ======================================================
3032
3133template <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- };
34+ concept HasRotateIter = requires (Iter&& iter, Sent&& sent) {
35+ std::ranges::rotate (std::forward<Iter>(iter), std::forward<Iter>(iter), std::forward<Sent>(sent));
36+ };
3637
3738static_assert (HasRotateIter<int *, int *>);
3839
@@ -48,10 +49,9 @@ static_assert(!HasRotateIter<int*, SentinelForNotWeaklyEqualityComparableWith>);
4849// =========================================
4950
5051template <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- };
52+ concept HasRotateRange = requires (Range&& range, std::ranges::iterator_t <Range> iter) {
53+ std::ranges::rotate (std::forward<Range>(range), iter);
54+ };
5555
5656template <class T >
5757using R = UncheckedRange<T>;
@@ -73,10 +73,10 @@ constexpr void test_one(const std::array<int, N> input, std::size_t mid_index, s
7373 assert (mid_index <= N);
7474
7575 { // (iterator, sentinel) overload.
76- auto in = input;
76+ auto in = input;
7777 auto begin = Iter (in.data ());
78- auto mid = Iter (in.data () + mid_index);
79- auto end = Sent (Iter (in.data () + in.size ()));
78+ auto mid = Iter (in.data () + mid_index);
79+ auto end = Sent (Iter (in.data () + in.size ()));
8080
8181 std::same_as<std::ranges::subrange<Iter>> decltype (auto ) result = std::ranges::rotate (begin, mid, end);
8282 assert (base (result.begin ()) == in.data () + in.size () - mid_index);
@@ -85,10 +85,10 @@ constexpr void test_one(const std::array<int, N> input, std::size_t mid_index, s
8585 }
8686
8787 { // (range) overload.
88- auto in = input;
88+ auto in = input;
8989 auto begin = Iter (in.data ());
90- auto mid = Iter (in.data () + mid_index);
91- auto end = Sent (Iter (in.data () + in.size ()));
90+ auto mid = Iter (in.data () + mid_index);
91+ auto end = Sent (Iter (in.data () + in.size ()));
9292 auto range = std::ranges::subrange (std::move (begin), std::move (end));
9393
9494 std::same_as<std::ranges::subrange<Iter>> decltype (auto ) result = std::ranges::rotate (range, mid);
@@ -146,18 +146,41 @@ constexpr void test_iterators() {
146146 test_iter<int *>();
147147}
148148
149+ #if TEST_STD_VER >= 23
150+ template <std::size_t N>
151+ TEST_CONSTEXPR_CXX20 bool test_vector_bool () {
152+ for (int offset = -1 ; offset <= 1 ; ++offset) {
153+ std::vector<bool > a (N, false );
154+ std::size_t mid = N / 2 + offset;
155+ for (std::size_t i = mid; i < N; ++i)
156+ a[i] = true ;
157+
158+ // (iterator, sentinel)-overload
159+ std::ranges::rotate (std::ranges::begin (a), std::ranges::begin (a) + mid, std::ranges::end (a));
160+ for (std::size_t i = 0 ; i < N; ++i)
161+ assert (a[i] == (i < N - mid));
162+
163+ // range-overload
164+ std::ranges::rotate (a, std::ranges::begin (a) + (N - mid));
165+ for (std::size_t i = 0 ; i < N; ++i)
166+ assert (a[i] == (i >= mid));
167+ }
168+ return true ;
169+ };
170+ #endif
171+
149172constexpr bool test () {
150173 test_iterators ();
151174
152175 { // Complexity: at most `last - first` swaps.
153176 const std::array input = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };
154- auto expected = static_cast <int >(input.size ());
177+ auto expected = static_cast <int >(input.size ());
155178
156179 {
157- auto in = input;
158- int swaps = 0 ;
180+ auto in = input;
181+ int swaps = 0 ;
159182 auto begin = adl::Iterator::TrackSwaps (in.data (), swaps);
160- auto end = adl::Iterator::TrackSwaps (in.data () + in.size (), swaps);
183+ auto end = adl::Iterator::TrackSwaps (in.data () + in.size (), swaps);
161184
162185 for (std::size_t mid = 0 ; mid != input.size (); ++mid) {
163186 std::ranges::rotate (begin, begin + mid, end);
@@ -166,10 +189,10 @@ constexpr bool test() {
166189 }
167190
168191 {
169- auto in = input;
170- int swaps = 0 ;
192+ auto in = input;
193+ int swaps = 0 ;
171194 auto begin = adl::Iterator::TrackSwaps (in.data (), swaps);
172- auto end = adl::Iterator::TrackSwaps (in.data () + in.size (), swaps);
195+ auto end = adl::Iterator::TrackSwaps (in.data () + in.size (), swaps);
173196 auto range = std::ranges::subrange (begin, end);
174197
175198 for (std::size_t mid = 0 ; mid != input.size (); ++mid) {
@@ -179,6 +202,13 @@ constexpr bool test() {
179202 }
180203 }
181204
205+ #if TEST_STD_VER >= 23
206+ test_vector_bool<8 >();
207+ test_vector_bool<16 >();
208+ test_vector_bool<64 >();
209+ test_vector_bool<256 >();
210+ #endif
211+
182212 return true ;
183213}
184214
0 commit comments