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) 2008 David Levin <levin@chromium.org> | 3 * Copyright (C) 2008 David Levin <levin@chromium.org> |
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 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 } | 197 } |
198 bool operator==(const iterator& other) const | 198 bool operator==(const iterator& other) const |
199 { | 199 { |
200 return *this == static_cast<const_iterator>(other); | 200 return *this == static_cast<const_iterator>(other); |
201 } | 201 } |
202 bool operator!=(const iterator& other) const | 202 bool operator!=(const iterator& other) const |
203 { | 203 { |
204 return *this != static_cast<const_iterator>(other); | 204 return *this != static_cast<const_iterator>(other); |
205 } | 205 } |
206 | 206 |
| 207 std::ostream& printTo(std::ostream& stream) const |
| 208 { |
| 209 if (m_position == m_endPosition) |
| 210 return stream << "iterator representing <end>"; |
| 211 // TODO(tkent): Change |m_position| to |*m_position| to show the |
| 212 // pointed object. It requires a lot of new stream printer functions. |
| 213 return stream << "iterator pointing to " << m_position; |
| 214 } |
| 215 |
207 private: | 216 private: |
208 PointerType m_position; | 217 PointerType m_position; |
209 PointerType m_endPosition; | 218 PointerType m_endPosition; |
210 #if ENABLE(ASSERT) | 219 #if ENABLE(ASSERT) |
211 const HashTableType* m_container; | 220 const HashTableType* m_container; |
212 int64_t m_containerModifications; | 221 int64_t m_containerModifications; |
213 #endif | 222 #endif |
214 }; | 223 }; |
215 | 224 |
| 225 template <typename Key, typename Value, typename Extractor, typename Hash, typen
ame Traits, typename KeyTraits, typename Allocator> |
| 226 std::ostream& operator<<(std::ostream& stream, const HashTableConstIterator<Key,
Value, Extractor, Hash, Traits, KeyTraits, Allocator>& iterator) |
| 227 { |
| 228 return iterator.printTo(stream); |
| 229 } |
| 230 |
216 template <typename Key, typename Value, typename Extractor, typename HashFunctio
ns, typename Traits, typename KeyTraits, typename Allocator> | 231 template <typename Key, typename Value, typename Extractor, typename HashFunctio
ns, typename Traits, typename KeyTraits, typename Allocator> |
217 class HashTableIterator final { | 232 class HashTableIterator final { |
218 DISALLOW_NEW(); | 233 DISALLOW_NEW(); |
219 private: | 234 private: |
220 typedef HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyTraits, A
llocator> HashTableType; | 235 typedef HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyTraits, A
llocator> HashTableType; |
221 typedef HashTableIterator<Key, Value, Extractor, HashFunctions, Traits, KeyT
raits, Allocator> iterator; | 236 typedef HashTableIterator<Key, Value, Extractor, HashFunctions, Traits, KeyT
raits, Allocator> iterator; |
222 typedef HashTableConstIterator<Key, Value, Extractor, HashFunctions, Traits,
KeyTraits, Allocator> const_iterator; | 237 typedef HashTableConstIterator<Key, Value, Extractor, HashFunctions, Traits,
KeyTraits, Allocator> const_iterator; |
223 typedef Value ValueType; | 238 typedef Value ValueType; |
224 typedef typename Traits::IteratorGetType GetType; | 239 typedef typename Traits::IteratorGetType GetType; |
225 typedef ValueType* PointerType; | 240 typedef ValueType* PointerType; |
(...skipping 16 matching lines...) Expand all Loading... |
242 | 257 |
243 // postfix ++ intentionally omitted | 258 // postfix ++ intentionally omitted |
244 | 259 |
245 // Comparison. | 260 // Comparison. |
246 bool operator==(const iterator& other) const { return m_iterator == other.m_
iterator; } | 261 bool operator==(const iterator& other) const { return m_iterator == other.m_
iterator; } |
247 bool operator!=(const iterator& other) const { return m_iterator != other.m_
iterator; } | 262 bool operator!=(const iterator& other) const { return m_iterator != other.m_
iterator; } |
248 bool operator==(const const_iterator& other) const { return m_iterator == ot
her; } | 263 bool operator==(const const_iterator& other) const { return m_iterator == ot
her; } |
249 bool operator!=(const const_iterator& other) const { return m_iterator != ot
her; } | 264 bool operator!=(const const_iterator& other) const { return m_iterator != ot
her; } |
250 | 265 |
251 operator const_iterator() const { return m_iterator; } | 266 operator const_iterator() const { return m_iterator; } |
| 267 std::ostream& printTo(std::ostream& stream) const { return m_iterator.printT
o(stream); } |
252 | 268 |
253 private: | 269 private: |
254 const_iterator m_iterator; | 270 const_iterator m_iterator; |
255 }; | 271 }; |
256 | 272 |
| 273 template <typename Key, typename Value, typename Extractor, typename Hash, typen
ame Traits, typename KeyTraits, typename Allocator> |
| 274 std::ostream& operator<<(std::ostream& stream, const HashTableIterator<Key, Valu
e, Extractor, Hash, Traits, KeyTraits, Allocator>& iterator) |
| 275 { |
| 276 return iterator.printTo(stream); |
| 277 } |
| 278 |
257 using std::swap; | 279 using std::swap; |
258 | 280 |
259 template <typename T, typename Allocator, bool enterGCForbiddenScope> struct Mov
er { | 281 template <typename T, typename Allocator, bool enterGCForbiddenScope> struct Mov
er { |
260 STATIC_ONLY(Mover); | 282 STATIC_ONLY(Mover); |
261 static void move(T&& from, T& to) | 283 static void move(T&& from, T& to) |
262 { | 284 { |
263 to.~T(); | 285 to.~T(); |
264 new (NotNull, &to) T(std::move(from)); | 286 new (NotNull, &to) T(std::move(from)); |
265 } | 287 } |
266 }; | 288 }; |
(...skipping 1186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1453 GetType get() const { return const_cast<GetType>(SourceGetType(m_impl.get())
); } | 1475 GetType get() const { return const_cast<GetType>(SourceGetType(m_impl.get())
); } |
1454 typename Traits::IteratorConstReferenceType operator*() const { return Trait
s::getToReferenceConstConversion(get()); } | 1476 typename Traits::IteratorConstReferenceType operator*() const { return Trait
s::getToReferenceConstConversion(get()); } |
1455 GetType operator->() const { return get(); } | 1477 GetType operator->() const { return get(); } |
1456 | 1478 |
1457 HashTableConstIteratorAdapter& operator++() { ++m_impl; return *this; } | 1479 HashTableConstIteratorAdapter& operator++() { ++m_impl; return *this; } |
1458 // postfix ++ intentionally omitted | 1480 // postfix ++ intentionally omitted |
1459 | 1481 |
1460 typename HashTableType::const_iterator m_impl; | 1482 typename HashTableType::const_iterator m_impl; |
1461 }; | 1483 }; |
1462 | 1484 |
| 1485 template <typename HashTable, typename Traits> |
| 1486 std::ostream& operator<<(std::ostream& stream, const HashTableConstIteratorAdapt
er<HashTable, Traits>& iterator) |
| 1487 { |
| 1488 return stream << iterator.m_impl; |
| 1489 } |
| 1490 |
1463 template <typename HashTableType, typename Traits> struct HashTableIteratorAdapt
er { | 1491 template <typename HashTableType, typename Traits> struct HashTableIteratorAdapt
er { |
1464 STACK_ALLOCATED(); | 1492 STACK_ALLOCATED(); |
1465 typedef typename Traits::IteratorGetType GetType; | 1493 typedef typename Traits::IteratorGetType GetType; |
1466 typedef typename HashTableType::ValueTraits::IteratorGetType SourceGetType; | 1494 typedef typename HashTableType::ValueTraits::IteratorGetType SourceGetType; |
1467 | 1495 |
1468 HashTableIteratorAdapter() {} | 1496 HashTableIteratorAdapter() {} |
1469 HashTableIteratorAdapter(const typename HashTableType::iterator& impl) : m_i
mpl(impl) {} | 1497 HashTableIteratorAdapter(const typename HashTableType::iterator& impl) : m_i
mpl(impl) {} |
1470 | 1498 |
1471 GetType get() const { return const_cast<GetType>(SourceGetType(m_impl.get())
); } | 1499 GetType get() const { return const_cast<GetType>(SourceGetType(m_impl.get())
); } |
1472 typename Traits::IteratorReferenceType operator*() const { return Traits::ge
tToReferenceConversion(get()); } | 1500 typename Traits::IteratorReferenceType operator*() const { return Traits::ge
tToReferenceConversion(get()); } |
1473 GetType operator->() const { return get(); } | 1501 GetType operator->() const { return get(); } |
1474 | 1502 |
1475 HashTableIteratorAdapter& operator++() { ++m_impl; return *this; } | 1503 HashTableIteratorAdapter& operator++() { ++m_impl; return *this; } |
1476 // postfix ++ intentionally omitted | 1504 // postfix ++ intentionally omitted |
1477 | 1505 |
1478 operator HashTableConstIteratorAdapter<HashTableType, Traits>() | 1506 operator HashTableConstIteratorAdapter<HashTableType, Traits>() |
1479 { | 1507 { |
1480 typename HashTableType::const_iterator i = m_impl; | 1508 typename HashTableType::const_iterator i = m_impl; |
1481 return i; | 1509 return i; |
1482 } | 1510 } |
1483 | 1511 |
1484 typename HashTableType::iterator m_impl; | 1512 typename HashTableType::iterator m_impl; |
1485 }; | 1513 }; |
1486 | 1514 |
| 1515 template <typename HashTable, typename Traits> |
| 1516 std::ostream& operator<<(std::ostream& stream, const HashTableIteratorAdapter<Ha
shTable, Traits>& iterator) |
| 1517 { |
| 1518 return stream << iterator.m_impl; |
| 1519 } |
| 1520 |
1487 template <typename T, typename U> | 1521 template <typename T, typename U> |
1488 inline bool operator==(const HashTableConstIteratorAdapter<T, U>& a, const HashT
ableConstIteratorAdapter<T, U>& b) | 1522 inline bool operator==(const HashTableConstIteratorAdapter<T, U>& a, const HashT
ableConstIteratorAdapter<T, U>& b) |
1489 { | 1523 { |
1490 return a.m_impl == b.m_impl; | 1524 return a.m_impl == b.m_impl; |
1491 } | 1525 } |
1492 | 1526 |
1493 template <typename T, typename U> | 1527 template <typename T, typename U> |
1494 inline bool operator!=(const HashTableConstIteratorAdapter<T, U>& a, const HashT
ableConstIteratorAdapter<T, U>& b) | 1528 inline bool operator!=(const HashTableConstIteratorAdapter<T, U>& a, const HashT
ableConstIteratorAdapter<T, U>& b) |
1495 { | 1529 { |
1496 return a.m_impl != b.m_impl; | 1530 return a.m_impl != b.m_impl; |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1542 CollectionIterator end(toBeRemoved.end()); | 1576 CollectionIterator end(toBeRemoved.end()); |
1543 for (CollectionIterator it(toBeRemoved.begin()); it != end; ++it) | 1577 for (CollectionIterator it(toBeRemoved.begin()); it != end; ++it) |
1544 collection.remove(*it); | 1578 collection.remove(*it); |
1545 } | 1579 } |
1546 | 1580 |
1547 } // namespace WTF | 1581 } // namespace WTF |
1548 | 1582 |
1549 #include "wtf/HashIterators.h" | 1583 #include "wtf/HashIterators.h" |
1550 | 1584 |
1551 #endif // WTF_HashTable_h | 1585 #endif // WTF_HashTable_h |
OLD | NEW |