Chromium Code Reviews| Index: third_party/WebKit/Source/wtf/HashMap.h |
| diff --git a/third_party/WebKit/Source/wtf/HashMap.h b/third_party/WebKit/Source/wtf/HashMap.h |
| index dca62595d344f99bb8f971de7ed3be1192c4fe5b..cb6a72f30ebed081e32d254c0f893d754fab0c25 100644 |
| --- a/third_party/WebKit/Source/wtf/HashMap.h |
| +++ b/third_party/WebKit/Source/wtf/HashMap.h |
| @@ -127,12 +127,14 @@ public: |
| // replaces value but not key if key is already present return value is a |
| // pair of the iterator to the key location, and a boolean that's true if a |
| // new value was actually added |
| - AddResult set(KeyPeekInType, MappedPassInType); |
| + template <typename IncomingKeyType, typename IncomingMappedType> |
| + AddResult set(IncomingKeyType&&, IncomingMappedType&&); |
| // does nothing if key is already present return value is a pair of the |
| // iterator to the key location, and a boolean that's true if a new value |
| // was actually added |
| - AddResult add(KeyPeekInType, MappedPassInType); |
| + template <typename IncomingKeyType, typename IncomingMappedType> |
| + AddResult add(IncomingKeyType&&, IncomingMappedType&&); |
| void remove(KeyPeekInType); |
| void remove(iterator); |
| @@ -166,7 +168,8 @@ public: |
| void trace(VisitorDispatcher visitor) { m_impl.trace(visitor); } |
| private: |
| - AddResult inlineAdd(KeyPeekInType, MappedPassInReferenceType); |
| + template <typename IncomingKeyType, typename IncomingMappedType> |
| + AddResult inlineAdd(IncomingKeyType&&, IncomingMappedType&&); |
| HashTableType m_impl; |
| }; |
| @@ -264,10 +267,10 @@ struct HashMapTranslator { |
| STATIC_ONLY(HashMapTranslator); |
| template <typename T> static unsigned hash(const T& key) { return HashFunctions::hash(key); } |
| template <typename T, typename U> static bool equal(const T& a, const U& b) { return HashFunctions::equal(a, b); } |
| - template <typename T, typename U, typename V> static void translate(T& location, const U& key, const V& mapped) |
| + template <typename T, typename U, typename V> static void translate(T& location, U&& key, V&& mapped) |
| { |
| - location.key = key; |
| - ValueTraits::ValueTraits::store(mapped, location.value); |
| + location.key = std::forward<U>(key); |
| + ValueTraits::ValueTraits::store(std::forward<V>(mapped), location.value); |
| } |
| }; |
| @@ -276,10 +279,10 @@ struct HashMapTranslatorAdapter { |
| STATIC_ONLY(HashMapTranslatorAdapter); |
| template <typename T> static unsigned hash(const T& key) { return Translator::hash(key); } |
| template <typename T, typename U> static bool equal(const T& a, const U& b) { return Translator::equal(a, b); } |
| - template <typename T, typename U, typename V> static void translate(T& location, const U& key, const V& mapped, unsigned hashCode) |
| + template <typename T, typename U, typename V> static void translate(T& location, U&& key, V&& mapped, unsigned hashCode) |
| { |
| - Translator::translate(location.key, key, hashCode); |
| - ValueTraits::ValueTraits::store(mapped, location.value); |
| + Translator::translate(location.key, std::forward<U>(key), hashCode); |
| + ValueTraits::ValueTraits::store(std::forward<V>(mapped), location.value); |
| } |
| }; |
| @@ -368,21 +371,25 @@ HashMap<T, U, V, W, X, Y>::contains(const TYPE& value) const |
| } |
| template <typename T, typename U, typename V, typename W, typename X, typename Y> |
| +template <typename IncomingKeyType, typename IncomingMappedType> |
| typename HashMap<T, U, V, W, X, Y>::AddResult |
| -HashMap<T, U, V, W, X, Y>::inlineAdd(KeyPeekInType key, MappedPassInReferenceType mapped) |
| +HashMap<T, U, V, W, X, Y>::inlineAdd(IncomingKeyType&& key, IncomingMappedType&& mapped) |
|
Mikhail
2016/03/04 12:58:02
think it's worth switching to 'auto HashMap<T, U,
Yuta Kitamura
2016/03/04 13:55:37
That syntax is "to be discussed" section in chromi
|
| { |
| - return m_impl.template add<HashMapTranslator<ValueTraits, HashFunctions>>(key, mapped); |
| + return m_impl.template add<HashMapTranslator<ValueTraits, HashFunctions>>(std::forward<IncomingKeyType>(key), std::forward<IncomingMappedType>(mapped)); |
| } |
| template <typename T, typename U, typename V, typename W, typename X, typename Y> |
| +template <typename IncomingKeyType, typename IncomingMappedType> |
| typename HashMap<T, U, V, W, X, Y>::AddResult |
| -HashMap<T, U, V, W, X, Y>::set(KeyPeekInType key, MappedPassInType mapped) |
| +HashMap<T, U, V, W, X, Y>::set(IncomingKeyType&& key, IncomingMappedType&& mapped) |
| { |
| - AddResult result = inlineAdd(key, mapped); |
| + AddResult result = inlineAdd(std::forward<IncomingKeyType>(key), std::forward<IncomingMappedType>(mapped)); |
| if (!result.isNewEntry) { |
| // The inlineAdd call above found an existing hash table entry; we need |
| // to set the mapped value. |
| - MappedTraits::store(mapped, result.storedValue->value); |
| + // |
| + // It's safe to call std::forward again, because |mapped| isn't moved if there's an existing entry. |
| + MappedTraits::store(std::forward<IncomingMappedType>(mapped), result.storedValue->value); |
| } |
| return result; |
| } |
| @@ -396,10 +403,11 @@ HashMap<T, U, V, W, X, Y>::add(const TYPE& key, MappedPassInType value) |
| } |
| template <typename T, typename U, typename V, typename W, typename X, typename Y> |
| +template <typename IncomingKeyType, typename IncomingMappedType> |
| typename HashMap<T, U, V, W, X, Y>::AddResult |
| -HashMap<T, U, V, W, X, Y>::add(KeyPeekInType key, MappedPassInType mapped) |
| +HashMap<T, U, V, W, X, Y>::add(IncomingKeyType&& key, IncomingMappedType&& mapped) |
| { |
| - return inlineAdd(key, mapped); |
| + return inlineAdd(std::forward<IncomingKeyType>(key), std::forward<IncomingMappedType>(mapped)); |
| } |
| template <typename T, typename U, typename V, typename W, typename X, typename Y> |