Chromium Code Reviews| Index: Source/wtf/HashCountedSet.h |
| diff --git a/Source/wtf/HashCountedSet.h b/Source/wtf/HashCountedSet.h |
| index 18dbd321079c2746d64cb984e8af09b73d6f0aab..c873080e08d701c600a6a23b6fa9cadb74f1b973 100644 |
| --- a/Source/wtf/HashCountedSet.h |
| +++ b/Source/wtf/HashCountedSet.h |
| @@ -27,11 +27,17 @@ |
| namespace WTF { |
| - template<typename Value, typename HashFunctions = typename DefaultHash<Value>::Hash, |
| - typename Traits = HashTraits<Value> > class HashCountedSet { |
| - WTF_MAKE_FAST_ALLOCATED; |
| + // An unordered hash set that keeps track of how many times you added an |
| + // item to the set. The iterators have fields ->key and ->value that return |
| + // the set members and their counts, respectively. |
| + template< |
| + typename Value, |
| + typename HashFunctions = typename DefaultHash<Value>::Hash, |
| + typename Traits = HashTraits<Value>, |
| + typename Allocator = DefaultAllocator > class HashCountedSet { |
| + WTF_USE_ALLOCATOR(HashCountedSet, Allocator); |
| private: |
| - typedef HashMap<Value, unsigned, HashFunctions, Traits, HashTraits<unsigned>, DefaultAllocator> ImplType; |
| + typedef HashMap<Value, unsigned, HashFunctions, Traits, HashTraits<unsigned>, Allocator> ImplType; |
| public: |
| typedef Value ValueType; |
| typedef typename ImplType::iterator iterator; |
| @@ -40,22 +46,22 @@ namespace WTF { |
| HashCountedSet() {} |
| - void swap(HashCountedSet&); |
| + void swap(HashCountedSet& other) { m_impl.swap(other.m_impl); } |
| - unsigned size() const; |
| - unsigned capacity() const; |
| - bool isEmpty() const; |
| + unsigned size() const { return m_impl.size(); } |
| + unsigned capacity() const { return m_impl.capacity(); } |
| + bool isEmpty() const { return m_impl.isEmpty(); } |
| - // Iterators iterate over pairs of values and counts. |
| - iterator begin(); |
| - iterator end(); |
| - const_iterator begin() const; |
| - const_iterator end() const; |
| + // Iterators iterate over pairs of values (called key) and counts (called value). |
| + iterator begin() { return m_impl.begin(); } |
| + iterator end() { return m_impl.end(); } |
| + const_iterator begin() const { return m_impl.begin(); } |
| + const_iterator end() const { return m_impl.end(); } |
| - iterator find(const ValueType&); |
| - const_iterator find(const ValueType&) const; |
| - bool contains(const ValueType&) const; |
| - unsigned count(const ValueType&) const; |
| + iterator find(const ValueType& value) { return m_impl.find(value); } |
| + const_iterator find(const ValueType& value) const { return m_impl.find(value); } |
| + bool contains(const ValueType& value ) const { return m_impl.contains(value); } |
| + unsigned count(const ValueType& value ) const { return m_impl.get(value); } |
| // Increases the count if an equal value is already present |
| // the return value is a pair of an iterator to the new value's |
| @@ -64,108 +70,32 @@ namespace WTF { |
| // Reduces the count of the value, and removes it if count |
| // goes down to zero, returns true if the value is removed. |
| - bool remove(const ValueType&); |
| + bool remove(const ValueType& value) { return remove(find(value)); } |
| bool remove(iterator); |
| // Removes the value, regardless of its count. |
| + void removeAll(const ValueType& value) { removeAll(find(value)); } |
| void removeAll(iterator); |
| - void removeAll(const ValueType&); |
| // Clears the whole set. |
| - void clear(); |
| + void clear() { m_impl.clear(); } |
| + |
| + void trace(typename Allocator::Visitor* visitor) { m_impl.trace(visitor); } |
| private: |
| ImplType m_impl; |
| }; |
| - template<typename Value, typename HashFunctions, typename Traits> |
| - inline void HashCountedSet<Value, HashFunctions, Traits>::swap(HashCountedSet& other) |
| - { |
| - m_impl.swap(other.m_impl); |
| - } |
| - |
| - template<typename Value, typename HashFunctions, typename Traits> |
| - inline unsigned HashCountedSet<Value, HashFunctions, Traits>::size() const |
| - { |
| - return m_impl.size(); |
| - } |
| - |
| - template<typename Value, typename HashFunctions, typename Traits> |
| - inline unsigned HashCountedSet<Value, HashFunctions, Traits>::capacity() const |
| - { |
| - return m_impl.capacity(); |
| - } |
| - |
| - template<typename Value, typename HashFunctions, typename Traits> |
| - inline bool HashCountedSet<Value, HashFunctions, Traits>::isEmpty() const |
| - { |
| - return size() == 0; |
| - } |
| - |
| - template<typename Value, typename HashFunctions, typename Traits> |
| - inline typename HashCountedSet<Value, HashFunctions, Traits>::iterator HashCountedSet<Value, HashFunctions, Traits>::begin() |
| - { |
| - return m_impl.begin(); |
| - } |
| - |
| - template<typename Value, typename HashFunctions, typename Traits> |
| - inline typename HashCountedSet<Value, HashFunctions, Traits>::iterator HashCountedSet<Value, HashFunctions, Traits>::end() |
| - { |
| - return m_impl.end(); |
| - } |
| - |
| - template<typename Value, typename HashFunctions, typename Traits> |
| - inline typename HashCountedSet<Value, HashFunctions, Traits>::const_iterator HashCountedSet<Value, HashFunctions, Traits>::begin() const |
| - { |
| - return m_impl.begin(); |
| - } |
| - |
| - template<typename Value, typename HashFunctions, typename Traits> |
| - inline typename HashCountedSet<Value, HashFunctions, Traits>::const_iterator HashCountedSet<Value, HashFunctions, Traits>::end() const |
| - { |
| - return m_impl.end(); |
| - } |
| - |
| - template<typename Value, typename HashFunctions, typename Traits> |
| - inline typename HashCountedSet<Value, HashFunctions, Traits>::iterator HashCountedSet<Value, HashFunctions, Traits>::find(const ValueType& value) |
| - { |
| - return m_impl.find(value); |
| - } |
| - |
| - template<typename Value, typename HashFunctions, typename Traits> |
| - inline typename HashCountedSet<Value, HashFunctions, Traits>::const_iterator HashCountedSet<Value, HashFunctions, Traits>::find(const ValueType& value) const |
| - { |
| - return m_impl.find(value); |
| - } |
| - |
| - template<typename Value, typename HashFunctions, typename Traits> |
| - inline bool HashCountedSet<Value, HashFunctions, Traits>::contains(const ValueType& value) const |
| - { |
| - return m_impl.contains(value); |
| - } |
| - |
| - template<typename Value, typename HashFunctions, typename Traits> |
| - inline unsigned HashCountedSet<Value, HashFunctions, Traits>::count(const ValueType& value) const |
| - { |
| - return m_impl.get(value); |
| - } |
| - |
| - template<typename Value, typename HashFunctions, typename Traits> |
| - inline typename HashCountedSet<Value, HashFunctions, Traits>::AddResult HashCountedSet<Value, HashFunctions, Traits>::add(const ValueType &value) |
| + template<typename T, typename U, typename V, typename W> |
| + inline typename HashCountedSet<T, U, V, W>::AddResult HashCountedSet<T, U, V, W>::add(const ValueType &value) |
|
Mikhail
2014/04/30 14:00:35
nit: const ValueType&
|
| { |
| AddResult result = m_impl.add(value, 0); |
| ++result.storedValue->value; |
| return result; |
| } |
| - template<typename Value, typename HashFunctions, typename Traits> |
| - inline bool HashCountedSet<Value, HashFunctions, Traits>::remove(const ValueType& value) |
| - { |
| - return remove(find(value)); |
| - } |
| - |
| - template<typename Value, typename HashFunctions, typename Traits> |
| - inline bool HashCountedSet<Value, HashFunctions, Traits>::remove(iterator it) |
| + template<typename T, typename U, typename V, typename W> |
| + inline bool HashCountedSet<T, U, V, W>::remove(iterator it) |
| { |
| if (it == end()) |
| return false; |
| @@ -182,14 +112,8 @@ namespace WTF { |
| return true; |
| } |
| - template<typename Value, typename HashFunctions, typename Traits> |
| - inline void HashCountedSet<Value, HashFunctions, Traits>::removeAll(const ValueType& value) |
| - { |
| - removeAll(find(value)); |
| - } |
| - |
| - template<typename Value, typename HashFunctions, typename Traits> |
| - inline void HashCountedSet<Value, HashFunctions, Traits>::removeAll(iterator it) |
| + template<typename T, typename U, typename V, typename W> |
| + inline void HashCountedSet<T, U, V, W>::removeAll(iterator it) |
| { |
| if (it == end()) |
| return; |
| @@ -197,16 +121,10 @@ namespace WTF { |
| m_impl.remove(it); |
| } |
| - template<typename Value, typename HashFunctions, typename Traits> |
| - inline void HashCountedSet<Value, HashFunctions, Traits>::clear() |
| - { |
| - m_impl.clear(); |
| - } |
| - |
| - template<typename Value, typename HashFunctions, typename Traits, typename VectorType> |
| - inline void copyToVector(const HashCountedSet<Value, HashFunctions, Traits>& collection, VectorType& vector) |
| + template<typename T, typename U, typename V, typename W, typename VectorType> |
| + inline void copyToVector(const HashCountedSet<T, U, V, W>& collection, VectorType& vector) |
| { |
| - typedef typename HashCountedSet<Value, HashFunctions, Traits>::const_iterator iterator; |
| + typedef typename HashCountedSet<T, U, V, W>::const_iterator iterator; |
| vector.resize(collection.size()); |
| @@ -216,10 +134,10 @@ namespace WTF { |
| vector[i] = *it; |
| } |
| - template<typename Value, typename HashFunctions, typename Traits> |
| - inline void copyToVector(const HashCountedSet<Value, HashFunctions, Traits>& collection, Vector<Value>& vector) |
| + template<typename Value, typename HashFunctions, typename Traits, typename Allocator, size_t inlineCapacity, typename VectorAllocator> |
| + inline void copyToVector(const HashCountedSet<Value, HashFunctions, Traits, Allocator>& collection, Vector<Value, inlineCapacity, VectorAllocator>& vector) |
| { |
| - typedef typename HashCountedSet<Value, HashFunctions, Traits>::const_iterator iterator; |
| + typedef typename HashCountedSet<Value, HashFunctions, Traits, Allocator>::const_iterator iterator; |
| vector.resize(collection.size()); |