]>
git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/23_containers/map/modifiers/insert_or_assign/1.cc
1 // { dg-options "-std=gnu++17" }
2 // { dg-skip-if "" { *-*-* } { "-D_GLIBCXX_PROFILE" } }
4 // Copyright (C) 2015-2019 Free Software Foundation, Inc.
6 // This file is part of the GNU ISO C++ Library. This library is free
7 // software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the
9 // Free Software Foundation; either version 3, or (at your option)
12 // This library is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
17 // You should have received a copy of the GNU General Public License along
18 // with this library; see the file COPYING3. If not see
19 // <http://www.gnu.org/licenses/>.
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;
44 Val
& operator=(const Val
& other
)
51 bool operator<(const Val
& a
, const Val
& b
)
58 typedef std::map
<int, Val
> Map
;
60 auto res1
= m
.insert_or_assign(0, Val(5));
62 VERIFY(res1
.first
!= m
.end());
63 VERIFY(m
[0].val
== 5);
65 VERIFY(m
.size() == 1);
66 auto res2
= m
.insert_or_assign(0, std::move(v1
));
68 VERIFY(res2
.first
== res1
.first
);
69 VERIFY(m
[0].val
== 6);
70 VERIFY(!v1
.moved_from_ctor
);
71 VERIFY(v1
.moved_from_assign
);
72 VERIFY(m
.size() == 1);
73 v1
.moved_from_assign
= false;
74 auto res3
= m
.insert_or_assign(1, std::move(v1
));
75 VERIFY(res3
.first
!= res1
.first
&& res3
.first
!= m
.end());
77 VERIFY(m
[0].val
== 6);
78 VERIFY(m
[1].val
== 6);
79 VERIFY(v1
.moved_from_ctor
);
80 VERIFY(!v1
.moved_from_assign
);
81 VERIFY(m
.size() == 2);
86 typedef std::map
<int, Val
> Map
;
88 auto res1
= m
.insert_or_assign(m
.begin(), 0, Val(5));
89 VERIFY(res1
!= m
.end());
90 VERIFY(m
[0].val
== 5);
92 VERIFY(m
.size() == 1);
93 auto res2
= m
.insert_or_assign(m
.begin(), 0, std::move(v1
));
95 VERIFY(m
[0].val
== 6);
96 VERIFY(!v1
.moved_from_ctor
);
97 VERIFY(v1
.moved_from_assign
);
98 VERIFY(m
.size() == 1);
99 v1
.moved_from_assign
= false;
100 auto res3
= m
.insert_or_assign(m
.begin(), 1, std::move(v1
));
101 VERIFY(res3
!= res1
&& res3
!= m
.end());
102 VERIFY(m
[0].val
== 6);
103 VERIFY(m
[1].val
== 6);
104 VERIFY(v1
.moved_from_ctor
);
105 VERIFY(!v1
.moved_from_assign
);
106 VERIFY(m
.size() == 2);
111 typedef std::map
<Val
, Val
> Map
;
113 auto res1
= m
.insert_or_assign(0, Val(5));
115 VERIFY(res1
.first
!= m
.end());
116 VERIFY(m
[0].val
== 5);
119 VERIFY(m
.size() == 1);
120 auto res2
= m
.insert_or_assign(std::move(k1
), std::move(v1
));
121 VERIFY(!res2
.second
);
122 VERIFY(res2
.first
== res1
.first
);
123 VERIFY(m
[0].val
== 6);
124 VERIFY(!k1
.moved_from_ctor
);
125 VERIFY(!k1
.moved_from_assign
);
126 VERIFY(!v1
.moved_from_ctor
);
127 VERIFY(v1
.moved_from_assign
);
128 VERIFY(m
.size() == 1);
130 v1
.moved_from_assign
= false;
131 auto res3
= m
.insert_or_assign(std::move(k2
), std::move(v1
));
132 VERIFY(res3
.first
!= res1
.first
&& res3
.first
!= m
.end());
134 VERIFY(m
[0].val
== 6);
135 VERIFY(m
[1].val
== 6);
136 VERIFY(k2
.moved_from_ctor
);
137 VERIFY(!k2
.moved_from_assign
);
138 VERIFY(v1
.moved_from_ctor
);
139 VERIFY(!v1
.moved_from_assign
);
140 VERIFY(m
.size() == 2);
145 typedef std::map
<Val
, Val
> Map
;
147 auto res1
= m
.insert_or_assign(m
.begin(), 0, Val(5));
148 VERIFY(res1
!= m
.end());
149 VERIFY(m
[0].val
== 5);
152 VERIFY(m
.size() == 1);
153 auto res2
= m
.insert_or_assign(m
.begin(), std::move(k1
), std::move(v1
));
154 VERIFY(res2
== res1
);
155 VERIFY(m
[0].val
== 6);
156 VERIFY(!k1
.moved_from_ctor
);
157 VERIFY(!k1
.moved_from_assign
);
158 VERIFY(!v1
.moved_from_ctor
);
159 VERIFY(v1
.moved_from_assign
);
160 VERIFY(m
.size() == 1);
162 v1
.moved_from_assign
= false;
163 auto res3
= m
.insert_or_assign(m
.begin(), std::move(k2
), std::move(v1
));
164 VERIFY(res3
!= res1
&& res3
!= m
.end());
165 VERIFY(m
[0].val
== 6);
166 VERIFY(m
[1].val
== 6);
167 VERIFY(k2
.moved_from_ctor
);
168 VERIFY(!k2
.moved_from_assign
);
169 VERIFY(v1
.moved_from_ctor
);
170 VERIFY(!v1
.moved_from_assign
);
171 VERIFY(m
.size() == 2);
176 typedef std::map
<int, Val
> Map
;
178 auto res1
= m
.insert_or_assign(0, Val(5));
180 VERIFY(res1
.first
!= m
.end());
181 VERIFY(m
[0].val
== 5);
183 VERIFY(m
.size() == 1);
184 auto res2
= m
.insert_or_assign(0, v1
);
185 VERIFY(!res2
.second
);
186 VERIFY(res2
.first
== res1
.first
);
187 VERIFY(m
[0].val
== 6);
188 VERIFY(!v1
.moved_from_ctor
);
189 VERIFY(!v1
.moved_from_assign
);
190 VERIFY(m
.size() == 1);
191 auto res3
= m
.insert_or_assign(1, v1
);
192 VERIFY(res3
.first
!= res1
.first
&& res3
.first
!= m
.end());
194 VERIFY(m
[0].val
== 6);
195 VERIFY(m
[1].val
== 6);
196 VERIFY(!v1
.moved_from_ctor
);
197 VERIFY(!v1
.moved_from_assign
);
198 VERIFY(m
.size() == 2);
203 typedef std::map
<int, Val
> Map
;
205 auto res1
= m
.insert_or_assign(m
.begin(), 0, Val(5));
206 VERIFY(res1
!= m
.end());
207 VERIFY(m
[0].val
== 5);
209 VERIFY(m
.size() == 1);
210 auto res2
= m
.insert_or_assign(m
.begin(), 0, v1
);
211 VERIFY(res2
== res1
);
212 VERIFY(m
[0].val
== 6);
213 VERIFY(!v1
.moved_from_ctor
);
214 VERIFY(!v1
.moved_from_assign
);
215 VERIFY(m
.size() == 1);
216 auto res3
= m
.insert_or_assign(m
.begin(), 1, v1
);
217 VERIFY(res3
!= res1
&& res3
!= m
.end());
218 VERIFY(m
[0].val
== 6);
219 VERIFY(m
[1].val
== 6);
220 VERIFY(!v1
.moved_from_ctor
);
221 VERIFY(!v1
.moved_from_assign
);
222 VERIFY(m
.size() == 2);
227 typedef std::map
<Val
, Val
> Map
;
229 auto res1
= m
.insert_or_assign(0, Val(5));
231 VERIFY(res1
.first
!= m
.end());
232 VERIFY(m
[0].val
== 5);
235 VERIFY(m
.size() == 1);
236 auto res2
= m
.insert_or_assign(k1
, v1
);
237 VERIFY(!res2
.second
);
238 VERIFY(res2
.first
== res1
.first
);
239 VERIFY(m
[0].val
== 6);
240 VERIFY(!k1
.moved_from_ctor
);
241 VERIFY(!k1
.moved_from_assign
);
242 VERIFY(!v1
.moved_from_ctor
);
243 VERIFY(!v1
.moved_from_assign
);
244 VERIFY(m
.size() == 1);
246 auto res3
= m
.insert_or_assign(k2
, v1
);
247 VERIFY(res3
.first
!= res1
.first
&& res3
.first
!= m
.end());
249 VERIFY(m
[0].val
== 6);
250 VERIFY(m
[1].val
== 6);
251 VERIFY(!k2
.moved_from_ctor
);
252 VERIFY(!k2
.moved_from_assign
);
253 VERIFY(!v1
.moved_from_ctor
);
254 VERIFY(!v1
.moved_from_assign
);
255 VERIFY(m
.size() == 2);
260 typedef std::map
<Val
, Val
> Map
;
262 auto res1
= m
.insert_or_assign(m
.begin(), 0, Val(5));
263 VERIFY(res1
!= m
.end());
264 VERIFY(m
[0].val
== 5);
267 VERIFY(m
.size() == 1);
268 auto res2
= m
.insert_or_assign(m
.begin(), k1
, v1
);
269 VERIFY(res2
== res1
);
270 VERIFY(m
[0].val
== 6);
271 VERIFY(!k1
.moved_from_ctor
);
272 VERIFY(!k1
.moved_from_assign
);
273 VERIFY(!v1
.moved_from_ctor
);
274 VERIFY(!v1
.moved_from_assign
);
275 VERIFY(m
.size() == 1);
277 auto res3
= m
.insert_or_assign(m
.begin(), k2
, v1
);
278 VERIFY(res3
!= res1
&& res3
!= m
.end());
279 VERIFY(m
[0].val
== 6);
280 VERIFY(m
[1].val
== 6);
281 VERIFY(!k2
.moved_from_ctor
);
282 VERIFY(!k2
.moved_from_assign
);
283 VERIFY(!v1
.moved_from_ctor
);
284 VERIFY(!v1
.moved_from_assign
);
285 VERIFY(m
.size() == 2);