OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
8 * | 8 * |
9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
120 const HashMapValuesProxy& values() const { return static_cast<const HashMapV aluesProxy&>(*this); } | 120 const HashMapValuesProxy& values() const { return static_cast<const HashMapV aluesProxy&>(*this); } |
121 | 121 |
122 iterator find(KeyPeekInType); | 122 iterator find(KeyPeekInType); |
123 const_iterator find(KeyPeekInType) const; | 123 const_iterator find(KeyPeekInType) const; |
124 bool contains(KeyPeekInType) const; | 124 bool contains(KeyPeekInType) const; |
125 MappedPeekType get(KeyPeekInType) const; | 125 MappedPeekType get(KeyPeekInType) const; |
126 | 126 |
127 // replaces value but not key if key is already present return value is a | 127 // replaces value but not key if key is already present return value is a |
128 // pair of the iterator to the key location, and a boolean that's true if a | 128 // pair of the iterator to the key location, and a boolean that's true if a |
129 // new value was actually added | 129 // new value was actually added |
130 AddResult set(KeyPeekInType, MappedPassInType); | 130 template <typename IncomingKeyType, typename IncomingMappedType> |
131 AddResult set(IncomingKeyType&&, IncomingMappedType&&); | |
131 | 132 |
132 // does nothing if key is already present return value is a pair of the | 133 // does nothing if key is already present return value is a pair of the |
133 // iterator to the key location, and a boolean that's true if a new value | 134 // iterator to the key location, and a boolean that's true if a new value |
134 // was actually added | 135 // was actually added |
135 AddResult add(KeyPeekInType, MappedPassInType); | 136 template <typename IncomingKeyType, typename IncomingMappedType> |
137 AddResult add(IncomingKeyType&&, IncomingMappedType&&); | |
136 | 138 |
137 void remove(KeyPeekInType); | 139 void remove(KeyPeekInType); |
138 void remove(iterator); | 140 void remove(iterator); |
139 void clear(); | 141 void clear(); |
140 template <typename Collection> | 142 template <typename Collection> |
141 void removeAll(const Collection& toBeRemoved) { WTF::removeAll(*this, toBeRe moved); } | 143 void removeAll(const Collection& toBeRemoved) { WTF::removeAll(*this, toBeRe moved); } |
142 | 144 |
143 MappedPassOutType take(KeyPeekInType); // efficient combination of get with remove | 145 MappedPassOutType take(KeyPeekInType); // efficient combination of get with remove |
144 | 146 |
145 // An alternate version of find() that finds the object by hashing and | 147 // An alternate version of find() that finds the object by hashing and |
(...skipping 13 matching lines...) Expand all Loading... | |
159 // static bool equal(const ValueType&, const T&); | 161 // static bool equal(const ValueType&, const T&); |
160 // static translate(ValueType&, const T&, unsigned hashCode); | 162 // static translate(ValueType&, const T&, unsigned hashCode); |
161 template <typename HashTranslator, typename T> AddResult add(const T&, Mappe dPassInType); | 163 template <typename HashTranslator, typename T> AddResult add(const T&, Mappe dPassInType); |
162 | 164 |
163 static bool isValidKey(KeyPeekInType); | 165 static bool isValidKey(KeyPeekInType); |
164 | 166 |
165 template <typename VisitorDispatcher> | 167 template <typename VisitorDispatcher> |
166 void trace(VisitorDispatcher visitor) { m_impl.trace(visitor); } | 168 void trace(VisitorDispatcher visitor) { m_impl.trace(visitor); } |
167 | 169 |
168 private: | 170 private: |
169 AddResult inlineAdd(KeyPeekInType, MappedPassInReferenceType); | 171 template <typename IncomingKeyType, typename IncomingMappedType> |
172 AddResult inlineAdd(IncomingKeyType&&, IncomingMappedType&&); | |
170 | 173 |
171 HashTableType m_impl; | 174 HashTableType m_impl; |
172 }; | 175 }; |
173 | 176 |
174 template <typename KeyArg, typename MappedArg, typename HashArg, typename KeyTra itsArg, typename MappedTraitsArg, typename Allocator> | 177 template <typename KeyArg, typename MappedArg, typename HashArg, typename KeyTra itsArg, typename MappedTraitsArg, typename Allocator> |
175 class HashMap<KeyArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg, Allocat or>::HashMapKeysProxy : | 178 class HashMap<KeyArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg, Allocat or>::HashMapKeysProxy : |
176 private HashMap<KeyArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg, A llocator> { | 179 private HashMap<KeyArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg, A llocator> { |
177 DISALLOW_NEW(); | 180 DISALLOW_NEW(); |
178 public: | 181 public: |
179 typedef HashMap<KeyArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg, A llocator> HashMapType; | 182 typedef HashMap<KeyArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg, A llocator> HashMapType; |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
257 { | 260 { |
258 return isHashTraitsEmptyValue<KeyTraits>(value.key); | 261 return isHashTraitsEmptyValue<KeyTraits>(value.key); |
259 } | 262 } |
260 }; | 263 }; |
261 | 264 |
262 template <typename ValueTraits, typename HashFunctions> | 265 template <typename ValueTraits, typename HashFunctions> |
263 struct HashMapTranslator { | 266 struct HashMapTranslator { |
264 STATIC_ONLY(HashMapTranslator); | 267 STATIC_ONLY(HashMapTranslator); |
265 template <typename T> static unsigned hash(const T& key) { return HashFuncti ons::hash(key); } | 268 template <typename T> static unsigned hash(const T& key) { return HashFuncti ons::hash(key); } |
266 template <typename T, typename U> static bool equal(const T& a, const U& b) { return HashFunctions::equal(a, b); } | 269 template <typename T, typename U> static bool equal(const T& a, const U& b) { return HashFunctions::equal(a, b); } |
267 template <typename T, typename U, typename V> static void translate(T& locat ion, const U& key, const V& mapped) | 270 template <typename T, typename U, typename V> static void translate(T& locat ion, U&& key, V&& mapped) |
268 { | 271 { |
269 location.key = key; | 272 location.key = std::forward<U>(key); |
270 ValueTraits::ValueTraits::store(mapped, location.value); | 273 ValueTraits::ValueTraits::store(std::forward<V>(mapped), location.value) ; |
271 } | 274 } |
272 }; | 275 }; |
273 | 276 |
274 template <typename ValueTraits, typename Translator> | 277 template <typename ValueTraits, typename Translator> |
275 struct HashMapTranslatorAdapter { | 278 struct HashMapTranslatorAdapter { |
276 STATIC_ONLY(HashMapTranslatorAdapter); | 279 STATIC_ONLY(HashMapTranslatorAdapter); |
277 template <typename T> static unsigned hash(const T& key) { return Translator ::hash(key); } | 280 template <typename T> static unsigned hash(const T& key) { return Translator ::hash(key); } |
278 template <typename T, typename U> static bool equal(const T& a, const U& b) { return Translator::equal(a, b); } | 281 template <typename T, typename U> static bool equal(const T& a, const U& b) { return Translator::equal(a, b); } |
279 template <typename T, typename U, typename V> static void translate(T& locat ion, const U& key, const V& mapped, unsigned hashCode) | 282 template <typename T, typename U, typename V> static void translate(T& locat ion, U&& key, V&& mapped, unsigned hashCode) |
280 { | 283 { |
281 Translator::translate(location.key, key, hashCode); | 284 Translator::translate(location.key, std::forward<U>(key), hashCode); |
282 ValueTraits::ValueTraits::store(mapped, location.value); | 285 ValueTraits::ValueTraits::store(std::forward<V>(mapped), location.value) ; |
283 } | 286 } |
284 }; | 287 }; |
285 | 288 |
286 template <typename T, typename U, typename V, typename W, typename X, typename Y > | 289 template <typename T, typename U, typename V, typename W, typename X, typename Y > |
287 inline unsigned HashMap<T, U, V, W, X, Y>::size() const | 290 inline unsigned HashMap<T, U, V, W, X, Y>::size() const |
288 { | 291 { |
289 return m_impl.size(); | 292 return m_impl.size(); |
290 } | 293 } |
291 | 294 |
292 template <typename T, typename U, typename V, typename W, typename X, typename Y > | 295 template <typename T, typename U, typename V, typename W, typename X, typename Y > |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
361 | 364 |
362 template <typename T, typename U, typename V, typename W, typename X, typename Y > | 365 template <typename T, typename U, typename V, typename W, typename X, typename Y > |
363 template <typename HashTranslator, typename TYPE> | 366 template <typename HashTranslator, typename TYPE> |
364 inline bool | 367 inline bool |
365 HashMap<T, U, V, W, X, Y>::contains(const TYPE& value) const | 368 HashMap<T, U, V, W, X, Y>::contains(const TYPE& value) const |
366 { | 369 { |
367 return m_impl.template contains<HashMapTranslatorAdapter<ValueTraits, HashTr anslator>>(value); | 370 return m_impl.template contains<HashMapTranslatorAdapter<ValueTraits, HashTr anslator>>(value); |
368 } | 371 } |
369 | 372 |
370 template <typename T, typename U, typename V, typename W, typename X, typename Y > | 373 template <typename T, typename U, typename V, typename W, typename X, typename Y > |
374 template <typename IncomingKeyType, typename IncomingMappedType> | |
371 typename HashMap<T, U, V, W, X, Y>::AddResult | 375 typename HashMap<T, U, V, W, X, Y>::AddResult |
372 HashMap<T, U, V, W, X, Y>::inlineAdd(KeyPeekInType key, MappedPassInReferenceTyp e mapped) | 376 HashMap<T, U, V, W, X, Y>::inlineAdd(IncomingKeyType&& key, IncomingMappedType&& mapped) |
Mikhail
2016/03/04 12:58:02
think it's worth switching to 'auto HashMap<T, U,
Yuta Kitamura
2016/03/04 13:55:37
That syntax is "to be discussed" section in chromi
| |
373 { | 377 { |
374 return m_impl.template add<HashMapTranslator<ValueTraits, HashFunctions>>(ke y, mapped); | 378 return m_impl.template add<HashMapTranslator<ValueTraits, HashFunctions>>(st d::forward<IncomingKeyType>(key), std::forward<IncomingMappedType>(mapped)); |
375 } | 379 } |
376 | 380 |
377 template <typename T, typename U, typename V, typename W, typename X, typename Y > | 381 template <typename T, typename U, typename V, typename W, typename X, typename Y > |
382 template <typename IncomingKeyType, typename IncomingMappedType> | |
378 typename HashMap<T, U, V, W, X, Y>::AddResult | 383 typename HashMap<T, U, V, W, X, Y>::AddResult |
379 HashMap<T, U, V, W, X, Y>::set(KeyPeekInType key, MappedPassInType mapped) | 384 HashMap<T, U, V, W, X, Y>::set(IncomingKeyType&& key, IncomingMappedType&& mappe d) |
380 { | 385 { |
381 AddResult result = inlineAdd(key, mapped); | 386 AddResult result = inlineAdd(std::forward<IncomingKeyType>(key), std::forwar d<IncomingMappedType>(mapped)); |
382 if (!result.isNewEntry) { | 387 if (!result.isNewEntry) { |
383 // The inlineAdd call above found an existing hash table entry; we need | 388 // The inlineAdd call above found an existing hash table entry; we need |
384 // to set the mapped value. | 389 // to set the mapped value. |
385 MappedTraits::store(mapped, result.storedValue->value); | 390 // |
391 // It's safe to call std::forward again, because |mapped| isn't moved if there's an existing entry. | |
392 MappedTraits::store(std::forward<IncomingMappedType>(mapped), result.sto redValue->value); | |
386 } | 393 } |
387 return result; | 394 return result; |
388 } | 395 } |
389 | 396 |
390 template <typename T, typename U, typename V, typename W, typename X, typename Y > | 397 template <typename T, typename U, typename V, typename W, typename X, typename Y > |
391 template <typename HashTranslator, typename TYPE> | 398 template <typename HashTranslator, typename TYPE> |
392 typename HashMap<T, U, V, W, X, Y>::AddResult | 399 typename HashMap<T, U, V, W, X, Y>::AddResult |
393 HashMap<T, U, V, W, X, Y>::add(const TYPE& key, MappedPassInType value) | 400 HashMap<T, U, V, W, X, Y>::add(const TYPE& key, MappedPassInType value) |
394 { | 401 { |
395 return m_impl.template addPassingHashCode<HashMapTranslatorAdapter<ValueTrai ts, HashTranslator>>(key, value); | 402 return m_impl.template addPassingHashCode<HashMapTranslatorAdapter<ValueTrai ts, HashTranslator>>(key, value); |
396 } | 403 } |
397 | 404 |
398 template <typename T, typename U, typename V, typename W, typename X, typename Y > | 405 template <typename T, typename U, typename V, typename W, typename X, typename Y > |
406 template <typename IncomingKeyType, typename IncomingMappedType> | |
399 typename HashMap<T, U, V, W, X, Y>::AddResult | 407 typename HashMap<T, U, V, W, X, Y>::AddResult |
400 HashMap<T, U, V, W, X, Y>::add(KeyPeekInType key, MappedPassInType mapped) | 408 HashMap<T, U, V, W, X, Y>::add(IncomingKeyType&& key, IncomingMappedType&& mappe d) |
401 { | 409 { |
402 return inlineAdd(key, mapped); | 410 return inlineAdd(std::forward<IncomingKeyType>(key), std::forward<IncomingMa ppedType>(mapped)); |
403 } | 411 } |
404 | 412 |
405 template <typename T, typename U, typename V, typename W, typename X, typename Y > | 413 template <typename T, typename U, typename V, typename W, typename X, typename Y > |
406 typename HashMap<T, U, V, W, X, Y>::MappedPeekType | 414 typename HashMap<T, U, V, W, X, Y>::MappedPeekType |
407 HashMap<T, U, V, W, X, Y>::get(KeyPeekInType key) const | 415 HashMap<T, U, V, W, X, Y>::get(KeyPeekInType key) const |
408 { | 416 { |
409 ValueType* entry = const_cast<HashTableType&>(m_impl).lookup(key); | 417 ValueType* entry = const_cast<HashTableType&>(m_impl).lookup(key); |
410 if (!entry) | 418 if (!entry) |
411 return MappedTraits::peek(MappedTraits::emptyValue()); | 419 return MappedTraits::peek(MappedTraits::emptyValue()); |
412 return MappedTraits::peek(entry->value); | 420 return MappedTraits::peek(entry->value); |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
516 STATIC_ONLY(NeedsTracing); | 524 STATIC_ONLY(NeedsTracing); |
517 static const bool value = false; | 525 static const bool value = false; |
518 }; | 526 }; |
519 #endif | 527 #endif |
520 | 528 |
521 } // namespace WTF | 529 } // namespace WTF |
522 | 530 |
523 using WTF::HashMap; | 531 using WTF::HashMap; |
524 | 532 |
525 #endif // WTF_HashMap_h | 533 #endif // WTF_HashMap_h |
OLD | NEW |