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