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> |