1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // UNSUPPORTED: c++98, c++03
10 
11 // <map>
12 
13 // class map
14 
15 // template <class... Args>
16 //   pair<iterator, bool> emplace(Args&&... args);
17 
18 #include <map>
19 #include <cassert>
20 #include <tuple>
21 
22 #include "../../../Emplaceable.h"
23 #include "DefaultOnly.h"
24 #include "min_allocator.h"
25 
26 int main(int, char**)
27 {
28     {
29         typedef std::map<int, DefaultOnly> M;
30         typedef std::pair<M::iterator, bool> R;
31         M m;
32         assert(DefaultOnly::count == 0);
33         R r = m.emplace();
34         assert(r.second);
35         assert(r.first == m.begin());
36         assert(m.size() == 1);
37         assert(m.begin()->first == 0);
38         assert(m.begin()->second == DefaultOnly());
39         assert(DefaultOnly::count == 1);
40         r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
41                                                 std::forward_as_tuple());
42         assert(r.second);
43         assert(r.first == next(m.begin()));
44         assert(m.size() == 2);
45         assert(next(m.begin())->first == 1);
46         assert(next(m.begin())->second == DefaultOnly());
47         assert(DefaultOnly::count == 2);
48         r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
49                                                 std::forward_as_tuple());
50         assert(!r.second);
51         assert(r.first == next(m.begin()));
52         assert(m.size() == 2);
53         assert(next(m.begin())->first == 1);
54         assert(next(m.begin())->second == DefaultOnly());
55         assert(DefaultOnly::count == 2);
56     }
57     assert(DefaultOnly::count == 0);
58     {
59         typedef std::map<int, Emplaceable> M;
60         typedef std::pair<M::iterator, bool> R;
61         M m;
62         R r = m.emplace(std::piecewise_construct, std::forward_as_tuple(2),
63                                                   std::forward_as_tuple());
64         assert(r.second);
65         assert(r.first == m.begin());
66         assert(m.size() == 1);
67         assert(m.begin()->first == 2);
68         assert(m.begin()->second == Emplaceable());
69         r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
70                                                 std::forward_as_tuple(2, 3.5));
71         assert(r.second);
72         assert(r.first == m.begin());
73         assert(m.size() == 2);
74         assert(m.begin()->first == 1);
75         assert(m.begin()->second == Emplaceable(2, 3.5));
76         r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
77                                                 std::forward_as_tuple(2, 3.5));
78         assert(!r.second);
79         assert(r.first == m.begin());
80         assert(m.size() == 2);
81         assert(m.begin()->first == 1);
82         assert(m.begin()->second == Emplaceable(2, 3.5));
83     }
84     {
85         typedef std::map<int, double> M;
86         typedef std::pair<M::iterator, bool> R;
87         M m;
88         R r = m.emplace(M::value_type(2, 3.5));
89         assert(r.second);
90         assert(r.first == m.begin());
91         assert(m.size() == 1);
92         assert(m.begin()->first == 2);
93         assert(m.begin()->second == 3.5);
94     }
95     {
96         typedef std::map<int, DefaultOnly, std::less<int>, min_allocator<std::pair<const int, DefaultOnly>>> M;
97         typedef std::pair<M::iterator, bool> R;
98         M m;
99         assert(DefaultOnly::count == 0);
100         R r = m.emplace();
101         assert(r.second);
102         assert(r.first == m.begin());
103         assert(m.size() == 1);
104         assert(m.begin()->first == 0);
105         assert(m.begin()->second == DefaultOnly());
106         assert(DefaultOnly::count == 1);
107         r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
108                                                 std::forward_as_tuple());
109         assert(r.second);
110         assert(r.first == next(m.begin()));
111         assert(m.size() == 2);
112         assert(next(m.begin())->first == 1);
113         assert(next(m.begin())->second == DefaultOnly());
114         assert(DefaultOnly::count == 2);
115         r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
116                                                 std::forward_as_tuple());
117         assert(!r.second);
118         assert(r.first == next(m.begin()));
119         assert(m.size() == 2);
120         assert(next(m.begin())->first == 1);
121         assert(next(m.begin())->second == DefaultOnly());
122         assert(DefaultOnly::count == 2);
123     }
124     assert(DefaultOnly::count == 0);
125     {
126         typedef std::map<int, Emplaceable, std::less<int>, min_allocator<std::pair<const int, Emplaceable>>> M;
127         typedef std::pair<M::iterator, bool> R;
128         M m;
129         R r = m.emplace(std::piecewise_construct, std::forward_as_tuple(2),
130                                                   std::forward_as_tuple());
131         assert(r.second);
132         assert(r.first == m.begin());
133         assert(m.size() == 1);
134         assert(m.begin()->first == 2);
135         assert(m.begin()->second == Emplaceable());
136         r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
137                                                 std::forward_as_tuple(2, 3.5));
138         assert(r.second);
139         assert(r.first == m.begin());
140         assert(m.size() == 2);
141         assert(m.begin()->first == 1);
142         assert(m.begin()->second == Emplaceable(2, 3.5));
143         r = m.emplace(std::piecewise_construct, std::forward_as_tuple(1),
144                                                 std::forward_as_tuple(2, 3.5));
145         assert(!r.second);
146         assert(r.first == m.begin());
147         assert(m.size() == 2);
148         assert(m.begin()->first == 1);
149         assert(m.begin()->second == Emplaceable(2, 3.5));
150     }
151     {
152         typedef std::map<int, double, std::less<int>, min_allocator<std::pair<const int, double>>> M;
153         typedef std::pair<M::iterator, bool> R;
154         M m;
155         R r = m.emplace(M::value_type(2, 3.5));
156         assert(r.second);
157         assert(r.first == m.begin());
158         assert(m.size() == 1);
159         assert(m.begin()->first == 2);
160         assert(m.begin()->second == 3.5);
161     }
162 
163   return 0;
164 }
165