]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/23_containers/map/modifiers/try_emplace/1.cc
1 // { dg-do run { target c++17 } }
3 // Copyright (C) 2015-2021 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/>.
22 #include <testsuite_hooks.h>
26 bool moved_from_ctor
= false;
27 bool moved_from_assign
= false;
29 Val(int val
= 0) : val(val
) {}
30 Val(const Val
& other
) : val(other
.val
)
33 Val(Val
&& other
) : val(other
.val
)
35 other
.moved_from_ctor
= true;
37 Val
& operator=(Val
&& other
)
40 other
.moved_from_assign
= true;
45 bool operator<(const Val
& a
, const Val
& b
)
52 typedef std::map
<int, Val
> Map
;
54 auto res1
= m
.try_emplace(0, Val(5));
56 VERIFY(res1
.first
!= m
.end());
57 VERIFY(m
[0].val
== 5);
59 VERIFY(m
.size() == 1);
60 auto res2
= m
.try_emplace(0, std::move(v1
));
62 VERIFY(res2
.first
== res1
.first
);
63 VERIFY(m
[0].val
== 5);
64 VERIFY(!v1
.moved_from_ctor
);
65 VERIFY(!v1
.moved_from_assign
);
66 VERIFY(m
.size() == 1);
67 auto res3
= m
.try_emplace(1, std::move(v1
));
68 VERIFY(res3
.first
!= res1
.first
&& res3
.first
!= m
.end());
70 VERIFY(m
[0].val
== 5);
71 VERIFY(m
[1].val
== 6);
72 VERIFY(v1
.moved_from_ctor
);
73 VERIFY(!v1
.moved_from_assign
);
74 VERIFY(m
.size() == 2);
79 typedef std::map
<int, Val
> Map
;
81 auto res1
= m
.try_emplace(m
.begin(), 0, Val(5));
82 VERIFY(res1
!= m
.end());
83 VERIFY(m
[0].val
== 5);
85 VERIFY(m
.size() == 1);
86 auto res2
= m
.try_emplace(m
.begin(), 0, std::move(v1
));
88 VERIFY(m
[0].val
== 5);
89 VERIFY(!v1
.moved_from_ctor
);
90 VERIFY(!v1
.moved_from_assign
);
91 VERIFY(m
.size() == 1);
92 auto res3
= m
.try_emplace(m
.begin(), 1, std::move(v1
));
93 VERIFY(res3
!= res1
&& res3
!= m
.end());
94 VERIFY(m
[0].val
== 5);
95 VERIFY(m
[1].val
== 6);
96 VERIFY(v1
.moved_from_ctor
);
97 VERIFY(!v1
.moved_from_assign
);
98 VERIFY(m
.size() == 2);
103 typedef std::map
<Val
, Val
> Map
;
105 auto res1
= m
.try_emplace(0, Val(5));
107 VERIFY(res1
.first
!= m
.end());
108 VERIFY(m
[0].val
== 5);
111 VERIFY(m
.size() == 1);
112 auto res2
= m
.try_emplace(std::move(k1
), std::move(v1
));
113 VERIFY(!res2
.second
);
114 VERIFY(res2
.first
== res1
.first
);
115 VERIFY(m
[0].val
== 5);
116 VERIFY(!k1
.moved_from_ctor
);
117 VERIFY(!k1
.moved_from_assign
);
118 VERIFY(!v1
.moved_from_ctor
);
119 VERIFY(!v1
.moved_from_assign
);
120 VERIFY(m
.size() == 1);
122 auto res3
= m
.try_emplace(std::move(k2
), std::move(v1
));
123 VERIFY(res3
.first
!= res1
.first
&& res3
.first
!= m
.end());
125 VERIFY(m
[0].val
== 5);
126 VERIFY(m
[1].val
== 6);
127 VERIFY(k2
.moved_from_ctor
);
128 VERIFY(!k2
.moved_from_assign
);
129 VERIFY(v1
.moved_from_ctor
);
130 VERIFY(!v1
.moved_from_assign
);
131 VERIFY(m
.size() == 2);
136 typedef std::map
<Val
, Val
> Map
;
138 auto res1
= m
.try_emplace(m
.begin(), 0, Val(5));
139 VERIFY(res1
!= m
.end());
140 VERIFY(m
[0].val
== 5);
143 VERIFY(m
.size() == 1);
144 auto res2
= m
.try_emplace(m
.begin(), std::move(k1
), std::move(v1
));
145 VERIFY(res2
== res1
);
146 VERIFY(m
[0].val
== 5);
147 VERIFY(!k1
.moved_from_ctor
);
148 VERIFY(!k1
.moved_from_assign
);
149 VERIFY(!v1
.moved_from_ctor
);
150 VERIFY(!v1
.moved_from_assign
);
151 VERIFY(m
.size() == 1);
153 auto res3
= m
.try_emplace(m
.begin(), std::move(k2
), std::move(v1
));
154 VERIFY(res3
!= res1
&& res3
!= m
.end());
155 VERIFY(m
[0].val
== 5);
156 VERIFY(m
[1].val
== 6);
157 VERIFY(k2
.moved_from_ctor
);
158 VERIFY(!k2
.moved_from_assign
);
159 VERIFY(v1
.moved_from_ctor
);
160 VERIFY(!v1
.moved_from_assign
);
161 VERIFY(m
.size() == 2);
166 typedef std::map
<int, Val
> Map
;
168 auto res1
= m
.try_emplace(0, Val(5));
170 VERIFY(res1
.first
!= m
.end());
171 VERIFY(m
[0].val
== 5);
173 VERIFY(m
.size() == 1);
174 auto res2
= m
.try_emplace(0, v1
);
175 VERIFY(!res2
.second
);
176 VERIFY(res2
.first
== res1
.first
);
177 VERIFY(m
[0].val
== 5);
178 VERIFY(!v1
.moved_from_ctor
);
179 VERIFY(!v1
.moved_from_assign
);
180 VERIFY(m
.size() == 1);
181 auto res3
= m
.try_emplace(1, v1
);
182 VERIFY(res3
.first
!= res1
.first
&& res3
.first
!= m
.end());
184 VERIFY(m
[0].val
== 5);
185 VERIFY(m
[1].val
== 6);
186 VERIFY(!v1
.moved_from_ctor
);
187 VERIFY(!v1
.moved_from_assign
);
188 VERIFY(m
.size() == 2);
193 typedef std::map
<int, Val
> Map
;
195 auto res1
= m
.try_emplace(m
.begin(), 0, Val(5));
196 VERIFY(res1
!= m
.end());
197 VERIFY(m
[0].val
== 5);
199 VERIFY(m
.size() == 1);
200 auto res2
= m
.try_emplace(m
.begin(), 0, v1
);
201 VERIFY(res2
== res1
);
202 VERIFY(m
[0].val
== 5);
203 VERIFY(!v1
.moved_from_ctor
);
204 VERIFY(!v1
.moved_from_assign
);
205 VERIFY(m
.size() == 1);
206 auto res3
= m
.try_emplace(m
.begin(), 1, v1
);
207 VERIFY(res3
!= res1
&& res3
!= m
.end());
208 VERIFY(m
[0].val
== 5);
209 VERIFY(m
[1].val
== 6);
210 VERIFY(!v1
.moved_from_ctor
);
211 VERIFY(!v1
.moved_from_assign
);
212 VERIFY(m
.size() == 2);
217 typedef std::map
<Val
, Val
> Map
;
219 auto res1
= m
.try_emplace(0, Val(5));
221 VERIFY(res1
.first
!= m
.end());
222 VERIFY(m
[0].val
== 5);
225 VERIFY(m
.size() == 1);
226 auto res2
= m
.try_emplace(k1
, v1
);
227 VERIFY(!res2
.second
);
228 VERIFY(res2
.first
== res1
.first
);
229 VERIFY(m
[0].val
== 5);
230 VERIFY(!k1
.moved_from_ctor
);
231 VERIFY(!k1
.moved_from_assign
);
232 VERIFY(!v1
.moved_from_ctor
);
233 VERIFY(!v1
.moved_from_assign
);
234 VERIFY(m
.size() == 1);
236 auto res3
= m
.try_emplace(k2
, v1
);
237 VERIFY(res3
.first
!= res1
.first
&& res3
.first
!= m
.end());
239 VERIFY(m
[0].val
== 5);
240 VERIFY(m
[1].val
== 6);
241 VERIFY(!k2
.moved_from_ctor
);
242 VERIFY(!k2
.moved_from_assign
);
243 VERIFY(!v1
.moved_from_ctor
);
244 VERIFY(!v1
.moved_from_assign
);
245 VERIFY(m
.size() == 2);
250 typedef std::map
<Val
, Val
> Map
;
252 auto res1
= m
.try_emplace(m
.begin(), 0, Val(5));
253 VERIFY(res1
!= m
.end());
254 VERIFY(m
[0].val
== 5);
257 VERIFY(m
.size() == 1);
258 auto res2
= m
.try_emplace(m
.begin(), k1
, v1
);
259 VERIFY(res2
== res1
);
260 VERIFY(m
[0].val
== 5);
261 VERIFY(!k1
.moved_from_ctor
);
262 VERIFY(!k1
.moved_from_assign
);
263 VERIFY(!v1
.moved_from_ctor
);
264 VERIFY(!v1
.moved_from_assign
);
265 VERIFY(m
.size() == 1);
267 auto res3
= m
.try_emplace(m
.begin(), k2
, v1
);
268 VERIFY(res3
!= res1
&& res3
!= m
.end());
269 VERIFY(m
[0].val
== 5);
270 VERIFY(m
[1].val
== 6);
271 VERIFY(!k2
.moved_from_ctor
);
272 VERIFY(!k2
.moved_from_assign
);
273 VERIFY(!v1
.moved_from_ctor
);
274 VERIFY(!v1
.moved_from_assign
);
275 VERIFY(m
.size() == 2);