[PATCH] PR libstdc++/83709 don't rehash if no insertion

Jonathan Wakely jwakely@redhat.com
Tue Jan 9 13:06:00 GMT 2018


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.




More information about the Libstdc++ mailing list