On 17/11/19 21:51 +0100, François Dumont wrote:
This patch simplifies a number of implementations.
It tries as much as possible to avoid computing hash code. This is
especially true for the erase implementation in case of multi keys.
   * include/bits/hashtable_policy.h (_Map_base<>::at): Use
   _Hashtable<>::find.
(_Hashtable_base<>::_Equal_hash_code<>::_S_node_equals):New.
   (_Hashtable_base<>::_M_node_equals): New, use latter.
   * include/bits/hashtable.h (_Hashtable<>::_M_update_bbegin): New.
   (_Hashtable<>::_M_assign): Use latter.
   (_Hashtable<>::_M_move_assign): Likewise.
   (_Hashtable<>(_Hashtable<>&&)): Likewise.
   (_Hashtable<>(_Hashtable<>&&, const allocator_type&)): Likewise.
   (_Hashtable<>::swap): Likewise.
   (_Hashtable<>::find): Build iterator directly from _M_find_node result.
   (_Hashtable<>::count): Use _Hashtable<>::find.
   (_Hashtable<>::equal_range): Likewise.
   (_Hashtable<>::_M_erase(false_type, const key_type&)): Use
   _M_node_equals.
Tested under Linux x86_64.
OK for master except for one comment ...
@@ -1457,14 +1466,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
std::swap(_M_element_count, __x._M_element_count);
std::swap(_M_single_bucket, __x._M_single_bucket);
- // Fix buckets containing the _M_before_begin pointers that can't be
- // swapped.
- if (_M_begin())
- _M_buckets[_M_bucket_index(_M_begin())] = &_M_before_begin;
-
- if (__x._M_begin())
- __x._M_buckets[__x._M_bucket_index(__x._M_begin())]
- = &__x._M_before_begin;
+ // Fix bucket containing the _M_before_begin pointer that can't be swap.
"can't be swap" should be "can't be swapped" as it was in the original
comment.
OK with that change, thanks.
+ _M_update_bbegin();
+ __x._M_update_bbegin();
}
template<typename _Key, typename _Value,