On 08/01/18 22:31 +0100, François Dumont wrote:
Hi
Bug confirmed, limited to range insertion on unordered_set and
unordered_map.
I had to specialize _M_insert_range for those containers. Now this
method maintains the theoretical number of elements to insert which is
used only if an insertion takes place.
I also took this oportunity to introduce a small change in
__distance_fw to report 0 only if __first == __last and do nothing in
this case.
* include/bits/hashtable_policy.h
(__distance_fwd(_Iterator, _Iterator, input_iterator_tag)): Return 1 if
__first != __last.
(_Insert_base::_M_insert_range(_Ite, _Ite, _NodeGetter,
true_type)): New.
(_Insert_base::_M_insert_range(_Ite, _Ite, _NodeGetter, false_type)):
Add false_type parameter.
(_Insert_base::insert): Adapt.
* include/bits/hashtable.h (_Hashtable::operator=(initializzr_list<>)):
Adapt.
(_Hashtable::_M_insert_unique_node): Add __n_elt parameter, defaulted
to 1.
(_Hashtable::_M_insert(_Arg&&, const _NodeGen&, true_type, size_t)):
Likewise.
(_Hashtable::_M_merge_unique): Pass target number of elements to add to
produce only 1 rehash if necessary.
* testsuite/23_containers/unordered_map/insert/83709.cc: New.
* testsuite/23_containers/unordered_set/insert/83709.cc: New.
Tested under Linux x86_64 normal and debug modes.
Ok to commit ?
OK, thanks for the quick fix.