• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  *
19  */
20 
21 #ifndef WTF_HashSet_h
22 #define WTF_HashSet_h
23 
24 #include "FastAllocBase.h"
25 #include "HashTable.h"
26 
27 namespace WTF {
28 
29     template<typename Value, typename HashFunctions, typename Traits> class HashSet;
30     template<typename Value, typename HashFunctions, typename Traits>
31     void deleteAllValues(const HashSet<Value, HashFunctions, Traits>&);
32     template<typename Value, typename HashFunctions, typename Traits>
33     void fastDeleteAllValues(const HashSet<Value, HashFunctions, Traits>&);
34 
35     template<typename T> struct IdentityExtractor;
36 
37     template<typename ValueArg, typename HashArg = typename DefaultHash<ValueArg>::Hash,
38         typename TraitsArg = HashTraits<ValueArg> > class HashSet {
39         WTF_MAKE_FAST_ALLOCATED;
40     private:
41         typedef HashArg HashFunctions;
42         typedef TraitsArg ValueTraits;
43 
44     public:
45         typedef typename ValueTraits::TraitType ValueType;
46 
47     private:
48         typedef HashTable<ValueType, ValueType, IdentityExtractor<ValueType>,
49             HashFunctions, ValueTraits, ValueTraits> HashTableType;
50 
51     public:
52         typedef HashTableConstIteratorAdapter<HashTableType, ValueType> iterator;
53         typedef HashTableConstIteratorAdapter<HashTableType, ValueType> const_iterator;
54 
55         void swap(HashSet&);
56 
57         int size() const;
58         int capacity() const;
59         bool isEmpty() const;
60 
61         iterator begin() const;
62         iterator end() const;
63 
64         iterator find(const ValueType&) const;
65         bool contains(const ValueType&) const;
66 
67         // An alternate version of find() that finds the object by hashing and comparing
68         // with some other type, to avoid the cost of type conversion. HashTranslator
69         // must have the following function members:
70         //   static unsigned hash(const T&);
71         //   static bool equal(const ValueType&, const T&);
72         template<typename T, typename HashTranslator> iterator find(const T&) const;
73         template<typename T, typename HashTranslator> bool contains(const T&) const;
74 
75         // The return value is a pair of an interator to the new value's location,
76         // and a bool that is true if an new entry was added.
77         pair<iterator, bool> add(const ValueType&);
78 
79         // An alternate version of add() that finds the object by hashing and comparing
80         // with some other type, to avoid the cost of type conversion if the object is already
81         // in the table. HashTranslator must have the following function members:
82         //   static unsigned hash(const T&);
83         //   static bool equal(const ValueType&, const T&);
84         //   static translate(ValueType&, const T&, unsigned hashCode);
85         template<typename T, typename HashTranslator> pair<iterator, bool> add(const T&);
86 
87         void remove(const ValueType&);
88         void remove(iterator);
89         void clear();
90 
91     private:
92         friend void deleteAllValues<>(const HashSet&);
93         friend void fastDeleteAllValues<>(const HashSet&);
94 
95         HashTableType m_impl;
96     };
97 
98     template<typename T> struct IdentityExtractor {
extractIdentityExtractor99         static const T& extract(const T& t) { return t; }
100     };
101 
102     template<typename ValueType, typename ValueTraits, typename T, typename Translator>
103     struct HashSetTranslatorAdapter {
hashHashSetTranslatorAdapter104         static unsigned hash(const T& key) { return Translator::hash(key); }
equalHashSetTranslatorAdapter105         static bool equal(const ValueType& a, const T& b) { return Translator::equal(a, b); }
translateHashSetTranslatorAdapter106         static void translate(ValueType& location, const T& key, const T&, unsigned hashCode)
107         {
108             Translator::translate(location, key, hashCode);
109         }
110     };
111 
112     template<typename T, typename U, typename V>
swap(HashSet & other)113     inline void HashSet<T, U, V>::swap(HashSet& other)
114     {
115         m_impl.swap(other.m_impl);
116     }
117 
118     template<typename T, typename U, typename V>
size()119     inline int HashSet<T, U, V>::size() const
120     {
121         return m_impl.size();
122     }
123 
124     template<typename T, typename U, typename V>
capacity()125     inline int HashSet<T, U, V>::capacity() const
126     {
127         return m_impl.capacity();
128     }
129 
130     template<typename T, typename U, typename V>
isEmpty()131     inline bool HashSet<T, U, V>::isEmpty() const
132     {
133         return m_impl.isEmpty();
134     }
135 
136     template<typename T, typename U, typename V>
begin()137     inline typename HashSet<T, U, V>::iterator HashSet<T, U, V>::begin() const
138     {
139         return m_impl.begin();
140     }
141 
142     template<typename T, typename U, typename V>
end()143     inline typename HashSet<T, U, V>::iterator HashSet<T, U, V>::end() const
144     {
145         return m_impl.end();
146     }
147 
148     template<typename T, typename U, typename V>
find(const ValueType & value)149     inline typename HashSet<T, U, V>::iterator HashSet<T, U, V>::find(const ValueType& value) const
150     {
151         return m_impl.find(value);
152     }
153 
154     template<typename T, typename U, typename V>
contains(const ValueType & value)155     inline bool HashSet<T, U, V>::contains(const ValueType& value) const
156     {
157         return m_impl.contains(value);
158     }
159 
160     template<typename Value, typename HashFunctions, typename Traits>
161     template<typename T, typename HashTranslator>
162     typename HashSet<Value, HashFunctions, Traits>::iterator
find(const T & value)163     inline HashSet<Value, HashFunctions, Traits>::find(const T& value) const
164     {
165         typedef HashSetTranslatorAdapter<ValueType, ValueTraits, T, HashTranslator> Adapter;
166         return m_impl.template find<T, Adapter>(value);
167     }
168 
169     template<typename Value, typename HashFunctions, typename Traits>
170     template<typename T, typename HashTranslator>
contains(const T & value)171     inline bool HashSet<Value, HashFunctions, Traits>::contains(const T& value) const
172     {
173         typedef HashSetTranslatorAdapter<ValueType, ValueTraits, T, HashTranslator> Adapter;
174         return m_impl.template contains<T, Adapter>(value);
175     }
176 
177     template<typename T, typename U, typename V>
add(const ValueType & value)178     inline pair<typename HashSet<T, U, V>::iterator, bool> HashSet<T, U, V>::add(const ValueType& value)
179     {
180         return m_impl.add(value);
181     }
182 
183     template<typename Value, typename HashFunctions, typename Traits>
184     template<typename T, typename HashTranslator>
185     inline pair<typename HashSet<Value, HashFunctions, Traits>::iterator, bool>
add(const T & value)186     HashSet<Value, HashFunctions, Traits>::add(const T& value)
187     {
188         typedef HashSetTranslatorAdapter<ValueType, ValueTraits, T, HashTranslator> Adapter;
189         return m_impl.template addPassingHashCode<T, T, Adapter>(value, value);
190     }
191 
192     template<typename T, typename U, typename V>
remove(iterator it)193     inline void HashSet<T, U, V>::remove(iterator it)
194     {
195         if (it.m_impl == m_impl.end())
196             return;
197         m_impl.internalCheckTableConsistency();
198         m_impl.removeWithoutEntryConsistencyCheck(it.m_impl);
199     }
200 
201     template<typename T, typename U, typename V>
remove(const ValueType & value)202     inline void HashSet<T, U, V>::remove(const ValueType& value)
203     {
204         remove(find(value));
205     }
206 
207     template<typename T, typename U, typename V>
clear()208     inline void HashSet<T, U, V>::clear()
209     {
210         m_impl.clear();
211     }
212 
213     template<typename ValueType, typename HashTableType>
deleteAllValues(HashTableType & collection)214     void deleteAllValues(HashTableType& collection)
215     {
216         typedef typename HashTableType::const_iterator iterator;
217         iterator end = collection.end();
218         for (iterator it = collection.begin(); it != end; ++it)
219             delete *it;
220     }
221 
222     template<typename T, typename U, typename V>
deleteAllValues(const HashSet<T,U,V> & collection)223     inline void deleteAllValues(const HashSet<T, U, V>& collection)
224     {
225         deleteAllValues<typename HashSet<T, U, V>::ValueType>(collection.m_impl);
226     }
227 
228     template<typename ValueType, typename HashTableType>
fastDeleteAllValues(HashTableType & collection)229     void fastDeleteAllValues(HashTableType& collection)
230     {
231         typedef typename HashTableType::const_iterator iterator;
232         iterator end = collection.end();
233         for (iterator it = collection.begin(); it != end; ++it)
234             fastDelete(*it);
235     }
236 
237     template<typename T, typename U, typename V>
fastDeleteAllValues(const HashSet<T,U,V> & collection)238     inline void fastDeleteAllValues(const HashSet<T, U, V>& collection)
239     {
240         fastDeleteAllValues<typename HashSet<T, U, V>::ValueType>(collection.m_impl);
241     }
242 
243     template<typename T, typename U, typename V, typename W>
copyToVector(const HashSet<T,U,V> & collection,W & vector)244     inline void copyToVector(const HashSet<T, U, V>& collection, W& vector)
245     {
246         typedef typename HashSet<T, U, V>::const_iterator iterator;
247 
248         vector.resize(collection.size());
249 
250         iterator it = collection.begin();
251         iterator end = collection.end();
252         for (unsigned i = 0; it != end; ++it, ++i)
253             vector[i] = *it;
254     }
255 
256 } // namespace WTF
257 
258 using WTF::HashSet;
259 
260 #endif /* WTF_HashSet_h */
261