1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // <algorithm>
11 
12 // template<ForwardIterator InIter, OutputIterator<auto, InIter::reference> OutIter>
13 //   OutIter
14 //   rotate_copy(InIter first, InIter middle, InIter last, OutIter result);
15 
16 #include <algorithm>
17 #include <cassert>
18 
19 #include "test_iterators.h"
20 
21 template <class InIter, class OutIter>
22 void
test()23 test()
24 {
25     int ia[] = {0, 1, 2, 3};
26     const unsigned sa = sizeof(ia)/sizeof(ia[0]);
27     int ib[sa] = {0};
28 
29     OutIter r = std::rotate_copy(InIter(ia), InIter(ia), InIter(ia), OutIter(ib));
30     assert(base(r) == ib);
31 
32     r = std::rotate_copy(InIter(ia), InIter(ia), InIter(ia+1), OutIter(ib));
33     assert(base(r) == ib+1);
34     assert(ib[0] == 0);
35 
36     r = std::rotate_copy(InIter(ia), InIter(ia+1), InIter(ia+1), OutIter(ib));
37     assert(base(r) == ib+1);
38     assert(ib[0] == 0);
39 
40     r = std::rotate_copy(InIter(ia), InIter(ia), InIter(ia+2), OutIter(ib));
41     assert(base(r) == ib+2);
42     assert(ib[0] == 0);
43     assert(ib[1] == 1);
44 
45     r = std::rotate_copy(InIter(ia), InIter(ia+1), InIter(ia+2), OutIter(ib));
46     assert(base(r) == ib+2);
47     assert(ib[0] == 1);
48     assert(ib[1] == 0);
49 
50     r = std::rotate_copy(InIter(ia), InIter(ia+2), InIter(ia+2), OutIter(ib));
51     assert(base(r) == ib+2);
52     assert(ib[0] == 0);
53     assert(ib[1] == 1);
54 
55     r = std::rotate_copy(InIter(ia), InIter(ia), InIter(ia+3), OutIter(ib));
56     assert(base(r) == ib+3);
57     assert(ib[0] == 0);
58     assert(ib[1] == 1);
59     assert(ib[2] == 2);
60 
61     r = std::rotate_copy(InIter(ia), InIter(ia+1), InIter(ia+3), OutIter(ib));
62     assert(base(r) == ib+3);
63     assert(ib[0] == 1);
64     assert(ib[1] == 2);
65     assert(ib[2] == 0);
66 
67     r = std::rotate_copy(InIter(ia), InIter(ia+2), InIter(ia+3), OutIter(ib));
68     assert(base(r) == ib+3);
69     assert(ib[0] == 2);
70     assert(ib[1] == 0);
71     assert(ib[2] == 1);
72 
73     r = std::rotate_copy(InIter(ia), InIter(ia+3), InIter(ia+3), OutIter(ib));
74     assert(base(r) == ib+3);
75     assert(ib[0] == 0);
76     assert(ib[1] == 1);
77     assert(ib[2] == 2);
78 
79     r = std::rotate_copy(InIter(ia), InIter(ia), InIter(ia+4), OutIter(ib));
80     assert(base(r) == ib+4);
81     assert(ib[0] == 0);
82     assert(ib[1] == 1);
83     assert(ib[2] == 2);
84     assert(ib[3] == 3);
85 
86     r = std::rotate_copy(InIter(ia), InIter(ia+1), InIter(ia+4), OutIter(ib));
87     assert(base(r) == ib+4);
88     assert(ib[0] == 1);
89     assert(ib[1] == 2);
90     assert(ib[2] == 3);
91     assert(ib[3] == 0);
92 
93     r = std::rotate_copy(InIter(ia), InIter(ia+2), InIter(ia+4), OutIter(ib));
94     assert(base(r) == ib+4);
95     assert(ib[0] == 2);
96     assert(ib[1] == 3);
97     assert(ib[2] == 0);
98     assert(ib[3] == 1);
99 
100     r = std::rotate_copy(InIter(ia), InIter(ia+3), InIter(ia+4), OutIter(ib));
101     assert(base(r) == ib+4);
102     assert(ib[0] == 3);
103     assert(ib[1] == 0);
104     assert(ib[2] == 1);
105     assert(ib[3] == 2);
106 
107     r = std::rotate_copy(InIter(ia), InIter(ia+4), InIter(ia+4), OutIter(ib));
108     assert(base(r) == ib+4);
109     assert(ib[0] == 0);
110     assert(ib[1] == 1);
111     assert(ib[2] == 2);
112     assert(ib[3] == 3);
113 }
114 
main()115 int main()
116 {
117     test<bidirectional_iterator<const int*>, output_iterator<int*> >();
118     test<bidirectional_iterator<const int*>, forward_iterator<int*> >();
119     test<bidirectional_iterator<const int*>, bidirectional_iterator<int*> >();
120     test<bidirectional_iterator<const int*>, random_access_iterator<int*> >();
121     test<bidirectional_iterator<const int*>, int*>();
122 
123     test<random_access_iterator<const int*>, output_iterator<int*> >();
124     test<random_access_iterator<const int*>, forward_iterator<int*> >();
125     test<random_access_iterator<const int*>, bidirectional_iterator<int*> >();
126     test<random_access_iterator<const int*>, random_access_iterator<int*> >();
127     test<random_access_iterator<const int*>, int*>();
128 
129     test<const int*, output_iterator<int*> >();
130     test<const int*, forward_iterator<int*> >();
131     test<const int*, bidirectional_iterator<int*> >();
132     test<const int*, random_access_iterator<int*> >();
133     test<const int*, int*>();
134 }
135