OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2005, 2006, 2007, 2008, 2011, 2012 Apple Inc. All rights reserv
ed. | 2 * Copyright (C) 2005, 2006, 2007, 2008, 2011, 2012 Apple Inc. All rights reserv
ed. |
3 * Copyright (C) 2011, Benjamin Poulain <ikipou@gmail.com> | 3 * Copyright (C) 2011, Benjamin Poulain <ikipou@gmail.com> |
4 * | 4 * |
5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
9 * | 9 * |
10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 | 293 |
294 template<typename HashArg> struct ListHashSetNodeHashFunctions { | 294 template<typename HashArg> struct ListHashSetNodeHashFunctions { |
295 template<typename T> static unsigned hash(const T& key) { return HashArg
::hash(key->m_value); } | 295 template<typename T> static unsigned hash(const T& key) { return HashArg
::hash(key->m_value); } |
296 template<typename T> static bool equal(const T& a, const T& b) { return
HashArg::equal(a->m_value, b->m_value); } | 296 template<typename T> static bool equal(const T& a, const T& b) { return
HashArg::equal(a->m_value, b->m_value); } |
297 static const bool safeToCompareToEmptyOrDeleted = false; | 297 static const bool safeToCompareToEmptyOrDeleted = false; |
298 }; | 298 }; |
299 | 299 |
300 template<typename ValueArg, size_t inlineCapacity, typename HashArg> class L
istHashSetIterator { | 300 template<typename ValueArg, size_t inlineCapacity, typename HashArg> class L
istHashSetIterator { |
301 private: | 301 private: |
302 typedef ListHashSet<ValueArg, inlineCapacity, HashArg> ListHashSetType; | 302 typedef ListHashSet<ValueArg, inlineCapacity, HashArg> ListHashSetType; |
303 typedef ListHashSetIterator<ValueArg, inlineCapacity, HashArg> iterator; | |
304 typedef ListHashSetConstIterator<ValueArg, inlineCapacity, HashArg> cons
t_iterator; | 303 typedef ListHashSetConstIterator<ValueArg, inlineCapacity, HashArg> cons
t_iterator; |
305 typedef ListHashSetNode<ValueArg, inlineCapacity> Node; | 304 typedef ListHashSetNode<ValueArg, inlineCapacity> Node; |
306 typedef ValueArg ValueType; | 305 typedef ValueArg ValueType; |
307 typedef ValueType& ReferenceType; | 306 typedef ValueType& ReferenceType; |
308 typedef ValueType* PointerType; | 307 typedef ValueType* PointerType; |
309 | 308 |
310 friend class ListHashSet<ValueArg, inlineCapacity, HashArg>; | 309 friend class ListHashSet<ValueArg, inlineCapacity, HashArg>; |
311 | 310 |
312 ListHashSetIterator(const ListHashSetType* set, Node* position) : m_iter
ator(set, position) { } | 311 ListHashSetIterator(const ListHashSetType* set, Node* position) : m_iter
ator(set, position) { } |
313 | 312 |
314 public: | 313 public: |
315 ListHashSetIterator() { } | 314 ListHashSetIterator() { } |
316 | 315 |
317 // default copy, assignment and destructor are OK | 316 // default copy, assignment and destructor are OK |
318 | 317 |
319 PointerType get() const { return const_cast<PointerType>(m_iterator.get(
)); } | 318 PointerType get() const { return const_cast<PointerType>(m_iterator.get(
)); } |
320 ReferenceType operator*() const { return *get(); } | 319 ReferenceType operator*() const { return *get(); } |
321 PointerType operator->() const { return get(); } | 320 PointerType operator->() const { return get(); } |
322 | 321 |
323 iterator& operator++() { ++m_iterator; return *this; } | 322 ListHashSetIterator& operator++() { ++m_iterator; return *this; } |
324 | 323 |
325 // postfix ++ intentionally omitted | 324 // postfix ++ intentionally omitted |
326 | 325 |
327 iterator& operator--() { --m_iterator; return *this; } | 326 ListHashSetIterator& operator--() { --m_iterator; return *this; } |
328 | 327 |
329 // postfix -- intentionally omitted | 328 // postfix -- intentionally omitted |
330 | 329 |
331 // Comparison. | 330 // Comparison. |
332 bool operator==(const iterator& other) const { return m_iterator == othe
r.m_iterator; } | 331 bool operator==(const ListHashSetIterator& other) const { return m_itera
tor == other.m_iterator; } |
333 bool operator!=(const iterator& other) const { return m_iterator != othe
r.m_iterator; } | 332 bool operator!=(const ListHashSetIterator& other) const { return m_itera
tor != other.m_iterator; } |
334 | 333 |
335 operator const_iterator() const { return m_iterator; } | 334 operator const_iterator() const { return m_iterator; } |
336 | 335 |
337 private: | 336 private: |
338 Node* node() { return m_iterator.node(); } | 337 Node* node() { return m_iterator.node(); } |
339 | 338 |
340 const_iterator m_iterator; | 339 const_iterator m_iterator; |
341 }; | 340 }; |
342 | 341 |
343 template<typename ValueArg, size_t inlineCapacity, typename HashArg> class L
istHashSetConstIterator { | 342 template<typename ValueArg, size_t inlineCapacity, typename HashArg> class L
istHashSetConstIterator { |
344 private: | 343 private: |
345 typedef ListHashSet<ValueArg, inlineCapacity, HashArg> ListHashSetType; | 344 typedef ListHashSet<ValueArg, inlineCapacity, HashArg> ListHashSetType; |
346 typedef ListHashSetIterator<ValueArg, inlineCapacity, HashArg> iterator; | |
347 typedef ListHashSetConstIterator<ValueArg, inlineCapacity, HashArg> cons
t_iterator; | 345 typedef ListHashSetConstIterator<ValueArg, inlineCapacity, HashArg> cons
t_iterator; |
348 typedef ListHashSetNode<ValueArg, inlineCapacity> Node; | 346 typedef ListHashSetNode<ValueArg, inlineCapacity> Node; |
349 typedef ValueArg ValueType; | 347 typedef ValueArg ValueType; |
350 typedef const ValueType& ReferenceType; | 348 typedef const ValueType& ReferenceType; |
351 typedef const ValueType* PointerType; | 349 typedef const ValueType* PointerType; |
352 | 350 |
353 friend class ListHashSet<ValueArg, inlineCapacity, HashArg>; | 351 friend class ListHashSet<ValueArg, inlineCapacity, HashArg>; |
354 friend class ListHashSetIterator<ValueArg, inlineCapacity, HashArg>; | 352 friend class ListHashSetIterator<ValueArg, inlineCapacity, HashArg>; |
355 | 353 |
356 ListHashSetConstIterator(const ListHashSetType* set, Node* position) | 354 ListHashSetConstIterator(const ListHashSetType* set, Node* position) |
(...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
939 inline ListHashSetIterator<T, inlineCapacity, U> ListHashSet<T, inlineCapaci
ty, U>::makeIterator(Node* position) | 937 inline ListHashSetIterator<T, inlineCapacity, U> ListHashSet<T, inlineCapaci
ty, U>::makeIterator(Node* position) |
940 { | 938 { |
941 return ListHashSetIterator<T, inlineCapacity, U>(this, position); | 939 return ListHashSetIterator<T, inlineCapacity, U>(this, position); |
942 } | 940 } |
943 | 941 |
944 template<typename T, size_t inlineCapacity, typename U> | 942 template<typename T, size_t inlineCapacity, typename U> |
945 inline ListHashSetConstIterator<T, inlineCapacity, U> ListHashSet<T, inlineC
apacity, U>::makeConstIterator(Node* position) const | 943 inline ListHashSetConstIterator<T, inlineCapacity, U> ListHashSet<T, inlineC
apacity, U>::makeConstIterator(Node* position) const |
946 { | 944 { |
947 return ListHashSetConstIterator<T, inlineCapacity, U>(this, position); | 945 return ListHashSetConstIterator<T, inlineCapacity, U>(this, position); |
948 } | 946 } |
| 947 |
949 template<bool, typename ValueType, typename HashTableType> | 948 template<bool, typename ValueType, typename HashTableType> |
950 void deleteAllValues(HashTableType& collection) | 949 void deleteAllValues(HashTableType& collection) |
951 { | 950 { |
952 typedef typename HashTableType::const_iterator iterator; | 951 typedef typename HashTableType::const_iterator iterator; |
953 iterator end = collection.end(); | 952 iterator end = collection.end(); |
954 for (iterator it = collection.begin(); it != end; ++it) | 953 for (iterator it = collection.begin(); it != end; ++it) |
955 delete (*it)->m_value; | 954 delete (*it)->m_value; |
956 } | 955 } |
957 | 956 |
| 957 // Warning: After and while calling this you have a collection with deleted |
| 958 // pointers. Consider using a smart pointer like OwnPtr and calling clear() |
| 959 // instead. |
958 template<typename T, size_t inlineCapacity, typename U> | 960 template<typename T, size_t inlineCapacity, typename U> |
959 inline void deleteAllValues(const ListHashSet<T, inlineCapacity, U>& collect
ion) | 961 inline void deleteAllValues(const ListHashSet<T, inlineCapacity, U>& collect
ion) |
960 { | 962 { |
961 deleteAllValues<true, typename ListHashSet<T, inlineCapacity, U>::ValueT
ype>(collection.m_impl); | 963 deleteAllValues<true, typename ListHashSet<T, inlineCapacity, U>::ValueT
ype>(collection.m_impl); |
962 } | 964 } |
963 | 965 |
964 } // namespace WTF | 966 } // namespace WTF |
965 | 967 |
966 using WTF::ListHashSet; | 968 using WTF::ListHashSet; |
967 | 969 |
968 #endif /* WTF_ListHashSet_h */ | 970 #endif /* WTF_ListHashSet_h */ |
OLD | NEW |