@@ -197,7 +197,7 @@ destroy() noexcept
197197// ----------------------------------------------------------
198198
199199object::
200- object (detail::unchecked_object&& uo)
200+ object (detail::unchecked_object& uo)
201201 : sp_(uo.storage())
202202{
203203 if (uo.size () == 0 )
@@ -210,20 +210,18 @@ object(detail::unchecked_object&& uo)
210210 uo.size () <= max_size ());
211211 t_ = table::allocate (
212212 uo.size (), 0 , sp_);
213+ t_->size = 0 ;
213214
214215 // insert all elements, keeping
215- // the last of any duplicate keys.
216+ // the last of any duplicate keys, unless uo.ignore_duplicates is false .
216217 auto dest = begin ();
217- auto src = uo.release ();
218- auto const end = src + 2 * uo.size ();
219218 if (t_->is_small ())
220219 {
221- t_->size = 0 ;
222- while (src != end)
220+ for ( ; uo.size (); uo.pop_front () )
223221 {
222+ auto src = uo.front ();
224223 access::construct_key_value_pair (
225224 dest, pilfer (src[0 ]), pilfer (src[1 ]));
226- src += 2 ;
227225 auto result = detail::find_in_object (*this , dest->key ());
228226 if (! result.first )
229227 {
@@ -232,6 +230,11 @@ object(detail::unchecked_object&& uo)
232230 continue ;
233231 }
234232 // handle duplicate
233+ if ( !uo.ignore_duplicate_keys () )
234+ {
235+ dest->~key_value_pair ();
236+ return ;
237+ }
235238 auto & v = *result.first ;
236239 // don't bother to check if
237240 // storage deallocate is trivial
@@ -243,11 +246,11 @@ object(detail::unchecked_object&& uo)
243246 }
244247 return ;
245248 }
246- while (src != end )
249+ for ( ; uo. size () ; uo. pop_front () )
247250 {
251+ auto src = uo.front ();
248252 access::construct_key_value_pair (
249253 dest, pilfer (src[0 ]), pilfer (src[1 ]));
250- src += 2 ;
251254 auto & head = t_->bucket (dest->key ());
252255 auto i = head;
253256 for (;;)
@@ -260,6 +263,7 @@ object(detail::unchecked_object&& uo)
260263 head = static_cast <index_t >(
261264 dest - begin ());
262265 ++dest;
266+ ++t_->size ;
263267 break ;
264268 }
265269 auto & v = (*t_)[i];
@@ -270,6 +274,11 @@ object(detail::unchecked_object&& uo)
270274 }
271275
272276 // handle duplicate
277+ if ( !uo.ignore_duplicate_keys () )
278+ {
279+ dest->~key_value_pair ();
280+ return ;
281+ }
273282 access::next (*dest) =
274283 access::next (v);
275284 // don't bother to check if
@@ -282,8 +291,6 @@ object(detail::unchecked_object&& uo)
282291 break ;
283292 }
284293 }
285- t_->size = static_cast <
286- index_t >(dest - begin ());
287294}
288295
289296object::
0 commit comments