xref: /llvm-project/libcxx/test/std/algorithms/alg.modifying.operations/alg.rotate/rotate_copy.pass.cpp (revision 57b08b0944046a6a57ee9b7b479181f548a5b9b4)
1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // <algorithm>
10 
11 // template<ForwardIterator InIter, OutputIterator<auto, InIter::reference> OutIter>
12 //   constexpr OutIter          // constexpr after C++17
13 //   rotate_copy(InIter first, InIter middle, InIter last, OutIter result);
14 
15 #include <algorithm>
16 #include <cassert>
17 
18 #include "test_macros.h"
19 #include "test_iterators.h"
20 
21 // #if TEST_STD_VER > 17
22 // TEST_CONSTEXPR bool test_constexpr() {
23 //     int ia[] = {1, 3, 5, 2, 5, 6};
24 //     int ib[std::size(ia)] = {0};
25 //
26 //     const size_t N = 2;
27 //     const auto middle = std::begin(ia) + N;
28 //     auto it = std::rotate_copy(std::begin(ia), middle, std::end(ia), std::begin(ib));
29 //
30 //     return std::distance(std::begin(ib), it) == std::size(ia)
31 //         && std::equal   (std::begin(ia), middle,       std::begin(ib) + std::size(ia) - N)
32 //         && std::equal   (middle,         std::end(ia), std::begin(ib))
33 //            ;
34 //     }
35 // #endif
36 
37 template <class InIter, class OutIter>
38 void
39 test()
40 {
41     int ia[] = {0, 1, 2, 3};
42     const unsigned sa = sizeof(ia)/sizeof(ia[0]);
43     int ib[sa] = {0};
44 
45     OutIter r = std::rotate_copy(InIter(ia), InIter(ia), InIter(ia), OutIter(ib));
46     assert(base(r) == ib);
47 
48     r = std::rotate_copy(InIter(ia), InIter(ia), InIter(ia+1), OutIter(ib));
49     assert(base(r) == ib+1);
50     assert(ib[0] == 0);
51 
52     r = std::rotate_copy(InIter(ia), InIter(ia+1), InIter(ia+1), OutIter(ib));
53     assert(base(r) == ib+1);
54     assert(ib[0] == 0);
55 
56     r = std::rotate_copy(InIter(ia), InIter(ia), InIter(ia+2), OutIter(ib));
57     assert(base(r) == ib+2);
58     assert(ib[0] == 0);
59     assert(ib[1] == 1);
60 
61     r = std::rotate_copy(InIter(ia), InIter(ia+1), InIter(ia+2), OutIter(ib));
62     assert(base(r) == ib+2);
63     assert(ib[0] == 1);
64     assert(ib[1] == 0);
65 
66     r = std::rotate_copy(InIter(ia), InIter(ia+2), InIter(ia+2), OutIter(ib));
67     assert(base(r) == ib+2);
68     assert(ib[0] == 0);
69     assert(ib[1] == 1);
70 
71     r = std::rotate_copy(InIter(ia), InIter(ia), InIter(ia+3), OutIter(ib));
72     assert(base(r) == ib+3);
73     assert(ib[0] == 0);
74     assert(ib[1] == 1);
75     assert(ib[2] == 2);
76 
77     r = std::rotate_copy(InIter(ia), InIter(ia+1), InIter(ia+3), OutIter(ib));
78     assert(base(r) == ib+3);
79     assert(ib[0] == 1);
80     assert(ib[1] == 2);
81     assert(ib[2] == 0);
82 
83     r = std::rotate_copy(InIter(ia), InIter(ia+2), InIter(ia+3), OutIter(ib));
84     assert(base(r) == ib+3);
85     assert(ib[0] == 2);
86     assert(ib[1] == 0);
87     assert(ib[2] == 1);
88 
89     r = std::rotate_copy(InIter(ia), InIter(ia+3), InIter(ia+3), OutIter(ib));
90     assert(base(r) == ib+3);
91     assert(ib[0] == 0);
92     assert(ib[1] == 1);
93     assert(ib[2] == 2);
94 
95     r = std::rotate_copy(InIter(ia), InIter(ia), InIter(ia+4), OutIter(ib));
96     assert(base(r) == ib+4);
97     assert(ib[0] == 0);
98     assert(ib[1] == 1);
99     assert(ib[2] == 2);
100     assert(ib[3] == 3);
101 
102     r = std::rotate_copy(InIter(ia), InIter(ia+1), InIter(ia+4), OutIter(ib));
103     assert(base(r) == ib+4);
104     assert(ib[0] == 1);
105     assert(ib[1] == 2);
106     assert(ib[2] == 3);
107     assert(ib[3] == 0);
108 
109     r = std::rotate_copy(InIter(ia), InIter(ia+2), InIter(ia+4), OutIter(ib));
110     assert(base(r) == ib+4);
111     assert(ib[0] == 2);
112     assert(ib[1] == 3);
113     assert(ib[2] == 0);
114     assert(ib[3] == 1);
115 
116     r = std::rotate_copy(InIter(ia), InIter(ia+3), InIter(ia+4), OutIter(ib));
117     assert(base(r) == ib+4);
118     assert(ib[0] == 3);
119     assert(ib[1] == 0);
120     assert(ib[2] == 1);
121     assert(ib[3] == 2);
122 
123     r = std::rotate_copy(InIter(ia), InIter(ia+4), InIter(ia+4), OutIter(ib));
124     assert(base(r) == ib+4);
125     assert(ib[0] == 0);
126     assert(ib[1] == 1);
127     assert(ib[2] == 2);
128     assert(ib[3] == 3);
129 }
130 
131 int main()
132 {
133     test<bidirectional_iterator<const int*>, output_iterator<int*> >();
134     test<bidirectional_iterator<const int*>, forward_iterator<int*> >();
135     test<bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
136     test<bidirectional_iterator<const int*>, random_access_iterator<int*> >();
137     test<bidirectional_iterator<const int*>, int*>();
138 
139     test<random_access_iterator<const int*>, output_iterator<int*> >();
140     test<random_access_iterator<const int*>, forward_iterator<int*> >();
141     test<random_access_iterator<const int*>, bidirectional_iterator<int*> >();
142     test<random_access_iterator<const int*>, random_access_iterator<int*> >();
143     test<random_access_iterator<const int*>, int*>();
144 
145     test<const int*, output_iterator<int*> >();
146     test<const int*, forward_iterator<int*> >();
147     test<const int*, bidirectional_iterator<int*> >();
148     test<const int*, random_access_iterator<int*> >();
149     test<const int*, int*>();
150 
151 // #if TEST_STD_VER > 17
152 //    static_assert(test_constexpr());
153 // #endif
154 }
155