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 multimap
15
16 // multimap(multimap&& 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::multimap<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::multimap<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::multimap<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::multimap<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 == 2*num);
173
174 M m2(m1);
175 assert(m2 == m1);
176 assert(Counter_base::gConstructed == 3*num);
177
178 M m3(std::move(m1), A());
179 assert(m3 == m2);
180 assert(m1.empty());
181 assert(Counter_base::gConstructed == 3*num);
182
183 {
184 M m4(std::move(m2), A(5));
185 assert(Counter_base::gConstructed == 3*num);
186 assert(m4 == m3);
187 assert(m2.empty());
188 }
189 assert(Counter_base::gConstructed == 2*num);
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::multimap<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::multimap<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