Index: third_party/WebKit/Source/wtf/ListHashSet.h |
diff --git a/third_party/WebKit/Source/wtf/ListHashSet.h b/third_party/WebKit/Source/wtf/ListHashSet.h |
index 85098bd99055c529a9e86a943d946996cdc872b6..6dcf7562c5d86a660f6e242f9713a8719e8b1a00 100644 |
--- a/third_party/WebKit/Source/wtf/ListHashSet.h |
+++ b/third_party/WebKit/Source/wtf/ListHashSet.h |
@@ -74,7 +74,6 @@ public: |
typedef ValueArg ValueType; |
typedef HashTraits<ValueType> ValueTraits; |
typedef typename ValueTraits::PeekInType ValuePeekInType; |
- typedef typename ValueTraits::PassInType ValuePassInType; |
typedef typename ValueTraits::PassOutType ValuePassOutType; |
typedef ListHashSetIterator<ListHashSet> iterator; |
@@ -144,23 +143,29 @@ public: |
// The return value of add is a pair of a pointer to the stored value, and a |
// bool that is true if an new entry was added. |
- AddResult add(ValuePassInType); |
+ template <typename IncomingValueType> |
+ AddResult add(IncomingValueType&&); |
// Same as add() except that the return value is an iterator. Useful in |
// cases where it's needed to have the same return value as find() and where |
// it's not possible to use a pointer to the storedValue. |
- iterator addReturnIterator(ValuePassInType); |
+ template <typename IncomingValueType> |
+ iterator addReturnIterator(IncomingValueType&&); |
// Add the value to the end of the collection. If the value was already in |
// the list, it is moved to the end. |
- AddResult appendOrMoveToLast(ValuePassInType); |
+ template <typename IncomingValueType> |
+ AddResult appendOrMoveToLast(IncomingValueType&&); |
// Add the value to the beginning of the collection. If the value was |
// already in the list, it is moved to the beginning. |
- AddResult prependOrMoveToFirst(ValuePassInType); |
+ template <typename IncomingValueType> |
+ AddResult prependOrMoveToFirst(IncomingValueType&&); |
- AddResult insertBefore(ValuePeekInType beforeValue, ValuePassInType newValue); |
- AddResult insertBefore(iterator, ValuePassInType); |
+ template <typename IncomingValueType> |
+ AddResult insertBefore(ValuePeekInType beforeValue, IncomingValueType&& newValue); |
+ template <typename IncomingValueType> |
+ AddResult insertBefore(iterator, IncomingValueType&&); |
void remove(ValuePeekInType value) { return remove(find(value)); } |
void remove(iterator); |
@@ -203,19 +208,9 @@ private: |
template <typename ValueArg> class ListHashSetNodeBase { |
DISALLOW_NEW(); |
protected: |
- ListHashSetNodeBase(const ValueArg& value) |
- : m_value(value) |
- , m_prev(nullptr) |
- , m_next(nullptr) |
-#if ENABLE(ASSERT) |
- , m_isAllocated(true) |
-#endif |
- { |
- } |
- |
template <typename U> |
- ListHashSetNodeBase(const U& value) |
- : m_value(value) |
+ explicit ListHashSetNodeBase(U&& value) |
+ : m_value(std::forward<U>(value)) |
, m_prev(nullptr) |
, m_next(nullptr) |
#if ENABLE(ASSERT) |
@@ -356,8 +351,8 @@ public: |
typedef ValueArg Value; |
template <typename U> |
- ListHashSetNode(U value) |
- : ListHashSetNodeBase<ValueArg>(value) {} |
+ ListHashSetNode(U&& value) |
+ : ListHashSetNodeBase<ValueArg>(std::forward<U>(value)) {} |
void* operator new(size_t, NodeAllocator* allocator) |
{ |
@@ -664,9 +659,9 @@ struct ListHashSetTranslator { |
STATIC_ONLY(ListHashSetTranslator); |
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->m_value, b); } |
- template <typename T, typename U, typename V> static void translate(T*& location, const U& key, const V& allocator) |
+ template <typename T, typename U, typename V> static void translate(T*& location, U&& key, const V& allocator) |
{ |
- location = new (const_cast<V*>(&allocator)) T(key); |
+ location = new (const_cast<V*>(&allocator)) T(std::forward<U>(key)); |
} |
}; |
@@ -830,30 +825,33 @@ inline bool ListHashSet<T, inlineCapacity, U, V>::contains(ValuePeekInType value |
} |
template <typename T, size_t inlineCapacity, typename U, typename V> |
-typename ListHashSet<T, inlineCapacity, U, V>::AddResult ListHashSet<T, inlineCapacity, U, V>::add(ValuePassInType value) |
+template <typename IncomingValueType> |
+typename ListHashSet<T, inlineCapacity, U, V>::AddResult ListHashSet<T, inlineCapacity, U, V>::add(IncomingValueType&& value) |
{ |
createAllocatorIfNeeded(); |
// The second argument is a const ref. This is useful for the HashTable |
// because it lets it take lvalues by reference, but for our purposes it's |
// inconvenient, since it constrains us to be const, whereas the allocator |
// actually changes when it does allocations. |
- auto result = m_impl.template add<BaseTranslator>(value, *this->allocator()); |
+ auto result = m_impl.template add<BaseTranslator>(std::forward<IncomingValueType>(value), *this->allocator()); |
if (result.isNewEntry) |
appendNode(*result.storedValue); |
return AddResult(*result.storedValue, result.isNewEntry); |
} |
template <typename T, size_t inlineCapacity, typename U, typename V> |
-typename ListHashSet<T, inlineCapacity, U, V>::iterator ListHashSet<T, inlineCapacity, U, V>::addReturnIterator(ValuePassInType value) |
+template <typename IncomingValueType> |
+typename ListHashSet<T, inlineCapacity, U, V>::iterator ListHashSet<T, inlineCapacity, U, V>::addReturnIterator(IncomingValueType&& value) |
{ |
- return makeIterator(add(value).m_node); |
+ return makeIterator(add(std::forward<IncomingValueType>(value)).m_node); |
} |
template <typename T, size_t inlineCapacity, typename U, typename V> |
-typename ListHashSet<T, inlineCapacity, U, V>::AddResult ListHashSet<T, inlineCapacity, U, V>::appendOrMoveToLast(ValuePassInType value) |
+template <typename IncomingValueType> |
+typename ListHashSet<T, inlineCapacity, U, V>::AddResult ListHashSet<T, inlineCapacity, U, V>::appendOrMoveToLast(IncomingValueType&& value) |
{ |
createAllocatorIfNeeded(); |
- auto result = m_impl.template add<BaseTranslator>(value, *this->allocator()); |
+ auto result = m_impl.template add<BaseTranslator>(std::forward<IncomingValueType>(value), *this->allocator()); |
Node* node = *result.storedValue; |
if (!result.isNewEntry) |
unlink(node); |
@@ -862,10 +860,11 @@ typename ListHashSet<T, inlineCapacity, U, V>::AddResult ListHashSet<T, inlineCa |
} |
template <typename T, size_t inlineCapacity, typename U, typename V> |
-typename ListHashSet<T, inlineCapacity, U, V>::AddResult ListHashSet<T, inlineCapacity, U, V>::prependOrMoveToFirst(ValuePassInType value) |
+template <typename IncomingValueType> |
+typename ListHashSet<T, inlineCapacity, U, V>::AddResult ListHashSet<T, inlineCapacity, U, V>::prependOrMoveToFirst(IncomingValueType&& value) |
{ |
createAllocatorIfNeeded(); |
- auto result = m_impl.template add<BaseTranslator>(value, *this->allocator()); |
+ auto result = m_impl.template add<BaseTranslator>(std::forward<IncomingValueType>(value), *this->allocator()); |
Node* node = *result.storedValue; |
if (!result.isNewEntry) |
unlink(node); |
@@ -874,20 +873,22 @@ typename ListHashSet<T, inlineCapacity, U, V>::AddResult ListHashSet<T, inlineCa |
} |
template <typename T, size_t inlineCapacity, typename U, typename V> |
-typename ListHashSet<T, inlineCapacity, U, V>::AddResult ListHashSet<T, inlineCapacity, U, V>::insertBefore(iterator it, ValuePassInType newValue) |
+template <typename IncomingValueType> |
+typename ListHashSet<T, inlineCapacity, U, V>::AddResult ListHashSet<T, inlineCapacity, U, V>::insertBefore(iterator it, IncomingValueType&& newValue) |
{ |
createAllocatorIfNeeded(); |
- auto result = m_impl.template add<BaseTranslator>(newValue, *this->allocator()); |
+ auto result = m_impl.template add<BaseTranslator>(std::forward<IncomingValueType>(newValue), *this->allocator()); |
if (result.isNewEntry) |
insertNodeBefore(it.node(), *result.storedValue); |
return AddResult(*result.storedValue, result.isNewEntry); |
} |
template <typename T, size_t inlineCapacity, typename U, typename V> |
-typename ListHashSet<T, inlineCapacity, U, V>::AddResult ListHashSet<T, inlineCapacity, U, V>::insertBefore(ValuePeekInType beforeValue, ValuePassInType newValue) |
+template <typename IncomingValueType> |
+typename ListHashSet<T, inlineCapacity, U, V>::AddResult ListHashSet<T, inlineCapacity, U, V>::insertBefore(ValuePeekInType beforeValue, IncomingValueType&& newValue) |
{ |
createAllocatorIfNeeded(); |
- return insertBefore(find(beforeValue), newValue); |
+ return insertBefore(find(beforeValue), std::forward<IncomingValueType>(newValue)); |
} |
template <typename T, size_t inlineCapacity, typename U, typename V> |