@@ -197,7 +197,7 @@ destroy() noexcept
197
197
// ----------------------------------------------------------
198
198
199
199
object::
200
- object (detail::unchecked_object&& uo)
200
+ object (detail::unchecked_object& uo)
201
201
: sp_(uo.storage())
202
202
{
203
203
if (uo.size () == 0 )
@@ -210,20 +210,18 @@ object(detail::unchecked_object&& uo)
210
210
uo.size () <= max_size ());
211
211
t_ = table::allocate (
212
212
uo.size (), 0 , sp_);
213
+ t_->size = 0 ;
213
214
214
215
// insert all elements, keeping
215
- // the last of any duplicate keys.
216
+ // the last of any duplicate keys, unless uo.ignore_duplicates is false .
216
217
auto dest = begin ();
217
- auto src = uo.release ();
218
- auto const end = src + 2 * uo.size ();
219
218
if (t_->is_small ())
220
219
{
221
- t_->size = 0 ;
222
- while (src != end)
220
+ for ( ; uo.size (); uo.pop_front () )
223
221
{
222
+ auto src = uo.front ();
224
223
access ::construct_key_value_pair (
225
224
dest, pilfer (src[0 ]), pilfer (src[1 ]));
226
- src += 2 ;
227
225
auto result = detail::find_in_object (*this , dest->key ());
228
226
if (! result.first )
229
227
{
@@ -232,6 +230,11 @@ object(detail::unchecked_object&& uo)
232
230
continue ;
233
231
}
234
232
// handle duplicate
233
+ if ( !uo.ignore_duplicate_keys () )
234
+ {
235
+ dest->~key_value_pair ();
236
+ return ;
237
+ }
235
238
auto & v = *result.first ;
236
239
// don't bother to check if
237
240
// storage deallocate is trivial
@@ -243,11 +246,11 @@ object(detail::unchecked_object&& uo)
243
246
}
244
247
return ;
245
248
}
246
- while (src != end )
249
+ for ( ; uo. size () ; uo. pop_front () )
247
250
{
251
+ auto src = uo.front ();
248
252
access ::construct_key_value_pair (
249
253
dest, pilfer (src[0 ]), pilfer (src[1 ]));
250
- src += 2 ;
251
254
auto & head = t_->bucket (dest->key ());
252
255
auto i = head;
253
256
for (;;)
@@ -260,6 +263,7 @@ object(detail::unchecked_object&& uo)
260
263
head = static_cast <index_t >(
261
264
dest - begin ());
262
265
++dest;
266
+ ++t_->size ;
263
267
break ;
264
268
}
265
269
auto & v = (*t_)[i];
@@ -270,6 +274,11 @@ object(detail::unchecked_object&& uo)
270
274
}
271
275
272
276
// handle duplicate
277
+ if ( !uo.ignore_duplicate_keys () )
278
+ {
279
+ dest->~key_value_pair ();
280
+ return ;
281
+ }
273
282
access ::next (*dest) =
274
283
access ::next (v);
275
284
// don't bother to check if
@@ -282,8 +291,6 @@ object(detail::unchecked_object&& uo)
282
291
break ;
283
292
}
284
293
}
285
- t_->size = static_cast <
286
- index_t >(dest - begin ());
287
294
}
288
295
289
296
object::
0 commit comments