]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/23_containers/unordered_map/modifiers/try_emplace.cc
f123850ecf1fc5afb1ce50cb1774a843173229e0
1 // { dg-options "-std=gnu++17" }
3 // Copyright (C) 2015-2017 Free Software Foundation, Inc.
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with this library; see the file COPYING3. If not see
18 // <http://www.gnu.org/licenses/>.
21 #include <unordered_map>
23 #include <testsuite_hooks.h>
27 bool moved_from_ctor
= false;
28 bool moved_from_assign
= false;
30 Val(int val
= 0) : val(val
) {}
31 Val(const Val
& other
) : val(other
.val
)
34 Val(Val
&& other
) : val(other
.val
)
36 other
.moved_from_ctor
= true;
38 Val
& operator=(Val
&& other
)
41 other
.moved_from_assign
= true;
45 bool operator==(const Val
& a
, const Val
& b
)
47 return a
.val
== b
.val
;
52 template <> struct hash
<Val
>
54 using result_type
= size_t;
55 using argument_type
= Val
;
58 operator()(const Val
& t
) const
61 return hash
<int>{}(t
.val
);
68 typedef std::unordered_map
<int, Val
> Map
;
70 auto res1
= m
.try_emplace(0, Val(5));
72 VERIFY(res1
.first
!= m
.end());
73 VERIFY(m
[0].val
== 5);
75 VERIFY(m
.size() == 1);
76 auto res2
= m
.try_emplace(0, std::move(v1
));
78 VERIFY(res2
.first
== res1
.first
);
79 VERIFY(m
[0].val
== 5);
80 VERIFY(!v1
.moved_from_ctor
);
81 VERIFY(!v1
.moved_from_assign
);
82 VERIFY(m
.size() == 1);
83 auto res3
= m
.try_emplace(1, std::move(v1
));
84 VERIFY(res3
.first
!= res1
.first
&& res3
.first
!= m
.end());
86 VERIFY(m
[0].val
== 5);
87 VERIFY(m
[1].val
== 6);
88 VERIFY(v1
.moved_from_ctor
);
89 VERIFY(!v1
.moved_from_assign
);
90 VERIFY(m
.size() == 2);
95 typedef std::unordered_map
<int, Val
> Map
;
97 auto res1
= m
.try_emplace(m
.begin(), 0, Val(5));
98 VERIFY(res1
!= m
.end());
99 VERIFY(m
[0].val
== 5);
101 VERIFY(m
.size() == 1);
102 auto res2
= m
.try_emplace(m
.begin(), 0, std::move(v1
));
103 VERIFY(res2
== res1
);
104 VERIFY(m
[0].val
== 5);
105 VERIFY(!v1
.moved_from_ctor
);
106 VERIFY(!v1
.moved_from_assign
);
107 VERIFY(m
.size() == 1);
108 auto res3
= m
.try_emplace(m
.begin(), 1, std::move(v1
));
109 VERIFY(res3
!= res1
&& res3
!= m
.end());
110 VERIFY(m
[0].val
== 5);
111 VERIFY(m
[1].val
== 6);
112 VERIFY(v1
.moved_from_ctor
);
113 VERIFY(!v1
.moved_from_assign
);
114 VERIFY(m
.size() == 2);
119 typedef std::unordered_map
<Val
, Val
> Map
;
121 auto res1
= m
.try_emplace(0, Val(5));
123 VERIFY(res1
.first
!= m
.end());
124 VERIFY(m
[0].val
== 5);
127 VERIFY(m
.size() == 1);
128 auto res2
= m
.try_emplace(std::move(k1
), std::move(v1
));
129 VERIFY(!res2
.second
);
130 VERIFY(res2
.first
== res1
.first
);
131 VERIFY(m
[0].val
== 5);
132 VERIFY(!k1
.moved_from_ctor
);
133 VERIFY(!k1
.moved_from_assign
);
134 VERIFY(!v1
.moved_from_ctor
);
135 VERIFY(!v1
.moved_from_assign
);
136 VERIFY(m
.size() == 1);
138 auto res3
= m
.try_emplace(std::move(k2
), std::move(v1
));
139 VERIFY(res3
.first
!= res1
.first
&& res3
.first
!= m
.end());
141 VERIFY(m
[0].val
== 5);
142 VERIFY(m
[1].val
== 6);
143 VERIFY(k2
.moved_from_ctor
);
144 VERIFY(!k2
.moved_from_assign
);
145 VERIFY(v1
.moved_from_ctor
);
146 VERIFY(!v1
.moved_from_assign
);
147 VERIFY(m
.size() == 2);
152 typedef std::unordered_map
<Val
, Val
> Map
;
154 auto res1
= m
.try_emplace(m
.begin(), 0, Val(5));
155 VERIFY(res1
!= m
.end());
156 VERIFY(m
[0].val
== 5);
159 VERIFY(m
.size() == 1);
160 auto res2
= m
.try_emplace(m
.begin(), std::move(k1
), std::move(v1
));
161 VERIFY(res2
== res1
);
162 VERIFY(m
[0].val
== 5);
163 VERIFY(!k1
.moved_from_ctor
);
164 VERIFY(!k1
.moved_from_assign
);
165 VERIFY(!v1
.moved_from_ctor
);
166 VERIFY(!v1
.moved_from_assign
);
167 VERIFY(m
.size() == 1);
169 auto res3
= m
.try_emplace(m
.begin(), std::move(k2
), std::move(v1
));
170 VERIFY(res3
!= res1
&& res3
!= m
.end());
171 VERIFY(m
[0].val
== 5);
172 VERIFY(m
[1].val
== 6);
173 VERIFY(k2
.moved_from_ctor
);
174 VERIFY(!k2
.moved_from_assign
);
175 VERIFY(v1
.moved_from_ctor
);
176 VERIFY(!v1
.moved_from_assign
);
177 VERIFY(m
.size() == 2);
182 typedef std::unordered_map
<int, Val
> Map
;
184 auto res1
= m
.try_emplace(0, Val(5));
186 VERIFY(res1
.first
!= m
.end());
187 VERIFY(m
[0].val
== 5);
189 VERIFY(m
.size() == 1);
190 auto res2
= m
.try_emplace(0, std::move(v1
));
191 VERIFY(!res2
.second
);
192 VERIFY(res2
.first
== res1
.first
);
193 VERIFY(m
[0].val
== 5);
194 VERIFY(!v1
.moved_from_ctor
);
195 VERIFY(!v1
.moved_from_assign
);
196 VERIFY(m
.size() == 1);
197 auto res3
= m
.try_emplace(1, std::move(v1
));
198 VERIFY(res3
.first
!= res1
.first
&& res3
.first
!= m
.end());
200 VERIFY(m
[0].val
== 5);
201 VERIFY(m
[1].val
== 6);
202 VERIFY(v1
.moved_from_ctor
);
203 VERIFY(!v1
.moved_from_assign
);
204 VERIFY(m
.size() == 2);
209 typedef std::unordered_map
<int, Val
> Map
;
211 auto res1
= m
.try_emplace(m
.begin(), 0, Val(5));
212 VERIFY(res1
!= m
.end());
213 VERIFY(m
[0].val
== 5);
215 VERIFY(m
.size() == 1);
216 auto res2
= m
.try_emplace(m
.begin(), 0, std::move(v1
));
217 VERIFY(res2
== res1
);
218 VERIFY(m
[0].val
== 5);
219 VERIFY(!v1
.moved_from_ctor
);
220 VERIFY(!v1
.moved_from_assign
);
221 VERIFY(m
.size() == 1);
222 auto res3
= m
.try_emplace(m
.begin(), 1, std::move(v1
));
223 VERIFY(res3
!= res1
&& res3
!= m
.end());
224 VERIFY(m
[0].val
== 5);
225 VERIFY(m
[1].val
== 6);
226 VERIFY(v1
.moved_from_ctor
);
227 VERIFY(!v1
.moved_from_assign
);
228 VERIFY(m
.size() == 2);
233 typedef std::unordered_map
<Val
, Val
> Map
;
235 auto res1
= m
.try_emplace(0, Val(5));
237 VERIFY(res1
.first
!= m
.end());
238 VERIFY(m
[0].val
== 5);
241 VERIFY(m
.size() == 1);
242 auto res2
= m
.try_emplace(k1
, v1
);
243 VERIFY(!res2
.second
);
244 VERIFY(res2
.first
== res1
.first
);
245 VERIFY(m
[0].val
== 5);
246 VERIFY(!k1
.moved_from_ctor
);
247 VERIFY(!k1
.moved_from_assign
);
248 VERIFY(!v1
.moved_from_ctor
);
249 VERIFY(!v1
.moved_from_assign
);
250 VERIFY(m
.size() == 1);
252 auto res3
= m
.try_emplace(k2
, v1
);
253 VERIFY(res3
.first
!= res1
.first
&& res3
.first
!= m
.end());
255 VERIFY(m
[0].val
== 5);
256 VERIFY(m
[1].val
== 6);
257 VERIFY(!k2
.moved_from_ctor
);
258 VERIFY(!k2
.moved_from_assign
);
259 VERIFY(!v1
.moved_from_ctor
);
260 VERIFY(!v1
.moved_from_assign
);
261 VERIFY(m
.size() == 2);
266 typedef std::unordered_map
<Val
, Val
> Map
;
268 auto res1
= m
.try_emplace(m
.begin(), 0, Val(5));
269 VERIFY(res1
!= m
.end());
270 VERIFY(m
[0].val
== 5);
273 VERIFY(m
.size() == 1);
274 auto res2
= m
.try_emplace(m
.begin(), k1
, v1
);
275 VERIFY(res2
== res1
);
276 VERIFY(m
[0].val
== 5);
277 VERIFY(!k1
.moved_from_ctor
);
278 VERIFY(!k1
.moved_from_assign
);
279 VERIFY(!v1
.moved_from_ctor
);
280 VERIFY(!v1
.moved_from_assign
);
281 VERIFY(m
.size() == 1);
283 auto res3
= m
.try_emplace(m
.begin(), k2
, v1
);
284 VERIFY(res3
!= res1
&& res3
!= m
.end());
285 VERIFY(m
[0].val
== 5);
286 VERIFY(m
[1].val
== 6);
287 VERIFY(!k2
.moved_from_ctor
);
288 VERIFY(!k2
.moved_from_assign
);
289 VERIFY(!v1
.moved_from_ctor
);
290 VERIFY(!v1
.moved_from_assign
);
291 VERIFY(m
.size() == 2);