// -*- mode: c++; c-basic-offset: 4 -*- /* * This file is part of the KDE libraries * Copyright (C) 2005 Apple Computer, Inc. * * 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 "HashMap.h" namespace WTF { template::Hash, typename Traits = HashTraits > class HashCountedSet { 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& value); const_iterator find(const ValueType& value) const; bool contains(const ValueType& value) const; unsigned count(const ValueType& value) 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 &value); // reduces the count of the value, and removes it if count // goes down to zero void remove(const ValueType& value); void remove(iterator it); 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::clear() { m_impl.clear(); } } // namespace khtml using WTF::HashCountedSet; #endif /* WTF_HashCountedSet_h */