https://gcc.gnu.org/g:37b17388fca498cff718a13aa8d4523f15427c8c

commit r15-5215-g37b17388fca498cff718a13aa8d4523f15427c8c
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Fri Nov 1 14:17:38 2024 +0000

    libstdc++: Add _Hashtable::_M_assign for the common case
    
    This adds a convenient _M_assign overload for the common case where the
    node generator is the _AllocNode type. Only two places need to call
    _M_assign with a _ReuseOrAllocNode node generator, so all the other
    calls to _M_assign can use the new overload instead of manually
    constructing a node generator.
    
    The _AllocNode::operator(Args&&...) function doesn't need to be a
    variadic template. It is only ever called with a single argument of type
    const value_type& or value_type&&, so could be simplified. That isn't
    done in this commit.
    
    libstdc++-v3/ChangeLog:
    
            * include/bits/hashtable.h (_Hashtable): Remove typedefs for
            node generators.
            (_Hashtable::_M_assign(_Ht&&)): Add new overload.
            (_Hashtable::operator=(initializer_list<value_type>)): Add local
            typedef for node generator.
            (_Hashtable::_M_assign_elements): Likewise.
            (_Hashtable::operator=(const _Hashtable&)): Use new _M_assign
            overload.
            (_Hashtable(const _Hashtable&)): Likewise.
            (_Hashtable(const _Hashtable&, const allocator_type&)):
            Likewise.
            (_Hashtable(_Hashtable&&, __node_alloc_type&&, false_type)):
            Likewise.
            * include/bits/hashtable_policy.h (_Insert): Remove typedef for
            node generator.
    
    Reviewed-by: François Dumont <fdum...@gcc.gnu.org>

Diff:
---
 libstdc++-v3/include/bits/hashtable.h        | 34 ++++++++++++++++------------
 libstdc++-v3/include/bits/hashtable_policy.h |  1 -
 2 files changed, 19 insertions(+), 16 deletions(-)

diff --git a/libstdc++-v3/include/bits/hashtable.h 
b/libstdc++-v3/include/bits/hashtable.h
index 23484f711cc5..bf6eed7c1c69 100644
--- a/libstdc++-v3/include/bits/hashtable.h
+++ b/libstdc++-v3/include/bits/hashtable.h
@@ -299,12 +299,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                                            _Equal, _Hash, _RangeHash, _Unused,
                                            _RehashPolicy, _Traits>;
 
-      using __reuse_or_alloc_node_gen_t =
-       __detail::_ReuseOrAllocNode<__node_alloc_type>;
-      using __alloc_node_gen_t =
-       __detail::_AllocNode<__node_alloc_type>;
-      using __node_builder_t =
-       __detail::_NodeBuilder<_ExtractKey>;
+      using __node_builder_t = __detail::_NodeBuilder<_ExtractKey>;
 
       // Simple RAII type for managing a node containing an element
       struct _Scoped_node
@@ -480,6 +475,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        void
        _M_assign_elements(_Ht&&);
 
+      template<typename _Ht>
+       void
+       _M_assign(_Ht&& __ht)
+       {
+         __detail::_AllocNode<__node_alloc_type> __alloc_node_gen(*this);
+         _M_assign(std::forward<_Ht>(__ht), __alloc_node_gen);
+       }
+
       template<typename _Ht, typename _NodeGenerator>
        void
        _M_assign(_Ht&&, _NodeGenerator&);
@@ -608,6 +611,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       _Hashtable&
       operator=(initializer_list<value_type> __l)
       {
+       using __reuse_or_alloc_node_gen_t =
+         __detail::_ReuseOrAllocNode<__node_alloc_type>;
+
        __reuse_or_alloc_node_gen_t __roan(_M_begin(), *this);
        _M_before_begin._M_nxt = nullptr;
        clear();
@@ -1308,10 +1314,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
              _M_bucket_count = __ht._M_bucket_count;
              _M_element_count = __ht._M_element_count;
              _M_rehash_policy = __ht._M_rehash_policy;
-             __alloc_node_gen_t __alloc_node_gen(*this);
              __try
                {
-                 _M_assign(__ht, __alloc_node_gen);
+                 _M_assign(__ht);
                }
              __catch(...)
                {
@@ -1340,6 +1345,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                 _Hash, _RangeHash, _Unused, _RehashPolicy, _Traits>::
       _M_assign_elements(_Ht&& __ht)
       {
+       using __reuse_or_alloc_node_gen_t =
+         __detail::_ReuseOrAllocNode<__node_alloc_type>;
+
        __buckets_ptr __former_buckets = nullptr;
        std::size_t __former_bucket_count = _M_bucket_count;
        __rehash_guard_t __rehash_guard(_M_rehash_policy);
@@ -1517,8 +1525,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       _M_element_count(__ht._M_element_count),
       _M_rehash_policy(__ht._M_rehash_policy)
     {
-      __alloc_node_gen_t __alloc_node_gen(*this);
-      _M_assign(__ht, __alloc_node_gen);
+      _M_assign(__ht);
     }
 
   template<typename _Key, typename _Value, typename _Alloc,
@@ -1572,8 +1579,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       _M_element_count(__ht._M_element_count),
       _M_rehash_policy(__ht._M_rehash_policy)
     {
-      __alloc_node_gen_t __alloc_node_gen(*this);
-      _M_assign(__ht, __alloc_node_gen);
+      _M_assign(__ht);
     }
 
   template<typename _Key, typename _Value, typename _Alloc,
@@ -1612,12 +1618,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        }
       else
        {
-         __alloc_node_gen_t __alloc_gen(*this);
-
          using _Fwd_Ht = __conditional_t<
            __move_if_noexcept_cond<value_type>::value,
            const _Hashtable&, _Hashtable&&>;
-         _M_assign(std::forward<_Fwd_Ht>(__ht), __alloc_gen);
+         _M_assign(std::forward<_Fwd_Ht>(__ht));
          __ht.clear();
        }
     }
diff --git a/libstdc++-v3/include/bits/hashtable_policy.h 
b/libstdc++-v3/include/bits/hashtable_policy.h
index caedb0258ef4..cf97e571c1e2 100644
--- a/libstdc++-v3/include/bits/hashtable_policy.h
+++ b/libstdc++-v3/include/bits/hashtable_policy.h
@@ -978,7 +978,6 @@ namespace __detail
 
       using __unique_keys = typename _Traits::__unique_keys;
       using __node_alloc_type = typename __hashtable_alloc::__node_alloc_type;
-      using __node_gen_type = _AllocNode<__node_alloc_type>;
 
       [[__gnu__::__always_inline__]]
       __hashtable&

Reply via email to