| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2005, 2006, 2007, 2008, 2011, 2012 Apple Inc. All rights reserv
ed. | 2 * Copyright (C) 2005, 2006, 2007, 2008, 2011, 2012 Apple Inc. All rights reserv
ed. |
| 3 * Copyright (C) 2011, Benjamin Poulain <ikipou@gmail.com> | 3 * Copyright (C) 2011, Benjamin Poulain <ikipou@gmail.com> |
| 4 * | 4 * |
| 5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
| 6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
| 7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
| 8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
| 9 * | 9 * |
| 10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 typedef ValueArg ValueType; | 75 typedef ValueArg ValueType; |
| 76 | 76 |
| 77 typedef ListHashSetIterator<ValueType, inlineCapacity, HashArg> iterator
; | 77 typedef ListHashSetIterator<ValueType, inlineCapacity, HashArg> iterator
; |
| 78 typedef ListHashSetConstIterator<ValueType, inlineCapacity, HashArg> con
st_iterator; | 78 typedef ListHashSetConstIterator<ValueType, inlineCapacity, HashArg> con
st_iterator; |
| 79 friend class ListHashSetConstIterator<ValueType, inlineCapacity, HashArg
>; | 79 friend class ListHashSetConstIterator<ValueType, inlineCapacity, HashArg
>; |
| 80 | 80 |
| 81 typedef ListHashSetReverseIterator<ValueType, inlineCapacity, HashArg> r
everse_iterator; | 81 typedef ListHashSetReverseIterator<ValueType, inlineCapacity, HashArg> r
everse_iterator; |
| 82 typedef ListHashSetConstReverseIterator<ValueType, inlineCapacity, HashA
rg> const_reverse_iterator; | 82 typedef ListHashSetConstReverseIterator<ValueType, inlineCapacity, HashA
rg> const_reverse_iterator; |
| 83 friend class ListHashSetConstReverseIterator<ValueType, inlineCapacity,
HashArg>; | 83 friend class ListHashSetConstReverseIterator<ValueType, inlineCapacity,
HashArg>; |
| 84 | 84 |
| 85 typedef HashTableAddResult<iterator> AddResult; | 85 template<typename ValueType> struct HashTableAddResult { |
| 86 HashTableAddResult(Node* storedValue, bool isNewEntry) : storedValue(sto
redValue), isNewEntry(isNewEntry) { } |
| 87 Node* storedValue; |
| 88 bool isNewEntry; |
| 89 }; |
| 90 typedef HashTableAddResult<ValueType> AddResult; |
| 86 | 91 |
| 87 ListHashSet(); | 92 ListHashSet(); |
| 88 ListHashSet(const ListHashSet&); | 93 ListHashSet(const ListHashSet&); |
| 89 ListHashSet& operator=(const ListHashSet&); | 94 ListHashSet& operator=(const ListHashSet&); |
| 90 ~ListHashSet(); | 95 ~ListHashSet(); |
| 91 | 96 |
| 92 void swap(ListHashSet&); | 97 void swap(ListHashSet&); |
| 93 | 98 |
| 94 unsigned size() const; | 99 unsigned size() const; |
| 95 unsigned capacity() const; | 100 unsigned capacity() const; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 119 const_iterator find(const ValueType&) const; | 124 const_iterator find(const ValueType&) const; |
| 120 bool contains(const ValueType&) const; | 125 bool contains(const ValueType&) const; |
| 121 | 126 |
| 122 // An alternate version of find() that finds the object by hashing and c
omparing | 127 // An alternate version of find() that finds the object by hashing and c
omparing |
| 123 // with some other type, to avoid the cost of type conversion. | 128 // with some other type, to avoid the cost of type conversion. |
| 124 // The HashTranslator interface is defined in HashSet. | 129 // The HashTranslator interface is defined in HashSet. |
| 125 template<typename HashTranslator, typename T> iterator find(const T&); | 130 template<typename HashTranslator, typename T> iterator find(const T&); |
| 126 template<typename HashTranslator, typename T> const_iterator find(const
T&) const; | 131 template<typename HashTranslator, typename T> const_iterator find(const
T&) const; |
| 127 template<typename HashTranslator, typename T> bool contains(const T&) co
nst; | 132 template<typename HashTranslator, typename T> bool contains(const T&) co
nst; |
| 128 | 133 |
| 129 // The return value of add is a pair of an iterator to the new value's l
ocation, | 134 // The return value of add is a pair of a pointer to the stored value, |
| 130 // and a bool that is true if an new entry was added. | 135 // and a bool that is true if an new entry was added. |
| 131 AddResult add(const ValueType&); | 136 AddResult add(const ValueType&); |
| 132 | 137 |
| 138 // Same as add() except that the return value is an |
| 139 // iterator. Useful in cases where it's needed to have the |
| 140 // same return value as find() and where it's not possible to |
| 141 // use a pointer to the storedValue. |
| 142 iterator addReturnIterator(const ValueType&); |
| 143 |
| 133 // Add the value to the end of the collection. If the value was already
in | 144 // Add the value to the end of the collection. If the value was already
in |
| 134 // the list, it is moved to the end. | 145 // the list, it is moved to the end. |
| 135 AddResult appendOrMoveToLast(const ValueType&); | 146 AddResult appendOrMoveToLast(const ValueType&); |
| 136 | 147 |
| 137 // Add the value to the beginning of the collection. If the value was al
ready in | 148 // Add the value to the beginning of the collection. If the value was al
ready in |
| 138 // the list, it is moved to the beginning. | 149 // the list, it is moved to the beginning. |
| 139 AddResult prependOrMoveToFirst(const ValueType&); | 150 AddResult prependOrMoveToFirst(const ValueType&); |
| 140 | 151 |
| 141 AddResult insertBefore(const ValueType& beforeValue, const ValueType& ne
wValue); | 152 AddResult insertBefore(const ValueType& beforeValue, const ValueType& ne
wValue); |
| 142 AddResult insertBefore(iterator, const ValueType&); | 153 AddResult insertBefore(iterator, const ValueType&); |
| (...skipping 585 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 728 { | 739 { |
| 729 return m_impl.template contains<BaseTranslator>(value); | 740 return m_impl.template contains<BaseTranslator>(value); |
| 730 } | 741 } |
| 731 | 742 |
| 732 template<typename T, size_t inlineCapacity, typename U> | 743 template<typename T, size_t inlineCapacity, typename U> |
| 733 typename ListHashSet<T, inlineCapacity, U>::AddResult ListHashSet<T, inlineC
apacity, U>::add(const ValueType &value) | 744 typename ListHashSet<T, inlineCapacity, U>::AddResult ListHashSet<T, inlineC
apacity, U>::add(const ValueType &value) |
| 734 { | 745 { |
| 735 createAllocatorIfNeeded(); | 746 createAllocatorIfNeeded(); |
| 736 typename ImplType::AddResult result = m_impl.template add<BaseTranslator
>(value, m_allocator.get()); | 747 typename ImplType::AddResult result = m_impl.template add<BaseTranslator
>(value, m_allocator.get()); |
| 737 if (result.isNewEntry) | 748 if (result.isNewEntry) |
| 738 appendNode(*result.iterator); | 749 appendNode(*result.storedValue); |
| 739 return AddResult(makeIterator(*result.iterator), result.isNewEntry); | 750 return AddResult(*result.storedValue, result.isNewEntry); |
| 740 } | 751 } |
| 741 | 752 |
| 742 template<typename T, size_t inlineCapacity, typename U> | 753 template<typename T, size_t inlineCapacity, typename U> |
| 754 typename ListHashSet<T, inlineCapacity, U>::iterator ListHashSet<T, inlineCa
pacity, U>::addReturnIterator(const ValueType &value) |
| 755 { |
| 756 return makeIterator(add(value).storedValue); |
| 757 } |
| 758 template<typename T, size_t inlineCapacity, typename U> |
| 743 typename ListHashSet<T, inlineCapacity, U>::AddResult ListHashSet<T, inlineC
apacity, U>::appendOrMoveToLast(const ValueType &value) | 759 typename ListHashSet<T, inlineCapacity, U>::AddResult ListHashSet<T, inlineC
apacity, U>::appendOrMoveToLast(const ValueType &value) |
| 744 { | 760 { |
| 745 createAllocatorIfNeeded(); | 761 createAllocatorIfNeeded(); |
| 746 typename ImplType::AddResult result = m_impl.template add<BaseTranslator
>(value, m_allocator.get()); | 762 typename ImplType::AddResult result = m_impl.template add<BaseTranslator
>(value, m_allocator.get()); |
| 747 Node* node = *result.iterator; | 763 Node* node = *result.storedValue; |
| 748 if (!result.isNewEntry) | 764 if (!result.isNewEntry) |
| 749 unlink(node); | 765 unlink(node); |
| 750 appendNode(node); | 766 appendNode(node); |
| 751 return AddResult(makeIterator(*result.iterator), result.isNewEntry); | 767 return AddResult(*result.storedValue, result.isNewEntry); |
| 752 } | 768 } |
| 753 | 769 |
| 754 template<typename T, size_t inlineCapacity, typename U> | 770 template<typename T, size_t inlineCapacity, typename U> |
| 755 typename ListHashSet<T, inlineCapacity, U>::AddResult ListHashSet<T, inlineC
apacity, U>::prependOrMoveToFirst(const ValueType &value) | 771 typename ListHashSet<T, inlineCapacity, U>::AddResult ListHashSet<T, inlineC
apacity, U>::prependOrMoveToFirst(const ValueType &value) |
| 756 { | 772 { |
| 757 createAllocatorIfNeeded(); | 773 createAllocatorIfNeeded(); |
| 758 typename ImplType::AddResult result = m_impl.template add<BaseTranslator
>(value, m_allocator.get()); | 774 typename ImplType::AddResult result = m_impl.template add<BaseTranslator
>(value, m_allocator.get()); |
| 759 Node* node = *result.iterator; | 775 Node* node = *result.storedValue; |
| 760 if (!result.isNewEntry) | 776 if (!result.isNewEntry) |
| 761 unlink(node); | 777 unlink(node); |
| 762 prependNode(node); | 778 prependNode(node); |
| 763 return AddResult(makeIterator(*result.iterator), result.isNewEntry); | 779 return AddResult(*result.storedValue, result.isNewEntry); |
| 764 } | 780 } |
| 765 | 781 |
| 766 template<typename T, size_t inlineCapacity, typename U> | 782 template<typename T, size_t inlineCapacity, typename U> |
| 767 typename ListHashSet<T, inlineCapacity, U>::AddResult ListHashSet<T, inlineC
apacity, U>::insertBefore(iterator it, const ValueType& newValue) | 783 typename ListHashSet<T, inlineCapacity, U>::AddResult ListHashSet<T, inlineC
apacity, U>::insertBefore(iterator it, const ValueType& newValue) |
| 768 { | 784 { |
| 769 createAllocatorIfNeeded(); | 785 createAllocatorIfNeeded(); |
| 770 typename ImplType::AddResult result = m_impl.template add<BaseTranslator
>(newValue, m_allocator.get()); | 786 typename ImplType::AddResult result = m_impl.template add<BaseTranslator
>(newValue, m_allocator.get()); |
| 771 if (result.isNewEntry) | 787 if (result.isNewEntry) |
| 772 insertNodeBefore(it.node(), *result.iterator); | 788 insertNodeBefore(it.node(), *result.storedValue); |
| 773 return AddResult(makeIterator(*result.iterator), result.isNewEntry); | 789 return AddResult(*result.storedValue, result.isNewEntry); |
| 774 } | 790 } |
| 775 | 791 |
| 776 template<typename T, size_t inlineCapacity, typename U> | 792 template<typename T, size_t inlineCapacity, typename U> |
| 777 typename ListHashSet<T, inlineCapacity, U>::AddResult ListHashSet<T, inlineC
apacity, U>::insertBefore(const ValueType& beforeValue, const ValueType& newValu
e) | 793 typename ListHashSet<T, inlineCapacity, U>::AddResult ListHashSet<T, inlineC
apacity, U>::insertBefore(const ValueType& beforeValue, const ValueType& newValu
e) |
| 778 { | 794 { |
| 779 createAllocatorIfNeeded(); | 795 createAllocatorIfNeeded(); |
| 780 return insertBefore(find(beforeValue), newValue); | 796 return insertBefore(find(beforeValue), newValue); |
| 781 } | 797 } |
| 782 | 798 |
| 783 template<typename T, size_t inlineCapacity, typename U> | 799 template<typename T, size_t inlineCapacity, typename U> |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 931 inline void deleteAllValues(const ListHashSet<T, inlineCapacity, U>& collect
ion) | 947 inline void deleteAllValues(const ListHashSet<T, inlineCapacity, U>& collect
ion) |
| 932 { | 948 { |
| 933 deleteAllValues<true, typename ListHashSet<T, inlineCapacity, U>::ValueT
ype>(collection.m_impl); | 949 deleteAllValues<true, typename ListHashSet<T, inlineCapacity, U>::ValueT
ype>(collection.m_impl); |
| 934 } | 950 } |
| 935 | 951 |
| 936 } // namespace WTF | 952 } // namespace WTF |
| 937 | 953 |
| 938 using WTF::ListHashSet; | 954 using WTF::ListHashSet; |
| 939 | 955 |
| 940 #endif /* WTF_ListHashSet_h */ | 956 #endif /* WTF_ListHashSet_h */ |
| OLD | NEW |