• 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 // UNSUPPORTED: c++98, c++03
11 
12 // <map>
13 
14 // class map
15 
16 // map(map&& m, const allocator_type& a);
17 
18 #include <map>
19 #include <cassert>
20 
21 #include "MoveOnly.h"
22 #include "../../../test_compare.h"
23 #include "test_allocator.h"
24 #include "min_allocator.h"
25 #include "Counter.h"
26 
main()27 int main()
28 {
29     {
30         typedef std::pair<MoveOnly, MoveOnly> V;
31         typedef std::pair<const MoveOnly, MoveOnly> VC;
32         typedef test_compare<std::less<MoveOnly> > C;
33         typedef test_allocator<VC> A;
34         typedef std::map<MoveOnly, MoveOnly, C, A> M;
35         typedef std::move_iterator<V*> I;
36         V a1[] =
37         {
38             V(1, 1),
39             V(1, 2),
40             V(1, 3),
41             V(2, 1),
42             V(2, 2),
43             V(2, 3),
44             V(3, 1),
45             V(3, 2),
46             V(3, 3)
47         };
48         M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A(7));
49         V a2[] =
50         {
51             V(1, 1),
52             V(1, 2),
53             V(1, 3),
54             V(2, 1),
55             V(2, 2),
56             V(2, 3),
57             V(3, 1),
58             V(3, 2),
59             V(3, 3)
60         };
61         M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A(7));
62         M m3(std::move(m1), A(7));
63         assert(m3 == m2);
64         assert(m3.get_allocator() == A(7));
65         assert(m3.key_comp() == C(5));
66         assert(m1.empty());
67     }
68     {
69         typedef std::pair<MoveOnly, MoveOnly> V;
70         typedef std::pair<const MoveOnly, MoveOnly> VC;
71         typedef test_compare<std::less<MoveOnly> > C;
72         typedef test_allocator<VC> A;
73         typedef std::map<MoveOnly, MoveOnly, C, A> M;
74         typedef std::move_iterator<V*> I;
75         V a1[] =
76         {
77             V(1, 1),
78             V(1, 2),
79             V(1, 3),
80             V(2, 1),
81             V(2, 2),
82             V(2, 3),
83             V(3, 1),
84             V(3, 2),
85             V(3, 3)
86         };
87         M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A(7));
88         V a2[] =
89         {
90             V(1, 1),
91             V(1, 2),
92             V(1, 3),
93             V(2, 1),
94             V(2, 2),
95             V(2, 3),
96             V(3, 1),
97             V(3, 2),
98             V(3, 3)
99         };
100         M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A(7));
101         M m3(std::move(m1), A(5));
102         assert(m3 == m2);
103         assert(m3.get_allocator() == A(5));
104         assert(m3.key_comp() == C(5));
105         assert(m1.empty());
106     }
107     {
108         typedef std::pair<MoveOnly, MoveOnly> V;
109         typedef std::pair<const MoveOnly, MoveOnly> VC;
110         typedef test_compare<std::less<MoveOnly> > C;
111         typedef other_allocator<VC> A;
112         typedef std::map<MoveOnly, MoveOnly, C, A> M;
113         typedef std::move_iterator<V*> I;
114         V a1[] =
115         {
116             V(1, 1),
117             V(1, 2),
118             V(1, 3),
119             V(2, 1),
120             V(2, 2),
121             V(2, 3),
122             V(3, 1),
123             V(3, 2),
124             V(3, 3)
125         };
126         M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A(7));
127         V a2[] =
128         {
129             V(1, 1),
130             V(1, 2),
131             V(1, 3),
132             V(2, 1),
133             V(2, 2),
134             V(2, 3),
135             V(3, 1),
136             V(3, 2),
137             V(3, 3)
138         };
139         M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A(7));
140         M m3(std::move(m1), A(5));
141         assert(m3 == m2);
142         assert(m3.get_allocator() == A(5));
143         assert(m3.key_comp() == C(5));
144         assert(m1.empty());
145     }
146     {
147         typedef Counter<int> T;
148         typedef std::pair<int, T> V;
149         typedef std::pair<const int, T> VC;
150         typedef test_allocator<VC> A;
151         typedef std::less<int> C;
152         typedef std::map<const int, T, C, A> M;
153         typedef V* I;
154         Counter_base::gConstructed = 0;
155         {
156             V a1[] =
157             {
158                 V(1, 1),
159                 V(1, 2),
160                 V(1, 3),
161                 V(2, 1),
162                 V(2, 2),
163                 V(2, 3),
164                 V(3, 1),
165                 V(3, 2),
166                 V(3, 3)
167             };
168             const size_t num = sizeof(a1)/sizeof(a1[0]);
169             assert(Counter_base::gConstructed == num);
170 
171             M m1(I(a1), I(a1+num), C(), A());
172             assert(Counter_base::gConstructed == num+3);
173 
174             M m2(m1);
175             assert(m2 == m1);
176             assert(Counter_base::gConstructed == num+6);
177 
178             M m3(std::move(m1), A());
179             assert(m3 == m2);
180             assert(m1.empty());
181             assert(Counter_base::gConstructed == num+6);
182 
183             {
184             M m4(std::move(m2), A(5));
185             assert(Counter_base::gConstructed == num+6);
186             assert(m4 == m3);
187             assert(m2.empty());
188             }
189             assert(Counter_base::gConstructed == num+3);
190         }
191         assert(Counter_base::gConstructed == 0);
192     }
193     {
194         typedef std::pair<MoveOnly, MoveOnly> V;
195         typedef std::pair<const MoveOnly, MoveOnly> VC;
196         typedef test_compare<std::less<MoveOnly> > C;
197         typedef min_allocator<VC> A;
198         typedef std::map<MoveOnly, MoveOnly, C, A> M;
199         typedef std::move_iterator<V*> I;
200         V a1[] =
201         {
202             V(1, 1),
203             V(1, 2),
204             V(1, 3),
205             V(2, 1),
206             V(2, 2),
207             V(2, 3),
208             V(3, 1),
209             V(3, 2),
210             V(3, 3)
211         };
212         M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A());
213         V a2[] =
214         {
215             V(1, 1),
216             V(1, 2),
217             V(1, 3),
218             V(2, 1),
219             V(2, 2),
220             V(2, 3),
221             V(3, 1),
222             V(3, 2),
223             V(3, 3)
224         };
225         M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A());
226         M m3(std::move(m1), A());
227         assert(m3 == m2);
228         assert(m3.get_allocator() == A());
229         assert(m3.key_comp() == C(5));
230         assert(m1.empty());
231     }
232     {
233         typedef std::pair<MoveOnly, MoveOnly> V;
234         typedef std::pair<const MoveOnly, MoveOnly> VC;
235         typedef test_compare<std::less<MoveOnly> > C;
236         typedef explicit_allocator<VC> A;
237         typedef std::map<MoveOnly, MoveOnly, C, A> M;
238         typedef std::move_iterator<V*> I;
239         V a1[] =
240         {
241             V(1, 1),
242             V(1, 2),
243             V(1, 3),
244             V(2, 1),
245             V(2, 2),
246             V(2, 3),
247             V(3, 1),
248             V(3, 2),
249             V(3, 3)
250         };
251         M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A{});
252         V a2[] =
253         {
254             V(1, 1),
255             V(1, 2),
256             V(1, 3),
257             V(2, 1),
258             V(2, 2),
259             V(2, 3),
260             V(3, 1),
261             V(3, 2),
262             V(3, 3)
263         };
264         M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A{});
265         M m3(std::move(m1), A{});
266         assert(m3 == m2);
267         assert(m3.get_allocator() == A{});
268         assert(m3.key_comp() == C(5));
269         assert(m1.empty());
270     }
271 }
272