| Index: Source/wtf/HashCountedSet.h
|
| diff --git a/Source/wtf/HashCountedSet.h b/Source/wtf/HashCountedSet.h
|
| index 18dbd321079c2746d64cb984e8af09b73d6f0aab..2f153ad60ea0b134648fa9b798fb9974821e4a2e 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)
|
| {
|
| 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());
|
|
|
|
|