xref: /llvm-project/libcxx/test/std/algorithms/alg.modifying.operations/alg.rotate/rotate.pass.cpp (revision 2df59c50688c122bbcae7467d3eaf862c3ea3088)
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<ShuffleIterator Iter>
12 //   Iter
13 //   rotate(Iter first, Iter middle, Iter last);
14 
15 #include <algorithm>
16 #include <cassert>
17 #include <memory>
18 
19 #include "test_macros.h"
20 #include "test_iterators.h"
21 
22 template <class Iter>
23 void
24 test()
25 {
26     int ia[] = {0};
27     const int sa = static_cast<int>(sizeof(ia)/sizeof(ia[0]));
28     Iter r = std::rotate(Iter(ia), Iter(ia), Iter(ia));
29     assert(base(r) == ia);
30     assert(ia[0] == 0);
31     r = std::rotate(Iter(ia), Iter(ia), Iter(ia+sa));
32     assert(base(r) == ia+sa);
33     assert(ia[0] == 0);
34     r = std::rotate(Iter(ia), Iter(ia+sa), Iter(ia+sa));
35     assert(base(r) == ia);
36     assert(ia[0] == 0);
37 
38     int ib[] = {0, 1};
39     const int sb = static_cast<int>(sizeof(ib)/sizeof(ib[0]));
40     r = std::rotate(Iter(ib), Iter(ib), Iter(ib+sb));
41     assert(base(r) == ib+sb);
42     assert(ib[0] == 0);
43     assert(ib[1] == 1);
44     r = std::rotate(Iter(ib), Iter(ib+1), Iter(ib+sb));
45     assert(base(r) == ib+1);
46     assert(ib[0] == 1);
47     assert(ib[1] == 0);
48     r = std::rotate(Iter(ib), Iter(ib+sb), Iter(ib+sb));
49     assert(base(r) == ib);
50     assert(ib[0] == 1);
51     assert(ib[1] == 0);
52 
53     int ic[] = {0, 1, 2};
54     const int sc = static_cast<int>(sizeof(ic)/sizeof(ic[0]));
55     r = std::rotate(Iter(ic), Iter(ic), Iter(ic+sc));
56     assert(base(r) == ic+sc);
57     assert(ic[0] == 0);
58     assert(ic[1] == 1);
59     assert(ic[2] == 2);
60     r = std::rotate(Iter(ic), Iter(ic+1), Iter(ic+sc));
61     assert(base(r) == ic+2);
62     assert(ic[0] == 1);
63     assert(ic[1] == 2);
64     assert(ic[2] == 0);
65     r = std::rotate(Iter(ic), Iter(ic+2), Iter(ic+sc));
66     assert(base(r) == ic+1);
67     assert(ic[0] == 0);
68     assert(ic[1] == 1);
69     assert(ic[2] == 2);
70     r = std::rotate(Iter(ic), Iter(ic+sc), Iter(ic+sc));
71     assert(base(r) == ic);
72     assert(ic[0] == 0);
73     assert(ic[1] == 1);
74     assert(ic[2] == 2);
75 
76     int id[] = {0, 1, 2, 3};
77     const int sd = static_cast<int>(sizeof(id)/sizeof(id[0]));
78     r = std::rotate(Iter(id), Iter(id), Iter(id+sd));
79     assert(base(r) == id+sd);
80     assert(id[0] == 0);
81     assert(id[1] == 1);
82     assert(id[2] == 2);
83     assert(id[3] == 3);
84     r = std::rotate(Iter(id), Iter(id+1), Iter(id+sd));
85     assert(base(r) == id+3);
86     assert(id[0] == 1);
87     assert(id[1] == 2);
88     assert(id[2] == 3);
89     assert(id[3] == 0);
90     r = std::rotate(Iter(id), Iter(id+2), Iter(id+sd));
91     assert(base(r) == id+2);
92     assert(id[0] == 3);
93     assert(id[1] == 0);
94     assert(id[2] == 1);
95     assert(id[3] == 2);
96     r = std::rotate(Iter(id), Iter(id+3), Iter(id+sd));
97     assert(base(r) == id+1);
98     assert(id[0] == 2);
99     assert(id[1] == 3);
100     assert(id[2] == 0);
101     assert(id[3] == 1);
102     r = std::rotate(Iter(id), Iter(id+sd), Iter(id+sd));
103     assert(base(r) == id);
104     assert(id[0] == 2);
105     assert(id[1] == 3);
106     assert(id[2] == 0);
107     assert(id[3] == 1);
108 
109     int ie[] = {0, 1, 2, 3, 4};
110     const int se = static_cast<int>(sizeof(ie)/sizeof(ie[0]));
111     r = std::rotate(Iter(ie), Iter(ie), Iter(ie+se));
112     assert(base(r) == ie+se);
113     assert(ie[0] == 0);
114     assert(ie[1] == 1);
115     assert(ie[2] == 2);
116     assert(ie[3] == 3);
117     assert(ie[4] == 4);
118     r = std::rotate(Iter(ie), Iter(ie+1), Iter(ie+se));
119     assert(base(r) == ie+4);
120     assert(ie[0] == 1);
121     assert(ie[1] == 2);
122     assert(ie[2] == 3);
123     assert(ie[3] == 4);
124     assert(ie[4] == 0);
125     r = std::rotate(Iter(ie), Iter(ie+2), Iter(ie+se));
126     assert(base(r) == ie+3);
127     assert(ie[0] == 3);
128     assert(ie[1] == 4);
129     assert(ie[2] == 0);
130     assert(ie[3] == 1);
131     assert(ie[4] == 2);
132     r = std::rotate(Iter(ie), Iter(ie+3), Iter(ie+se));
133     assert(base(r) == ie+2);
134     assert(ie[0] == 1);
135     assert(ie[1] == 2);
136     assert(ie[2] == 3);
137     assert(ie[3] == 4);
138     assert(ie[4] == 0);
139     r = std::rotate(Iter(ie), Iter(ie+4), Iter(ie+se));
140     assert(base(r) == ie+1);
141     assert(ie[0] == 0);
142     assert(ie[1] == 1);
143     assert(ie[2] == 2);
144     assert(ie[3] == 3);
145     assert(ie[4] == 4);
146     r = std::rotate(Iter(ie), Iter(ie+se), Iter(ie+se));
147     assert(base(r) == ie);
148     assert(ie[0] == 0);
149     assert(ie[1] == 1);
150     assert(ie[2] == 2);
151     assert(ie[3] == 3);
152     assert(ie[4] == 4);
153 
154     int ig[] = {0, 1, 2, 3, 4, 5};
155     const int sg = static_cast<int>(sizeof(ig)/sizeof(ig[0]));
156     r = std::rotate(Iter(ig), Iter(ig), Iter(ig+sg));
157     assert(base(r) == ig+sg);
158     assert(ig[0] == 0);
159     assert(ig[1] == 1);
160     assert(ig[2] == 2);
161     assert(ig[3] == 3);
162     assert(ig[4] == 4);
163     assert(ig[5] == 5);
164     r = std::rotate(Iter(ig), Iter(ig+1), Iter(ig+sg));
165     assert(base(r) == ig+5);
166     assert(ig[0] == 1);
167     assert(ig[1] == 2);
168     assert(ig[2] == 3);
169     assert(ig[3] == 4);
170     assert(ig[4] == 5);
171     assert(ig[5] == 0);
172     r = std::rotate(Iter(ig), Iter(ig+2), Iter(ig+sg));
173     assert(base(r) == ig+4);
174     assert(ig[0] == 3);
175     assert(ig[1] == 4);
176     assert(ig[2] == 5);
177     assert(ig[3] == 0);
178     assert(ig[4] == 1);
179     assert(ig[5] == 2);
180     r = std::rotate(Iter(ig), Iter(ig+3), Iter(ig+sg));
181     assert(base(r) == ig+3);
182     assert(ig[0] == 0);
183     assert(ig[1] == 1);
184     assert(ig[2] == 2);
185     assert(ig[3] == 3);
186     assert(ig[4] == 4);
187     assert(ig[5] == 5);
188     r = std::rotate(Iter(ig), Iter(ig+4), Iter(ig+sg));
189     assert(base(r) == ig+2);
190     assert(ig[0] == 4);
191     assert(ig[1] == 5);
192     assert(ig[2] == 0);
193     assert(ig[3] == 1);
194     assert(ig[4] == 2);
195     assert(ig[5] == 3);
196     r = std::rotate(Iter(ig), Iter(ig+5), Iter(ig+sg));
197     assert(base(r) == ig+1);
198     assert(ig[0] == 3);
199     assert(ig[1] == 4);
200     assert(ig[2] == 5);
201     assert(ig[3] == 0);
202     assert(ig[4] == 1);
203     assert(ig[5] == 2);
204     r = std::rotate(Iter(ig), Iter(ig+sg), Iter(ig+sg));
205     assert(base(r) == ig);
206     assert(ig[0] == 3);
207     assert(ig[1] == 4);
208     assert(ig[2] == 5);
209     assert(ig[3] == 0);
210     assert(ig[4] == 1);
211     assert(ig[5] == 2);
212 }
213 
214 #if TEST_STD_VER >= 11
215 
216 template <class Iter>
217 void
218 test1()
219 {
220     std::unique_ptr<int> ia[1];
221     const int sa = static_cast<int>(sizeof(ia)/sizeof(ia[0]));
222     for (int i = 0; i < sa; ++i)
223         ia[i].reset(new int(i));
224     Iter r = std::rotate(Iter(ia), Iter(ia), Iter(ia));
225     assert(base(r) == ia);
226     assert(*ia[0] == 0);
227     r = std::rotate(Iter(ia), Iter(ia), Iter(ia+sa));
228     assert(base(r) == ia+sa);
229     assert(*ia[0] == 0);
230     r = std::rotate(Iter(ia), Iter(ia+sa), Iter(ia+sa));
231     assert(base(r) == ia);
232     assert(*ia[0] == 0);
233 
234     std::unique_ptr<int> ib[2];
235     const int sb = static_cast<int>(sizeof(ib)/sizeof(ib[0]));
236     for (int i = 0; i < sb; ++i)
237         ib[i].reset(new int(i));
238     r = std::rotate(Iter(ib), Iter(ib), Iter(ib+sb));
239     assert(base(r) == ib+sb);
240     assert(*ib[0] == 0);
241     assert(*ib[1] == 1);
242     r = std::rotate(Iter(ib), Iter(ib+1), Iter(ib+sb));
243     assert(base(r) == ib+1);
244     assert(*ib[0] == 1);
245     assert(*ib[1] == 0);
246     r = std::rotate(Iter(ib), Iter(ib+sb), Iter(ib+sb));
247     assert(base(r) == ib);
248     assert(*ib[0] == 1);
249     assert(*ib[1] == 0);
250 
251     std::unique_ptr<int> ic[3];
252     const int sc = static_cast<int>(sizeof(ic)/sizeof(ic[0]));
253     for (int i = 0; i < sc; ++i)
254         ic[i].reset(new int(i));
255     r = std::rotate(Iter(ic), Iter(ic), Iter(ic+sc));
256     assert(base(r) == ic+sc);
257     assert(*ic[0] == 0);
258     assert(*ic[1] == 1);
259     assert(*ic[2] == 2);
260     r = std::rotate(Iter(ic), Iter(ic+1), Iter(ic+sc));
261     assert(base(r) == ic+2);
262     assert(*ic[0] == 1);
263     assert(*ic[1] == 2);
264     assert(*ic[2] == 0);
265     r = std::rotate(Iter(ic), Iter(ic+2), Iter(ic+sc));
266     assert(base(r) == ic+1);
267     assert(*ic[0] == 0);
268     assert(*ic[1] == 1);
269     assert(*ic[2] == 2);
270     r = std::rotate(Iter(ic), Iter(ic+sc), Iter(ic+sc));
271     assert(base(r) == ic);
272     assert(*ic[0] == 0);
273     assert(*ic[1] == 1);
274     assert(*ic[2] == 2);
275 
276     std::unique_ptr<int> id[4];
277     const int sd = static_cast<int>(sizeof(id)/sizeof(id[0]));
278     for (int i = 0; i < sd; ++i)
279         id[i].reset(new int(i));
280     r = std::rotate(Iter(id), Iter(id), Iter(id+sd));
281     assert(base(r) == id+sd);
282     assert(*id[0] == 0);
283     assert(*id[1] == 1);
284     assert(*id[2] == 2);
285     assert(*id[3] == 3);
286     r = std::rotate(Iter(id), Iter(id+1), Iter(id+sd));
287     assert(base(r) == id+3);
288     assert(*id[0] == 1);
289     assert(*id[1] == 2);
290     assert(*id[2] == 3);
291     assert(*id[3] == 0);
292     r = std::rotate(Iter(id), Iter(id+2), Iter(id+sd));
293     assert(base(r) == id+2);
294     assert(*id[0] == 3);
295     assert(*id[1] == 0);
296     assert(*id[2] == 1);
297     assert(*id[3] == 2);
298     r = std::rotate(Iter(id), Iter(id+3), Iter(id+sd));
299     assert(base(r) == id+1);
300     assert(*id[0] == 2);
301     assert(*id[1] == 3);
302     assert(*id[2] == 0);
303     assert(*id[3] == 1);
304     r = std::rotate(Iter(id), Iter(id+sd), Iter(id+sd));
305     assert(base(r) == id);
306     assert(*id[0] == 2);
307     assert(*id[1] == 3);
308     assert(*id[2] == 0);
309     assert(*id[3] == 1);
310 
311     std::unique_ptr<int> ie[5];
312     const int se = static_cast<int>(sizeof(ie)/sizeof(ie[0]));
313     for (int i = 0; i < se; ++i)
314         ie[i].reset(new int(i));
315     r = std::rotate(Iter(ie), Iter(ie), Iter(ie+se));
316     assert(base(r) == ie+se);
317     assert(*ie[0] == 0);
318     assert(*ie[1] == 1);
319     assert(*ie[2] == 2);
320     assert(*ie[3] == 3);
321     assert(*ie[4] == 4);
322     r = std::rotate(Iter(ie), Iter(ie+1), Iter(ie+se));
323     assert(base(r) == ie+4);
324     assert(*ie[0] == 1);
325     assert(*ie[1] == 2);
326     assert(*ie[2] == 3);
327     assert(*ie[3] == 4);
328     assert(*ie[4] == 0);
329     r = std::rotate(Iter(ie), Iter(ie+2), Iter(ie+se));
330     assert(base(r) == ie+3);
331     assert(*ie[0] == 3);
332     assert(*ie[1] == 4);
333     assert(*ie[2] == 0);
334     assert(*ie[3] == 1);
335     assert(*ie[4] == 2);
336     r = std::rotate(Iter(ie), Iter(ie+3), Iter(ie+se));
337     assert(base(r) == ie+2);
338     assert(*ie[0] == 1);
339     assert(*ie[1] == 2);
340     assert(*ie[2] == 3);
341     assert(*ie[3] == 4);
342     assert(*ie[4] == 0);
343     r = std::rotate(Iter(ie), Iter(ie+4), Iter(ie+se));
344     assert(base(r) == ie+1);
345     assert(*ie[0] == 0);
346     assert(*ie[1] == 1);
347     assert(*ie[2] == 2);
348     assert(*ie[3] == 3);
349     assert(*ie[4] == 4);
350     r = std::rotate(Iter(ie), Iter(ie+se), Iter(ie+se));
351     assert(base(r) == ie);
352     assert(*ie[0] == 0);
353     assert(*ie[1] == 1);
354     assert(*ie[2] == 2);
355     assert(*ie[3] == 3);
356     assert(*ie[4] == 4);
357 
358     std::unique_ptr<int> ig[6];
359     const int sg = static_cast<int>(sizeof(ig)/sizeof(ig[0]));
360     for (int i = 0; i < sg; ++i)
361         ig[i].reset(new int(i));
362     r = std::rotate(Iter(ig), Iter(ig), Iter(ig+sg));
363     assert(base(r) == ig+sg);
364     assert(*ig[0] == 0);
365     assert(*ig[1] == 1);
366     assert(*ig[2] == 2);
367     assert(*ig[3] == 3);
368     assert(*ig[4] == 4);
369     assert(*ig[5] == 5);
370     r = std::rotate(Iter(ig), Iter(ig+1), Iter(ig+sg));
371     assert(base(r) == ig+5);
372     assert(*ig[0] == 1);
373     assert(*ig[1] == 2);
374     assert(*ig[2] == 3);
375     assert(*ig[3] == 4);
376     assert(*ig[4] == 5);
377     assert(*ig[5] == 0);
378     r = std::rotate(Iter(ig), Iter(ig+2), Iter(ig+sg));
379     assert(base(r) == ig+4);
380     assert(*ig[0] == 3);
381     assert(*ig[1] == 4);
382     assert(*ig[2] == 5);
383     assert(*ig[3] == 0);
384     assert(*ig[4] == 1);
385     assert(*ig[5] == 2);
386     r = std::rotate(Iter(ig), Iter(ig+3), Iter(ig+sg));
387     assert(base(r) == ig+3);
388     assert(*ig[0] == 0);
389     assert(*ig[1] == 1);
390     assert(*ig[2] == 2);
391     assert(*ig[3] == 3);
392     assert(*ig[4] == 4);
393     assert(*ig[5] == 5);
394     r = std::rotate(Iter(ig), Iter(ig+4), Iter(ig+sg));
395     assert(base(r) == ig+2);
396     assert(*ig[0] == 4);
397     assert(*ig[1] == 5);
398     assert(*ig[2] == 0);
399     assert(*ig[3] == 1);
400     assert(*ig[4] == 2);
401     assert(*ig[5] == 3);
402     r = std::rotate(Iter(ig), Iter(ig+5), Iter(ig+sg));
403     assert(base(r) == ig+1);
404     assert(*ig[0] == 3);
405     assert(*ig[1] == 4);
406     assert(*ig[2] == 5);
407     assert(*ig[3] == 0);
408     assert(*ig[4] == 1);
409     assert(*ig[5] == 2);
410     r = std::rotate(Iter(ig), Iter(ig+sg), Iter(ig+sg));
411     assert(base(r) == ig);
412     assert(*ig[0] == 3);
413     assert(*ig[1] == 4);
414     assert(*ig[2] == 5);
415     assert(*ig[3] == 0);
416     assert(*ig[4] == 1);
417     assert(*ig[5] == 2);
418 }
419 
420 #endif  // TEST_STD_VER >= 11
421 
422 int main(int, char**)
423 {
424     test<forward_iterator<int*> >();
425     test<bidirectional_iterator<int*> >();
426     test<random_access_iterator<int*> >();
427     test<int*>();
428 
429 #if TEST_STD_VER >= 11
430 
431     test1<forward_iterator<std::unique_ptr<int>*> >();
432     test1<bidirectional_iterator<std::unique_ptr<int>*> >();
433     test1<random_access_iterator<std::unique_ptr<int>*> >();
434     test1<std::unique_ptr<int>*>();
435 
436 #endif
437 
438   return 0;
439 }
440