/* * Copyright (C) 2005, 2006, 2008 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * */ #ifndef WTF_HashCountedSet_h #define WTF_HashCountedSet_h #include "Assertions.h" #include "FastAllocBase.h" #include "HashMap.h" #include "Vector.h" namespace WTF { template::Hash, typename Traits = HashTraits > class HashCountedSet : public FastAllocBase { private: typedef HashMap ImplType; public: typedef Value ValueType; typedef typename ImplType::iterator iterator; typedef typename ImplType::const_iterator const_iterator; HashCountedSet() {} int size() const; int capacity() const; bool isEmpty() const; // iterators iterate over pairs of values and counts iterator begin(); iterator end(); const_iterator begin() const; const_iterator end() const; iterator find(const ValueType&); const_iterator find(const ValueType&) const; bool contains(const ValueType&) const; unsigned count(const ValueType&) const; // increases the count if an equal value is already present // the return value is a pair of an interator to the new value's location, // and a bool that is true if an new entry was added std::pair add(const ValueType&); // reduces the count of the value, and removes it if count // goes down to zero void remove(const ValueType&); void remove(iterator); // removes the value, regardless of its count void removeAll(iterator); void removeAll(const ValueType&); // clears the whole set void clear(); private: ImplType m_impl; }; template inline int HashCountedSet::size() const { return m_impl.size(); } template inline int HashCountedSet::capacity() const { return m_impl.capacity(); } template inline bool HashCountedSet::isEmpty() const { return size() == 0; } template inline typename HashCountedSet::iterator HashCountedSet::begin() { return m_impl.begin(); } template inline typename HashCountedSet::iterator HashCountedSet::end() { return m_impl.end(); } template inline typename HashCountedSet::const_iterator HashCountedSet::begin() const { return m_impl.begin(); } template inline typename HashCountedSet::const_iterator HashCountedSet::end() const { return m_impl.end(); } template inline typename HashCountedSet::iterator HashCountedSet::find(const ValueType& value) { return m_impl.find(value); } template inline typename HashCountedSet::const_iterator HashCountedSet::find(const ValueType& value) const { return m_impl.find(value); } template inline bool HashCountedSet::contains(const ValueType& value) const { return m_impl.contains(value); } template inline unsigned HashCountedSet::count(const ValueType& value) const { return m_impl.get(value); } template inline std::pair::iterator, bool> HashCountedSet::add(const ValueType &value) { pair result = m_impl.add(value, 0); ++result.first->second; return result; } template inline void HashCountedSet::remove(const ValueType& value) { remove(find(value)); } template inline void HashCountedSet::remove(iterator it) { if (it == end()) return; unsigned oldVal = it->second; ASSERT(oldVal != 0); unsigned newVal = oldVal - 1; if (newVal == 0) m_impl.remove(it); else it->second = newVal; } template inline void HashCountedSet::removeAll(const ValueType& value) { removeAll(find(value)); } template inline void HashCountedSet::removeAll(iterator it) { if (it == end()) return; m_impl.remove(it); } template inline void HashCountedSet::clear() { m_impl.clear(); } template inline void copyToVector(const HashCountedSet& collection, VectorType& vector) { typedef typename HashCountedSet::const_iterator iterator; vector.resize(collection.size()); iterator it = collection.begin(); iterator end = collection.end(); for (unsigned i = 0; it != end; ++it, ++i) vector[i] = *it; } template inline void copyToVector(const HashCountedSet& collection, Vector& vector) { typedef typename HashCountedSet::const_iterator iterator; vector.resize(collection.size()); iterator it = collection.begin(); iterator end = collection.end(); for (unsigned i = 0; it != end; ++it, ++i) vector[i] = (*it).first; } } // namespace khtml using WTF::HashCountedSet; #endif /* WTF_HashCountedSet_h */