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,

Reply via email to