I'll upload a new patch in a moment.  Replies inline below.

> On 2016-Jan-21, at 23:12, Eric Fiselier <e...@efcs.ca> wrote:
> 
> EricWF added a comment.
> 
> Overall the patch looks good but I have a few concerns.
> 
>> - If argument.first can be trivially converted to key_type, don't alloc.
> 
> 
> I'm concerned with this part of the change because:
> 
> - The `is_trivially_*` traits are often not available and can sometimes blow 
> up.

When aren't they?  How do they blow up?

Is there a _LIBCPP config macro we could add?

> - It also makes the implementation of `__insert_extract_key_if_pair` a lot 
> more complicated.
> - It is technically non-standard because the standard says "insert(P&&)` 
> should be handled as-if "emplace(P&&").

Sorry I missed this.

> I would like to put a lot more thought into this part of your patch. Could 
> you remove it and add it in a follow up?

Split.  I'll upload the main/first part.

> I would also love if we applied this optimization to single argument 
> "emplace" calls.\

Just committed r258575 which should take care of this.  The new patch
will have extra tests to cover insert_hint(), emplace(), and
emplace_hint().

> 
> ================
> Comment at: include/__hash_table:867
> @@ -864,1 +866,3 @@
> +    _LIBCPP_INLINE_VISIBILITY
> +    pair<iterator, bool> __insert_unique_key_value(const _KeyTp &__key, 
> _ValueTp&& __x);
> #else
> ----------------
> I really don't like how the name and signature of the function changes 
> between C++03 and C++11. It's confusing me a lot while reviewing the patch.  
> I would much rather it always accept two parameters and be called 
> `__insert_unique_key_value`. 
> 
> We can add a C++03 __insert_unique_value that dispatches like you do above if 
> needed.

Yes, that's better.  Done.

> ================
> Comment at: include/unordered_map:403
> @@ +402,3 @@
> +    _LIBCPP_INLINE_VISIBILITY
> +    size_t operator()(const typename _Cp::value_type& __x) const
> +        {return static_cast<const _Hash&>(*this)(__x.first);}
> ----------------
> This part LGTM so long as instantiating _Cp in the function signature doesn't 
> prevent unordered_map from being used with incomplete types.

I'll double check this before commit (I'll look for a test and
add one if it's missing).

> ================
> Comment at: include/unordered_map:993
> @@ +992,3 @@
> +                _VSTD::forward<_Pp>(__x),
> +                is_same<typename decay<_FirstTp>::type, key_type>());
> +        }
> ----------------
> We don't want to decay because we don't want "array-to-pointer" and 
> "function-to-pointer" conversions.  We just want to remove the cv and ref 
> qualifiers.
> 
> I *just* added a "__uncvref"trait in <type_traits>. Please use that instead.
> 
> On second thought, I don't think we want to remove the volatile qualifiers.

Right.  Fixed.

> 
> ================
> Comment at: include/unordered_map:998
> @@ +997,3 @@
> +    _LIBCPP_INLINE_VISIBILITY
> +    pair<iterator, bool> __insert_extract_key_if_referenceable(_Pp&& __x, 
> false_type)
> +        {
> ----------------
> I'm pretty concerned about the trivially_constructible part of the 
> patch/optimization.  Can we handle this in a follow up revision instead?

Yup.
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to