| Index: Source/wtf/ListHashSet.h
|
| diff --git a/Source/wtf/ListHashSet.h b/Source/wtf/ListHashSet.h
|
| index 69e1c911cd89d72cc3e7564bc3f1647cb9e659a8..965f813bdb370aec5447a750068d2182797c9584 100644
|
| --- a/Source/wtf/ListHashSet.h
|
| +++ b/Source/wtf/ListHashSet.h
|
| @@ -82,7 +82,12 @@ namespace WTF {
|
| typedef ListHashSetConstReverseIterator<ValueType, inlineCapacity, HashArg> const_reverse_iterator;
|
| friend class ListHashSetConstReverseIterator<ValueType, inlineCapacity, HashArg>;
|
|
|
| - typedef HashTableAddResult<iterator> AddResult;
|
| + template<typename ValueType> struct HashTableAddResult {
|
| + HashTableAddResult(Node* storedValue, bool isNewEntry) : storedValue(storedValue), isNewEntry(isNewEntry) { }
|
| + Node* storedValue;
|
| + bool isNewEntry;
|
| + };
|
| + typedef HashTableAddResult<ValueType> AddResult;
|
|
|
| ListHashSet();
|
| ListHashSet(const ListHashSet&);
|
| @@ -126,10 +131,16 @@ namespace WTF {
|
| template<typename HashTranslator, typename T> const_iterator find(const T&) const;
|
| template<typename HashTranslator, typename T> bool contains(const T&) const;
|
|
|
| - // The return value of add is a pair of an iterator to the new value's location,
|
| + // 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(const ValueType&);
|
|
|
| + // 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(const ValueType&);
|
| +
|
| // 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(const ValueType&);
|
| @@ -735,20 +746,25 @@ namespace WTF {
|
| createAllocatorIfNeeded();
|
| typename ImplType::AddResult result = m_impl.template add<BaseTranslator>(value, m_allocator.get());
|
| if (result.isNewEntry)
|
| - appendNode(*result.iterator);
|
| - return AddResult(makeIterator(*result.iterator), result.isNewEntry);
|
| + appendNode(*result.storedValue);
|
| + return AddResult(*result.storedValue, result.isNewEntry);
|
| }
|
|
|
| template<typename T, size_t inlineCapacity, typename U>
|
| + typename ListHashSet<T, inlineCapacity, U>::iterator ListHashSet<T, inlineCapacity, U>::addReturnIterator(const ValueType &value)
|
| + {
|
| + return makeIterator(add(value).storedValue);
|
| + }
|
| + template<typename T, size_t inlineCapacity, typename U>
|
| typename ListHashSet<T, inlineCapacity, U>::AddResult ListHashSet<T, inlineCapacity, U>::appendOrMoveToLast(const ValueType &value)
|
| {
|
| createAllocatorIfNeeded();
|
| typename ImplType::AddResult result = m_impl.template add<BaseTranslator>(value, m_allocator.get());
|
| - Node* node = *result.iterator;
|
| + Node* node = *result.storedValue;
|
| if (!result.isNewEntry)
|
| unlink(node);
|
| appendNode(node);
|
| - return AddResult(makeIterator(*result.iterator), result.isNewEntry);
|
| + return AddResult(*result.storedValue, result.isNewEntry);
|
| }
|
|
|
| template<typename T, size_t inlineCapacity, typename U>
|
| @@ -756,11 +772,11 @@ namespace WTF {
|
| {
|
| createAllocatorIfNeeded();
|
| typename ImplType::AddResult result = m_impl.template add<BaseTranslator>(value, m_allocator.get());
|
| - Node* node = *result.iterator;
|
| + Node* node = *result.storedValue;
|
| if (!result.isNewEntry)
|
| unlink(node);
|
| prependNode(node);
|
| - return AddResult(makeIterator(*result.iterator), result.isNewEntry);
|
| + return AddResult(*result.storedValue, result.isNewEntry);
|
| }
|
|
|
| template<typename T, size_t inlineCapacity, typename U>
|
| @@ -769,8 +785,8 @@ namespace WTF {
|
| createAllocatorIfNeeded();
|
| typename ImplType::AddResult result = m_impl.template add<BaseTranslator>(newValue, m_allocator.get());
|
| if (result.isNewEntry)
|
| - insertNodeBefore(it.node(), *result.iterator);
|
| - return AddResult(makeIterator(*result.iterator), result.isNewEntry);
|
| + insertNodeBefore(it.node(), *result.storedValue);
|
| + return AddResult(*result.storedValue, result.isNewEntry);
|
| }
|
|
|
| template<typename T, size_t inlineCapacity, typename U>
|
|
|