• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 Iter1, ForwardIterator Iter2>
13 //   requires HasSwap<Iter1::reference, Iter2::reference>
14 //   Iter2
15 //   swap_ranges(Iter1 first1, Iter1 last1, Iter2 first2);
16 
17 #include <algorithm>
18 #include <cassert>
19 #include <memory>
20 
21 #include "test_macros.h"
22 #include "test_iterators.h"
23 
24 template<class Iter1, class Iter2>
25 void
test()26 test()
27 {
28     int i[3] = {1, 2, 3};
29     int j[3] = {4, 5, 6};
30     Iter2 r = std::swap_ranges(Iter1(i), Iter1(i+3), Iter2(j));
31     assert(base(r) == j+3);
32     assert(i[0] == 4);
33     assert(i[1] == 5);
34     assert(i[2] == 6);
35     assert(j[0] == 1);
36     assert(j[1] == 2);
37     assert(j[2] == 3);
38 }
39 
40 #if TEST_STD_VER >= 11
41 template<class Iter1, class Iter2>
42 void
test1()43 test1()
44 {
45     std::unique_ptr<int> i[3];
46     for (int k = 0; k < 3; ++k)
47         i[k].reset(new int(k+1));
48     std::unique_ptr<int> j[3];
49     for (int k = 0; k < 3; ++k)
50         j[k].reset(new int(k+4));
51     Iter2 r = std::swap_ranges(Iter1(i), Iter1(i+3), Iter2(j));
52     assert(base(r) == j+3);
53     assert(*i[0] == 4);
54     assert(*i[1] == 5);
55     assert(*i[2] == 6);
56     assert(*j[0] == 1);
57     assert(*j[1] == 2);
58     assert(*j[2] == 3);
59 }
60 #endif // TEST_STD_VER >= 11
61 
test2()62 void test2()
63 {
64     {
65     int src[2][2]      = {{0, 1}, {2, 3}};
66     decltype(src) dest = {{9, 8}, {7, 6}};
67 
68     std::swap(src, dest);
69 
70     assert ( src[0][0] == 9 );
71     assert ( src[0][1] == 8 );
72     assert ( src[1][0] == 7 );
73     assert ( src[1][1] == 6 );
74 
75     assert ( dest[0][0] == 0 );
76     assert ( dest[0][1] == 1 );
77     assert ( dest[1][0] == 2 );
78     assert ( dest[1][1] == 3 );
79     }
80 
81     {
82     int src[3][3]      = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
83     decltype(src) dest = {{9, 8, 7}, {6, 5, 4}, {3, 2, 1}};
84 
85     std::swap(src, dest);
86 
87     assert ( src[0][0] == 9 );
88     assert ( src[0][1] == 8 );
89     assert ( src[0][2] == 7 );
90     assert ( src[1][0] == 6 );
91     assert ( src[1][1] == 5 );
92     assert ( src[1][2] == 4 );
93     assert ( src[2][0] == 3 );
94     assert ( src[2][1] == 2 );
95     assert ( src[2][2] == 1 );
96 
97     assert ( dest[0][0] == 0 );
98     assert ( dest[0][1] == 1 );
99     assert ( dest[0][2] == 2 );
100     assert ( dest[1][0] == 3 );
101     assert ( dest[1][1] == 4 );
102     assert ( dest[1][2] == 5 );
103     assert ( dest[2][0] == 6 );
104     assert ( dest[2][1] == 7 );
105     assert ( dest[2][2] == 8 );
106     }
107 }
108 
main()109 int main()
110 {
111     test<forward_iterator<int*>, forward_iterator<int*> >();
112     test<forward_iterator<int*>, bidirectional_iterator<int*> >();
113     test<forward_iterator<int*>, random_access_iterator<int*> >();
114     test<forward_iterator<int*>, int*>();
115 
116     test<bidirectional_iterator<int*>, forward_iterator<int*> >();
117     test<bidirectional_iterator<int*>, bidirectional_iterator<int*> >();
118     test<bidirectional_iterator<int*>, random_access_iterator<int*> >();
119     test<bidirectional_iterator<int*>, int*>();
120 
121     test<random_access_iterator<int*>, forward_iterator<int*> >();
122     test<random_access_iterator<int*>, bidirectional_iterator<int*> >();
123     test<random_access_iterator<int*>, random_access_iterator<int*> >();
124     test<random_access_iterator<int*>, int*>();
125 
126     test<int*, forward_iterator<int*> >();
127     test<int*, bidirectional_iterator<int*> >();
128     test<int*, random_access_iterator<int*> >();
129     test<int*, int*>();
130 
131 #if TEST_STD_VER >= 11
132     test1<forward_iterator<std::unique_ptr<int>*>, forward_iterator<std::unique_ptr<int>*> >();
133     test1<forward_iterator<std::unique_ptr<int>*>, bidirectional_iterator<std::unique_ptr<int>*> >();
134     test1<forward_iterator<std::unique_ptr<int>*>, random_access_iterator<std::unique_ptr<int>*> >();
135     test1<forward_iterator<std::unique_ptr<int>*>, std::unique_ptr<int>*>();
136 
137     test1<bidirectional_iterator<std::unique_ptr<int>*>, forward_iterator<std::unique_ptr<int>*> >();
138     test1<bidirectional_iterator<std::unique_ptr<int>*>, bidirectional_iterator<std::unique_ptr<int>*> >();
139     test1<bidirectional_iterator<std::unique_ptr<int>*>, random_access_iterator<std::unique_ptr<int>*> >();
140     test1<bidirectional_iterator<std::unique_ptr<int>*>, std::unique_ptr<int>*>();
141 
142     test1<random_access_iterator<std::unique_ptr<int>*>, forward_iterator<std::unique_ptr<int>*> >();
143     test1<random_access_iterator<std::unique_ptr<int>*>, bidirectional_iterator<std::unique_ptr<int>*> >();
144     test1<random_access_iterator<std::unique_ptr<int>*>, random_access_iterator<std::unique_ptr<int>*> >();
145     test1<random_access_iterator<std::unique_ptr<int>*>, std::unique_ptr<int>*>();
146 
147     test1<std::unique_ptr<int>*, forward_iterator<std::unique_ptr<int>*> >();
148     test1<std::unique_ptr<int>*, bidirectional_iterator<std::unique_ptr<int>*> >();
149     test1<std::unique_ptr<int>*, random_access_iterator<std::unique_ptr<int>*> >();
150     test1<std::unique_ptr<int>*, std::unique_ptr<int>*>();
151 #endif // TEST_STD_VER >= 11
152 
153     test2();
154 }
155