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 // <map>
11 
12 // class multimap
13 
14 // template <class Key, class T, class Compare, class Allocator>
15 //   void
16 //   swap(multimap<Key, T, Compare, Allocator>& x, multimap<Key, T, Compare, Allocator>& y);
17 
18 #include <map>
19 #include <cassert>
20 #include "test_allocator.h"
21 #include "../../../test_compare.h"
22 #include "min_allocator.h"
23 
main()24 int main()
25 {
26     typedef std::pair<const int, double> V;
27     {
28     typedef std::multimap<int, double> M;
29     {
30         V ar1[] =
31         {
32         };
33         V ar2[] =
34         {
35         };
36         M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
37         M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
38         M m1_save = m1;
39         M m2_save = m2;
40         swap(m1, m2);
41         assert(m1 == m2_save);
42         assert(m2 == m1_save);
43     }
44     {
45         V ar1[] =
46         {
47         };
48         V ar2[] =
49         {
50             V(5, 5),
51             V(6, 6),
52             V(7, 7),
53             V(8, 8),
54             V(9, 9),
55             V(10, 10),
56             V(11, 11),
57             V(12, 12)
58         };
59         M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
60         M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
61         M m1_save = m1;
62         M m2_save = m2;
63         swap(m1, m2);
64         assert(m1 == m2_save);
65         assert(m2 == m1_save);
66     }
67     {
68         V ar1[] =
69         {
70             V(1, 1),
71             V(2, 2),
72             V(3, 3),
73             V(4, 4)
74         };
75         V ar2[] =
76         {
77         };
78         M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
79         M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
80         M m1_save = m1;
81         M m2_save = m2;
82         swap(m1, m2);
83         assert(m1 == m2_save);
84         assert(m2 == m1_save);
85     }
86     {
87         V ar1[] =
88         {
89             V(1, 1),
90             V(2, 2),
91             V(3, 3),
92             V(4, 4)
93         };
94         V ar2[] =
95         {
96             V(5, 5),
97             V(6, 6),
98             V(7, 7),
99             V(8, 8),
100             V(9, 9),
101             V(10, 10),
102             V(11, 11),
103             V(12, 12)
104         };
105         M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
106         M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
107         M m1_save = m1;
108         M m2_save = m2;
109         swap(m1, m2);
110         assert(m1 == m2_save);
111         assert(m2 == m1_save);
112     }
113     {
114         typedef test_allocator<V> A;
115         typedef test_compare<std::less<int> > C;
116         typedef std::multimap<int, double, C, A> M;
117         V ar1[] =
118         {
119             V(1, 1),
120             V(2, 2),
121             V(3, 3),
122             V(4, 4)
123         };
124         V ar2[] =
125         {
126             V(5, 5),
127             V(6, 6),
128             V(7, 7),
129             V(8, 8),
130             V(9, 9),
131             V(10, 10),
132             V(11, 11),
133             V(12, 12)
134         };
135         M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]), C(1), A(1));
136         M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]), C(2), A(2));
137         M m1_save = m1;
138         M m2_save = m2;
139         swap(m1, m2);
140         assert(m1 == m2_save);
141         assert(m2 == m1_save);
142         assert(m1.key_comp() == C(2));
143         assert(m1.get_allocator() == A(1));
144         assert(m2.key_comp() == C(1));
145         assert(m2.get_allocator() == A(2));
146     }
147     {
148         typedef other_allocator<V> A;
149         typedef test_compare<std::less<int> > C;
150         typedef std::multimap<int, double, C, A> M;
151         V ar1[] =
152         {
153             V(1, 1),
154             V(2, 2),
155             V(3, 3),
156             V(4, 4)
157         };
158         V ar2[] =
159         {
160             V(5, 5),
161             V(6, 6),
162             V(7, 7),
163             V(8, 8),
164             V(9, 9),
165             V(10, 10),
166             V(11, 11),
167             V(12, 12)
168         };
169         M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]), C(1), A(1));
170         M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]), C(2), A(2));
171         M m1_save = m1;
172         M m2_save = m2;
173         swap(m1, m2);
174         assert(m1 == m2_save);
175         assert(m2 == m1_save);
176         assert(m1.key_comp() == C(2));
177         assert(m1.get_allocator() == A(2));
178         assert(m2.key_comp() == C(1));
179         assert(m2.get_allocator() == A(1));
180     }
181     }
182 #if __cplusplus >= 201103L
183     {
184     typedef std::multimap<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
185     {
186         V ar1[] =
187         {
188         };
189         V ar2[] =
190         {
191         };
192         M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
193         M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
194         M m1_save = m1;
195         M m2_save = m2;
196         swap(m1, m2);
197         assert(m1 == m2_save);
198         assert(m2 == m1_save);
199     }
200     {
201         V ar1[] =
202         {
203         };
204         V ar2[] =
205         {
206             V(5, 5),
207             V(6, 6),
208             V(7, 7),
209             V(8, 8),
210             V(9, 9),
211             V(10, 10),
212             V(11, 11),
213             V(12, 12)
214         };
215         M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
216         M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
217         M m1_save = m1;
218         M m2_save = m2;
219         swap(m1, m2);
220         assert(m1 == m2_save);
221         assert(m2 == m1_save);
222     }
223     {
224         V ar1[] =
225         {
226             V(1, 1),
227             V(2, 2),
228             V(3, 3),
229             V(4, 4)
230         };
231         V ar2[] =
232         {
233         };
234         M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
235         M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
236         M m1_save = m1;
237         M m2_save = m2;
238         swap(m1, m2);
239         assert(m1 == m2_save);
240         assert(m2 == m1_save);
241     }
242     {
243         V ar1[] =
244         {
245             V(1, 1),
246             V(2, 2),
247             V(3, 3),
248             V(4, 4)
249         };
250         V ar2[] =
251         {
252             V(5, 5),
253             V(6, 6),
254             V(7, 7),
255             V(8, 8),
256             V(9, 9),
257             V(10, 10),
258             V(11, 11),
259             V(12, 12)
260         };
261         M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]));
262         M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]));
263         M m1_save = m1;
264         M m2_save = m2;
265         swap(m1, m2);
266         assert(m1 == m2_save);
267         assert(m2 == m1_save);
268     }
269     {
270         typedef min_allocator<V> A;
271         typedef test_compare<std::less<int> > C;
272         typedef std::multimap<int, double, C, A> M;
273         V ar1[] =
274         {
275             V(1, 1),
276             V(2, 2),
277             V(3, 3),
278             V(4, 4)
279         };
280         V ar2[] =
281         {
282             V(5, 5),
283             V(6, 6),
284             V(7, 7),
285             V(8, 8),
286             V(9, 9),
287             V(10, 10),
288             V(11, 11),
289             V(12, 12)
290         };
291         M m1(ar1, ar1+sizeof(ar1)/sizeof(ar1[0]), C(1), A());
292         M m2(ar2, ar2+sizeof(ar2)/sizeof(ar2[0]), C(2), A());
293         M m1_save = m1;
294         M m2_save = m2;
295         swap(m1, m2);
296         assert(m1 == m2_save);
297         assert(m2 == m1_save);
298         assert(m1.key_comp() == C(2));
299         assert(m1.get_allocator() == A());
300         assert(m2.key_comp() == C(1));
301         assert(m2.get_allocator() == A());
302     }
303     }
304 #endif
305 }
306