[libcxx] r258575 - unordered_map: Reuse insert logic in emplace when possible, NFC

Duncan P. N. Exon Smith via cfe-commits cfe-commits at lists.llvm.org
Sat Jan 23 07:58:53 PST 2016


Note that this was reverted due to post-commit review, but Phab
forked it into a different thread.  Here it is:
http://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20160118/147795.html

> On 2016-Jan-22, at 14:48, Duncan P. N. Exon Smith via cfe-commits <cfe-commits at lists.llvm.org> wrote:
> 
> Author: dexonsmith
> Date: Fri Jan 22 16:48:02 2016
> New Revision: 258575
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=258575&view=rev
> Log:
> unordered_map: Reuse insert logic in emplace when possible, NFC
> 
> An upcoming commit will add an optimization to insert() that avoids
> unnecessary mallocs when we can safely extract the key type.  This
> commit shares code between emplace() and insert():
> - if emplace() is given a single argument, and
> - value_type is constructible from that argument
> so that we have a single code path for the two.
> 
> I also updated the debug version of emplace_hint() to defer to
> emplace(), like the non-debug version does.
> 
> In both cases, there should be NFC here.
> 
> Modified:
>    libcxx/trunk/include/unordered_map
> 
> Modified: libcxx/trunk/include/unordered_map
> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/unordered_map?rev=258575&r1=258574&r2=258575&view=diff
> ==============================================================================
> --- libcxx/trunk/include/unordered_map (original)
> +++ libcxx/trunk/include/unordered_map Fri Jan 22 16:48:02 2016
> @@ -922,8 +922,32 @@ public:
> #ifndef _LIBCPP_HAS_NO_VARIADICS
> 
>     template <class... _Args>
> -        pair<iterator, bool> emplace(_Args&&... __args);
> +    pair<iterator, bool> emplace(_Args&&... __args)
> +        {return __emplace_dispatch(std::forward<_Args>(__args)...);}
> 
> +private:
> +    template <class _Arg>
> +    pair<iterator, bool> __emplace_dispatch(_Arg&& __arg)
> +        {
> +            typedef is_constructible<value_type, _Arg> __constructible;
> +            return __emplace_insert_if_constructible(std::forward<_Arg>(__arg),
> +                                                     __constructible());
> +        }
> +    template <class _Arg1, class... _Args>
> +    pair<iterator, bool> __emplace_dispatch(_Arg1&& __arg1, _Args&&... __args)
> +        {return __emplace_impl(std::forward<_Arg1>(__arg1), std::forward<_Args>(__args)...);}
> +
> +    template <class _Arg>
> +    pair<iterator, bool> __emplace_insert_if_constructible(_Arg&& __arg, false_type)
> +        {return __emplace_impl(std::forward<_Arg>(__arg));}
> +    template <class _Arg>
> +    pair<iterator, bool> __emplace_insert_if_constructible(_Arg&& __arg, true_type)
> +        {return insert(std::forward<_Arg>(__arg));}
> +
> +    template <class... _Args>
> +    pair<iterator, bool> __emplace_impl(_Args&&... __args);
> +
> +public:
>     template <class... _Args>
>         _LIBCPP_INLINE_VISIBILITY
> #if _LIBCPP_DEBUG_LEVEL >= 2
> @@ -932,7 +956,7 @@ public:
>             _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
>                 "unordered_map::emplace_hint(const_iterator, args...) called with an iterator not"
>                 " referring to this unordered_map");
> -            return __table_.__emplace_unique(_VSTD::forward<_Args>(__args)...).first;
> +            return emplace(_VSTD::forward<_Args>(__args)...).first;
>         }
> #else
>         iterator emplace_hint(const_iterator, _Args&&... __args)
> @@ -1477,7 +1501,7 @@ unordered_map<_Key, _Tp, _Hash, _Pred, _
> template <class _Key, class _Tp, class _Hash, class _Pred, class _Alloc>
> template <class... _Args>
> pair<typename unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::iterator, bool>
> -unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::emplace(_Args&&... __args)
> +unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::__emplace_impl(_Args&&... __args)
> {
>     __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
>     pair<iterator, bool> __r = __table_.__node_insert_unique(__h.get());
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list