diff -r 000000000000 -r 4f2f89ce4247 JavaScriptCore/wtf/HashSet.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/JavaScriptCore/wtf/HashSet.h Fri Sep 17 09:02:29 2010 +0300 @@ -0,0 +1,259 @@ +/* + * Copyright (C) 2005, 2006, 2007, 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_HashSet_h +#define WTF_HashSet_h + +#include "FastAllocBase.h" +#include "HashTable.h" + +namespace WTF { + + template class HashSet; + template + void deleteAllValues(const HashSet&); + template + void fastDeleteAllValues(const HashSet&); + + template struct IdentityExtractor; + + template::Hash, + typename TraitsArg = HashTraits > class HashSet : public FastAllocBase { + private: + typedef HashArg HashFunctions; + typedef TraitsArg ValueTraits; + + public: + typedef typename ValueTraits::TraitType ValueType; + + private: + typedef HashTable, + HashFunctions, ValueTraits, ValueTraits> HashTableType; + + public: + typedef HashTableConstIteratorAdapter iterator; + typedef HashTableConstIteratorAdapter const_iterator; + + void swap(HashSet&); + + int size() const; + int capacity() const; + bool isEmpty() const; + + iterator begin() const; + iterator end() const; + + iterator find(const ValueType&) const; + bool contains(const ValueType&) const; + + // An alternate version of find() that finds the object by hashing and comparing + // with some other type, to avoid the cost of type conversion. HashTranslator + // must have the following function members: + // static unsigned hash(const T&); + // static bool equal(const ValueType&, const T&); + template iterator find(const T&) const; + template bool contains(const T&) const; + + // 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. + pair add(const ValueType&); + + // An alternate version of add() that finds the object by hashing and comparing + // with some other type, to avoid the cost of type conversion if the object is already + // in the table. HashTranslator must have the following function members: + // static unsigned hash(const T&); + // static bool equal(const ValueType&, const T&); + // static translate(ValueType&, const T&, unsigned hashCode); + template pair add(const T&); + + void remove(const ValueType&); + void remove(iterator); + void clear(); + + private: + friend void deleteAllValues<>(const HashSet&); + friend void fastDeleteAllValues<>(const HashSet&); + + HashTableType m_impl; + }; + + template struct IdentityExtractor { + static const T& extract(const T& t) { return t; } + }; + + template + struct HashSetTranslatorAdapter { + static unsigned hash(const T& key) { return Translator::hash(key); } + static bool equal(const ValueType& a, const T& b) { return Translator::equal(a, b); } + static void translate(ValueType& location, const T& key, const T&, unsigned hashCode) + { + Translator::translate(location, key, hashCode); + } + }; + + template + inline void HashSet::swap(HashSet& other) + { + m_impl.swap(other.m_impl); + } + + template + inline int HashSet::size() const + { + return m_impl.size(); + } + + template + inline int HashSet::capacity() const + { + return m_impl.capacity(); + } + + template + inline bool HashSet::isEmpty() const + { + return m_impl.isEmpty(); + } + + template + inline typename HashSet::iterator HashSet::begin() const + { + return m_impl.begin(); + } + + template + inline typename HashSet::iterator HashSet::end() const + { + return m_impl.end(); + } + + template + inline typename HashSet::iterator HashSet::find(const ValueType& value) const + { + return m_impl.find(value); + } + + template + inline bool HashSet::contains(const ValueType& value) const + { + return m_impl.contains(value); + } + + template + template + typename HashSet::iterator + inline HashSet::find(const T& value) const + { + typedef HashSetTranslatorAdapter Adapter; + return m_impl.template find(value); + } + + template + template + inline bool HashSet::contains(const T& value) const + { + typedef HashSetTranslatorAdapter Adapter; + return m_impl.template contains(value); + } + + template + pair::iterator, bool> HashSet::add(const ValueType& value) + { + return m_impl.add(value); + } + + template + template + pair::iterator, bool> + HashSet::add(const T& value) + { + typedef HashSetTranslatorAdapter Adapter; + return m_impl.template addPassingHashCode(value, value); + } + + template + inline void HashSet::remove(iterator it) + { + if (it.m_impl == m_impl.end()) + return; + m_impl.internalCheckTableConsistency(); + m_impl.removeWithoutEntryConsistencyCheck(it.m_impl); + } + + template + inline void HashSet::remove(const ValueType& value) + { + remove(find(value)); + } + + template + inline void HashSet::clear() + { + m_impl.clear(); + } + + template + void deleteAllValues(HashTableType& collection) + { + typedef typename HashTableType::const_iterator iterator; + iterator end = collection.end(); + for (iterator it = collection.begin(); it != end; ++it) + delete *it; + } + + template + inline void deleteAllValues(const HashSet& collection) + { + deleteAllValues::ValueType>(collection.m_impl); + } + + template + void fastDeleteAllValues(HashTableType& collection) + { + typedef typename HashTableType::const_iterator iterator; + iterator end = collection.end(); + for (iterator it = collection.begin(); it != end; ++it) + fastDelete(*it); + } + + template + inline void fastDeleteAllValues(const HashSet& collection) + { + fastDeleteAllValues::ValueType>(collection.m_impl); + } + + template + inline void copyToVector(const HashSet& collection, W& vector) + { + typedef typename HashSet::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; + } + +} // namespace WTF + +using WTF::HashSet; + +#endif /* WTF_HashSet_h */