Index: third_party/WebKit/Source/wtf/HashMap.h |
diff --git a/third_party/WebKit/Source/wtf/HashMap.h b/third_party/WebKit/Source/wtf/HashMap.h |
index d111458ba4f29acb642239345541de59e519c452..525c4f26456c6228807d0faa62914a0f38db897a 100644 |
--- a/third_party/WebKit/Source/wtf/HashMap.h |
+++ b/third_party/WebKit/Source/wtf/HashMap.h |
@@ -1,746 +1,9 @@ |
-/* |
- * Copyright (C) 2005, 2006, 2007, 2008, 2011 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. |
- * |
- */ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
-#ifndef WTF_HashMap_h |
-#define WTF_HashMap_h |
+#include "platform/wtf/HashMap.h" |
-#include "wtf/HashTable.h" |
-#include "wtf/allocator/PartitionAllocator.h" |
-#include <initializer_list> |
- |
-namespace WTF { |
- |
-template <typename KeyTraits, typename MappedTraits> |
-struct HashMapValueTraits; |
- |
-struct KeyValuePairKeyExtractor { |
- STATIC_ONLY(KeyValuePairKeyExtractor); |
- template <typename T> |
- static const typename T::KeyType& extract(const T& p) { |
- return p.key; |
- } |
-}; |
- |
-// Note: empty or deleted key values are not allowed, using them may lead to |
-// undefined behavior. For pointer keys this means that null pointers are not |
-// allowed unless you supply custom key traits. |
-template <typename KeyArg, |
- typename MappedArg, |
- typename HashArg = typename DefaultHash<KeyArg>::Hash, |
- typename KeyTraitsArg = HashTraits<KeyArg>, |
- typename MappedTraitsArg = HashTraits<MappedArg>, |
- typename Allocator = PartitionAllocator> |
-class HashMap { |
- USE_ALLOCATOR(HashMap, Allocator); |
- |
- private: |
- typedef KeyTraitsArg KeyTraits; |
- typedef MappedTraitsArg MappedTraits; |
- typedef HashMapValueTraits<KeyTraits, MappedTraits> ValueTraits; |
- |
- public: |
- typedef typename KeyTraits::TraitType KeyType; |
- typedef const typename KeyTraits::PeekInType& KeyPeekInType; |
- typedef typename MappedTraits::TraitType MappedType; |
- typedef typename ValueTraits::TraitType ValueType; |
- using value_type = ValueType; |
- |
- private: |
- typedef typename MappedTraits::PeekOutType MappedPeekType; |
- |
- typedef HashArg HashFunctions; |
- |
- typedef HashTable<KeyType, |
- ValueType, |
- KeyValuePairKeyExtractor, |
- HashFunctions, |
- ValueTraits, |
- KeyTraits, |
- Allocator> |
- HashTableType; |
- |
- class HashMapKeysProxy; |
- class HashMapValuesProxy; |
- |
- public: |
- HashMap() { |
- static_assert(Allocator::isGarbageCollected || |
- !IsPointerToGarbageCollectedType<KeyArg>::value, |
- "Cannot put raw pointers to garbage-collected classes into " |
- "an off-heap HashMap. Use HeapHashMap<> instead."); |
- static_assert(Allocator::isGarbageCollected || |
- !IsPointerToGarbageCollectedType<MappedArg>::value, |
- "Cannot put raw pointers to garbage-collected classes into " |
- "an off-heap HashMap. Use HeapHashMap<> instead."); |
- } |
- HashMap(const HashMap&) = default; |
- HashMap& operator=(const HashMap&) = default; |
- HashMap(HashMap&&) = default; |
- HashMap& operator=(HashMap&&) = default; |
- |
- // For example, HashMap<int, int>({{1, 11}, {2, 22}, {3, 33}}) will give you |
- // a HashMap containing a mapping {1 -> 11, 2 -> 22, 3 -> 33}. |
- HashMap(std::initializer_list<ValueType> elements); |
- HashMap& operator=(std::initializer_list<ValueType> elements); |
- |
- typedef HashTableIteratorAdapter<HashTableType, ValueType> iterator; |
- typedef HashTableConstIteratorAdapter<HashTableType, ValueType> |
- const_iterator; |
- typedef typename HashTableType::AddResult AddResult; |
- |
- void swap(HashMap& ref) { m_impl.swap(ref.m_impl); } |
- |
- unsigned size() const; |
- unsigned capacity() const; |
- void reserveCapacityForSize(unsigned size) { |
- m_impl.reserveCapacityForSize(size); |
- } |
- |
- bool isEmpty() const; |
- |
- // iterators iterate over pairs of keys and values |
- iterator begin(); |
- iterator end(); |
- const_iterator begin() const; |
- const_iterator end() const; |
- |
- HashMapKeysProxy& keys() { return static_cast<HashMapKeysProxy&>(*this); } |
- const HashMapKeysProxy& keys() const { |
- return static_cast<const HashMapKeysProxy&>(*this); |
- } |
- |
- HashMapValuesProxy& values() { |
- return static_cast<HashMapValuesProxy&>(*this); |
- } |
- const HashMapValuesProxy& values() const { |
- return static_cast<const HashMapValuesProxy&>(*this); |
- } |
- |
- iterator find(KeyPeekInType); |
- const_iterator find(KeyPeekInType) const; |
- bool contains(KeyPeekInType) const; |
- MappedPeekType at(KeyPeekInType) const; |
- |
- // replaces value but not key if key is already present return value is a |
- // pair of the iterator to the key location, and a boolean that's true if a |
- // new value was actually added |
- template <typename IncomingKeyType, typename IncomingMappedType> |
- AddResult set(IncomingKeyType&&, IncomingMappedType&&); |
- |
- // does nothing if key is already present return value is a pair of the |
- // iterator to the key location, and a boolean that's true if a new value |
- // was actually added |
- template <typename IncomingKeyType, typename IncomingMappedType> |
- AddResult insert(IncomingKeyType&&, IncomingMappedType&&); |
- |
- void erase(KeyPeekInType); |
- void erase(iterator); |
- void clear(); |
- template <typename Collection> |
- void removeAll(const Collection& toBeRemoved) { |
- WTF::removeAll(*this, toBeRemoved); |
- } |
- |
- MappedType take(KeyPeekInType); // efficient combination of get with remove |
- |
- // 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 <typename HashTranslator, typename T> |
- iterator find(const T&); |
- template <typename HashTranslator, typename T> |
- const_iterator find(const T&) const; |
- template <typename HashTranslator, typename T> |
- bool contains(const T&) const; |
- |
- // An alternate version of insert() 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 <typename HashTranslator, |
- typename IncomingKeyType, |
- typename IncomingMappedType> |
- AddResult insert(IncomingKeyType&&, IncomingMappedType&&); |
- |
- static bool isValidKey(KeyPeekInType); |
- |
- template <typename VisitorDispatcher> |
- void trace(VisitorDispatcher visitor) { |
- m_impl.trace(visitor); |
- } |
- |
- private: |
- template <typename IncomingKeyType, typename IncomingMappedType> |
- AddResult inlineAdd(IncomingKeyType&&, IncomingMappedType&&); |
- |
- HashTableType m_impl; |
-}; |
- |
-template <typename KeyArg, |
- typename MappedArg, |
- typename HashArg, |
- typename KeyTraitsArg, |
- typename MappedTraitsArg, |
- typename Allocator> |
-class HashMap<KeyArg, |
- MappedArg, |
- HashArg, |
- KeyTraitsArg, |
- MappedTraitsArg, |
- Allocator>::HashMapKeysProxy : private HashMap<KeyArg, |
- MappedArg, |
- HashArg, |
- KeyTraitsArg, |
- MappedTraitsArg, |
- Allocator> { |
- DISALLOW_NEW(); |
- |
- public: |
- typedef HashMap<KeyArg, |
- MappedArg, |
- HashArg, |
- KeyTraitsArg, |
- MappedTraitsArg, |
- Allocator> |
- HashMapType; |
- typedef typename HashMapType::iterator::KeysIterator iterator; |
- typedef typename HashMapType::const_iterator::KeysIterator const_iterator; |
- |
- iterator begin() { return HashMapType::begin().keys(); } |
- |
- iterator end() { return HashMapType::end().keys(); } |
- |
- const_iterator begin() const { return HashMapType::begin().keys(); } |
- |
- const_iterator end() const { return HashMapType::end().keys(); } |
- |
- private: |
- friend class HashMap; |
- |
- // These are intentionally not implemented. |
- HashMapKeysProxy(); |
- HashMapKeysProxy(const HashMapKeysProxy&); |
- HashMapKeysProxy& operator=(const HashMapKeysProxy&); |
- ~HashMapKeysProxy(); |
-}; |
- |
-template <typename KeyArg, |
- typename MappedArg, |
- typename HashArg, |
- typename KeyTraitsArg, |
- typename MappedTraitsArg, |
- typename Allocator> |
-class HashMap<KeyArg, |
- MappedArg, |
- HashArg, |
- KeyTraitsArg, |
- MappedTraitsArg, |
- Allocator>::HashMapValuesProxy : private HashMap<KeyArg, |
- MappedArg, |
- HashArg, |
- KeyTraitsArg, |
- MappedTraitsArg, |
- Allocator> { |
- DISALLOW_NEW(); |
- |
- public: |
- typedef HashMap<KeyArg, |
- MappedArg, |
- HashArg, |
- KeyTraitsArg, |
- MappedTraitsArg, |
- Allocator> |
- HashMapType; |
- typedef typename HashMapType::iterator::ValuesIterator iterator; |
- typedef typename HashMapType::const_iterator::ValuesIterator const_iterator; |
- |
- iterator begin() { return HashMapType::begin().values(); } |
- |
- iterator end() { return HashMapType::end().values(); } |
- |
- const_iterator begin() const { return HashMapType::begin().values(); } |
- |
- const_iterator end() const { return HashMapType::end().values(); } |
- |
- private: |
- friend class HashMap; |
- |
- // These are intentionally not implemented. |
- HashMapValuesProxy(); |
- HashMapValuesProxy(const HashMapValuesProxy&); |
- HashMapValuesProxy& operator=(const HashMapValuesProxy&); |
- ~HashMapValuesProxy(); |
-}; |
- |
-template <typename KeyTraits, typename MappedTraits> |
-struct HashMapValueTraits : KeyValuePairHashTraits<KeyTraits, MappedTraits> { |
- STATIC_ONLY(HashMapValueTraits); |
- static const bool hasIsEmptyValueFunction = true; |
- static bool isEmptyValue( |
- const typename KeyValuePairHashTraits<KeyTraits, MappedTraits>::TraitType& |
- value) { |
- return isHashTraitsEmptyValue<KeyTraits>(value.key); |
- } |
-}; |
- |
-template <typename ValueTraits, typename HashFunctions> |
-struct HashMapTranslator { |
- STATIC_ONLY(HashMapTranslator); |
- template <typename T> |
- static unsigned hash(const T& key) { |
- return HashFunctions::hash(key); |
- } |
- template <typename T, typename U> |
- static bool equal(const T& a, const U& b) { |
- return HashFunctions::equal(a, b); |
- } |
- template <typename T, typename U, typename V> |
- static void translate(T& location, U&& key, V&& mapped) { |
- location.key = std::forward<U>(key); |
- ValueTraits::ValueTraits::store(std::forward<V>(mapped), location.value); |
- } |
-}; |
- |
-template <typename ValueTraits, typename Translator> |
-struct HashMapTranslatorAdapter { |
- STATIC_ONLY(HashMapTranslatorAdapter); |
- template <typename T> |
- static unsigned hash(const T& key) { |
- return Translator::hash(key); |
- } |
- template <typename T, typename U> |
- static bool equal(const T& a, const U& b) { |
- return Translator::equal(a, b); |
- } |
- template <typename T, typename U, typename V> |
- static void translate(T& location, U&& key, V&& mapped, unsigned hashCode) { |
- Translator::translate(location.key, std::forward<U>(key), hashCode); |
- ValueTraits::ValueTraits::store(std::forward<V>(mapped), location.value); |
- } |
-}; |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-HashMap<T, U, V, W, X, Y>::HashMap(std::initializer_list<ValueType> elements) { |
- if (elements.size()) |
- m_impl.reserveCapacityForSize(elements.size()); |
- for (const ValueType& element : elements) |
- insert(element.key, element.value); |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-auto HashMap<T, U, V, W, X, Y>::operator=( |
- std::initializer_list<ValueType> elements) -> HashMap& { |
- *this = HashMap(std::move(elements)); |
- return *this; |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-inline unsigned HashMap<T, U, V, W, X, Y>::size() const { |
- return m_impl.size(); |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-inline unsigned HashMap<T, U, V, W, X, Y>::capacity() const { |
- return m_impl.capacity(); |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-inline bool HashMap<T, U, V, W, X, Y>::isEmpty() const { |
- return m_impl.isEmpty(); |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-inline typename HashMap<T, U, V, W, X, Y>::iterator |
-HashMap<T, U, V, W, X, Y>::begin() { |
- return m_impl.begin(); |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-inline typename HashMap<T, U, V, W, X, Y>::iterator |
-HashMap<T, U, V, W, X, Y>::end() { |
- return m_impl.end(); |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-inline typename HashMap<T, U, V, W, X, Y>::const_iterator |
-HashMap<T, U, V, W, X, Y>::begin() const { |
- return m_impl.begin(); |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-inline typename HashMap<T, U, V, W, X, Y>::const_iterator |
-HashMap<T, U, V, W, X, Y>::end() const { |
- return m_impl.end(); |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-inline typename HashMap<T, U, V, W, X, Y>::iterator |
-HashMap<T, U, V, W, X, Y>::find(KeyPeekInType key) { |
- return m_impl.find(key); |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-inline typename HashMap<T, U, V, W, X, Y>::const_iterator |
-HashMap<T, U, V, W, X, Y>::find(KeyPeekInType key) const { |
- return m_impl.find(key); |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-inline bool HashMap<T, U, V, W, X, Y>::contains(KeyPeekInType key) const { |
- return m_impl.contains(key); |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-template <typename HashTranslator, typename TYPE> |
-inline typename HashMap<T, U, V, W, X, Y>::iterator |
-HashMap<T, U, V, W, X, Y>::find(const TYPE& value) { |
- return m_impl |
- .template find<HashMapTranslatorAdapter<ValueTraits, HashTranslator>>( |
- value); |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-template <typename HashTranslator, typename TYPE> |
-inline typename HashMap<T, U, V, W, X, Y>::const_iterator |
-HashMap<T, U, V, W, X, Y>::find(const TYPE& value) const { |
- return m_impl |
- .template find<HashMapTranslatorAdapter<ValueTraits, HashTranslator>>( |
- value); |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-template <typename HashTranslator, typename TYPE> |
-inline bool HashMap<T, U, V, W, X, Y>::contains(const TYPE& value) const { |
- return m_impl |
- .template contains<HashMapTranslatorAdapter<ValueTraits, HashTranslator>>( |
- value); |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-template <typename IncomingKeyType, typename IncomingMappedType> |
-typename HashMap<T, U, V, W, X, Y>::AddResult |
-HashMap<T, U, V, W, X, Y>::inlineAdd(IncomingKeyType&& key, |
- IncomingMappedType&& mapped) { |
- return m_impl.template add<HashMapTranslator<ValueTraits, HashFunctions>>( |
- std::forward<IncomingKeyType>(key), |
- std::forward<IncomingMappedType>(mapped)); |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-template <typename IncomingKeyType, typename IncomingMappedType> |
-typename HashMap<T, U, V, W, X, Y>::AddResult HashMap<T, U, V, W, X, Y>::set( |
- IncomingKeyType&& key, |
- IncomingMappedType&& mapped) { |
- AddResult result = inlineAdd(std::forward<IncomingKeyType>(key), |
- std::forward<IncomingMappedType>(mapped)); |
- if (!result.isNewEntry) { |
- // The inlineAdd call above found an existing hash table entry; we need |
- // to set the mapped value. |
- // |
- // It's safe to call std::forward again, because |mapped| isn't moved if |
- // there's an existing entry. |
- MappedTraits::store(std::forward<IncomingMappedType>(mapped), |
- result.storedValue->value); |
- } |
- return result; |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-template <typename HashTranslator, |
- typename IncomingKeyType, |
- typename IncomingMappedType> |
-auto HashMap<T, U, V, W, X, Y>::insert(IncomingKeyType&& key, |
- IncomingMappedType&& mapped) |
- -> AddResult { |
- return m_impl.template addPassingHashCode< |
- HashMapTranslatorAdapter<ValueTraits, HashTranslator>>( |
- std::forward<IncomingKeyType>(key), |
- std::forward<IncomingMappedType>(mapped)); |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-template <typename IncomingKeyType, typename IncomingMappedType> |
-typename HashMap<T, U, V, W, X, Y>::AddResult HashMap<T, U, V, W, X, Y>::insert( |
- IncomingKeyType&& key, |
- IncomingMappedType&& mapped) { |
- return inlineAdd(std::forward<IncomingKeyType>(key), |
- std::forward<IncomingMappedType>(mapped)); |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-typename HashMap<T, U, V, W, X, Y>::MappedPeekType |
-HashMap<T, U, V, W, X, Y>::at(KeyPeekInType key) const { |
- ValueType* entry = const_cast<HashTableType&>(m_impl).lookup(key); |
- if (!entry) |
- return MappedTraits::peek(MappedTraits::emptyValue()); |
- return MappedTraits::peek(entry->value); |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-inline void HashMap<T, U, V, W, X, Y>::erase(iterator it) { |
- m_impl.remove(it.m_impl); |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-inline void HashMap<T, U, V, W, X, Y>::erase(KeyPeekInType key) { |
- erase(find(key)); |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-inline void HashMap<T, U, V, W, X, Y>::clear() { |
- m_impl.clear(); |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-auto HashMap<T, U, V, W, X, Y>::take(KeyPeekInType key) -> MappedType { |
- iterator it = find(key); |
- if (it == end()) |
- return MappedTraits::emptyValue(); |
- MappedType result = std::move(it->value); |
- erase(it); |
- return result; |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-inline bool HashMap<T, U, V, W, X, Y>::isValidKey(KeyPeekInType key) { |
- if (KeyTraits::isDeletedValue(key)) |
- return false; |
- |
- if (HashFunctions::safeToCompareToEmptyOrDeleted) { |
- if (key == KeyTraits::emptyValue()) |
- return false; |
- } else { |
- if (isHashTraitsEmptyValue<KeyTraits>(key)) |
- return false; |
- } |
- |
- return true; |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-bool operator==(const HashMap<T, U, V, W, X, Y>& a, |
- const HashMap<T, U, V, W, X, Y>& b) { |
- if (a.size() != b.size()) |
- return false; |
- |
- typedef typename HashMap<T, U, V, W, X, Y>::const_iterator const_iterator; |
- |
- const_iterator aEnd = a.end(); |
- const_iterator bEnd = b.end(); |
- for (const_iterator it = a.begin(); it != aEnd; ++it) { |
- const_iterator bPos = b.find(it->key); |
- if (bPos == bEnd || it->value != bPos->value) |
- return false; |
- } |
- |
- return true; |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y> |
-inline bool operator!=(const HashMap<T, U, V, W, X, Y>& a, |
- const HashMap<T, U, V, W, X, Y>& b) { |
- return !(a == b); |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y, |
- typename Z> |
-inline void copyKeysToVector(const HashMap<T, U, V, W, X, Y>& collection, |
- Z& vector) { |
- typedef |
- typename HashMap<T, U, V, W, X, Y>::const_iterator::KeysIterator iterator; |
- |
- vector.resize(collection.size()); |
- |
- iterator it = collection.begin().keys(); |
- iterator end = collection.end().keys(); |
- for (unsigned i = 0; it != end; ++it, ++i) |
- vector[i] = *it; |
-} |
- |
-template <typename T, |
- typename U, |
- typename V, |
- typename W, |
- typename X, |
- typename Y, |
- typename Z> |
-inline void copyValuesToVector(const HashMap<T, U, V, W, X, Y>& collection, |
- Z& vector) { |
- typedef typename HashMap<T, U, V, W, X, Y>::const_iterator::ValuesIterator |
- iterator; |
- |
- vector.resize(collection.size()); |
- |
- iterator it = collection.begin().values(); |
- iterator end = collection.end().values(); |
- for (unsigned i = 0; it != end; ++it, ++i) |
- vector[i] = *it; |
-} |
- |
-} // namespace WTF |
- |
-using WTF::HashMap; |
- |
-#endif // WTF_HashMap_h |
+// The contents of this header was moved to platform/wtf as part of |
+// WTF migration project. See the following post for details: |
+// https://groups.google.com/a/chromium.org/d/msg/blink-dev/tLdAZCTlcAA/bYXVT8gYCAAJ |