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 P>
15 //     iterator insert(const_iterator position, P&& p);
16 
17 #include <map>
18 #include <cassert>
19 
20 #include "MoveOnly.h"
21 #include "min_allocator.h"
22 #include "test_macros.h"
23 
24 int main()
25 {
26 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
27     {
28         typedef std::multimap<int, MoveOnly> M;
29         typedef std::pair<int, MoveOnly> P;
30         typedef M::iterator R;
31         M m;
32         R r = m.insert(m.cend(), P(2, 2));
33         assert(r == m.begin());
34         assert(m.size() == 1);
35         assert(r->first == 2);
36         assert(r->second == 2);
37 
38         r = m.insert(m.cend(), P(1, 1));
39         assert(r == m.begin());
40         assert(m.size() == 2);
41         assert(r->first == 1);
42         assert(r->second == 1);
43 
44         r = m.insert(m.cend(), P(3, 3));
45         assert(r == prev(m.end()));
46         assert(m.size() == 3);
47         assert(r->first == 3);
48         assert(r->second == 3);
49 
50         r = m.insert(m.cend(), P(3, 2));
51         assert(r == prev(m.end()));
52         assert(m.size() == 4);
53         assert(r->first == 3);
54         assert(r->second == 2);
55     }
56 #if TEST_STD_VER >= 11
57     {
58         typedef std::multimap<int, MoveOnly, std::less<int>, min_allocator<std::pair<const int, MoveOnly>>> M;
59         typedef std::pair<int, MoveOnly> P;
60         typedef M::iterator R;
61         M m;
62         R r = m.insert(m.cend(), P(2, 2));
63         assert(r == m.begin());
64         assert(m.size() == 1);
65         assert(r->first == 2);
66         assert(r->second == 2);
67 
68         r = m.insert(m.cend(), P(1, 1));
69         assert(r == m.begin());
70         assert(m.size() == 2);
71         assert(r->first == 1);
72         assert(r->second == 1);
73 
74         r = m.insert(m.cend(), P(3, 3));
75         assert(r == prev(m.end()));
76         assert(m.size() == 3);
77         assert(r->first == 3);
78         assert(r->second == 3);
79 
80         r = m.insert(m.cend(), P(3, 2));
81         assert(r == prev(m.end()));
82         assert(m.size() == 4);
83         assert(r->first == 3);
84         assert(r->second == 2);
85     }
86 #endif
87 #if TEST_STD_VER > 14
88     {
89         typedef std::multimap<int, MoveOnly> M;
90         typedef std::pair<int, MoveOnly> P;
91         typedef M::iterator R;
92         M m;
93         R r = m.insert(m.cend(), {2, MoveOnly(2)});
94         assert(r == m.begin());
95         assert(m.size() == 1);
96         assert(r->first == 2);
97         assert(r->second == 2);
98 
99         r = m.insert(m.cend(), {1, MoveOnly(1)});
100         assert(r == m.begin());
101         assert(m.size() == 2);
102         assert(r->first == 1);
103         assert(r->second == 1);
104 
105         r = m.insert(m.cend(), {3, MoveOnly(3)});
106         assert(r == prev(m.end()));
107         assert(m.size() == 3);
108         assert(r->first == 3);
109         assert(r->second == 3);
110 
111         r = m.insert(m.cend(), {3, MoveOnly(2)});
112         assert(r == prev(m.end()));
113         assert(m.size() == 4);
114         assert(r->first == 3);
115         assert(r->second == 2);
116     }
117 #endif
118 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
119 }
120