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 map
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::map<int, MoveOnly> M;
29         typedef std::pair<int, MoveOnly> P;
30         typedef M::iterator R;
31         M m;
32         R r = m.insert(m.end(), 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.end(), 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.end(), 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.end(), P(3, 3));
51         assert(r == prev(m.end()));
52         assert(m.size() == 3);
53         assert(r->first == 3);
54         assert(r->second == 3);
55     }
56 #if TEST_STD_VER >= 11
57     {
58         typedef std::map<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.end(), 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.end(), 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.end(), 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.end(), P(3, 3));
81         assert(r == prev(m.end()));
82         assert(m.size() == 3);
83         assert(r->first == 3);
84         assert(r->second == 3);
85     }
86 #endif
87 #if TEST_STD_VER > 14
88     {
89         typedef std::map<int, MoveOnly> M;
90         typedef M::iterator R;
91         M m;
92         R r = m.insert(m.end(), {2, MoveOnly(2)});
93         assert(r == m.begin());
94         assert(m.size() == 1);
95         assert(r->first == 2);
96         assert(r->second == 2);
97 
98         r = m.insert(m.end(), {1, MoveOnly(1)});
99         assert(r == m.begin());
100         assert(m.size() == 2);
101         assert(r->first == 1);
102         assert(r->second == 1);
103 
104         r = m.insert(m.end(), {3, MoveOnly(3)});
105         assert(r == prev(m.end()));
106         assert(m.size() == 3);
107         assert(r->first == 3);
108         assert(r->second == 3);
109 
110         r = m.insert(m.end(), {3, MoveOnly(3)});
111         assert(r == prev(m.end()));
112         assert(m.size() == 3);
113         assert(r->first == 3);
114         assert(r->second == 3);
115     }
116 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
117 #endif
118 }
119