1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file. 4*635a8641SAndroid Build Coastguard Worker 5*635a8641SAndroid Build Coastguard Worker #ifndef BASE_CONTAINERS_HASH_TABLES_H_ 6*635a8641SAndroid Build Coastguard Worker #define BASE_CONTAINERS_HASH_TABLES_H_ 7*635a8641SAndroid Build Coastguard Worker 8*635a8641SAndroid Build Coastguard Worker #include <cstddef> 9*635a8641SAndroid Build Coastguard Worker #include <unordered_map> 10*635a8641SAndroid Build Coastguard Worker #include <unordered_set> 11*635a8641SAndroid Build Coastguard Worker #include <utility> 12*635a8641SAndroid Build Coastguard Worker 13*635a8641SAndroid Build Coastguard Worker #include "base/hash.h" 14*635a8641SAndroid Build Coastguard Worker 15*635a8641SAndroid Build Coastguard Worker // This header file is deprecated. Use the corresponding C++11 type 16*635a8641SAndroid Build Coastguard Worker // instead. https://crbug.com/576864 17*635a8641SAndroid Build Coastguard Worker 18*635a8641SAndroid Build Coastguard Worker // Use a custom hasher instead. 19*635a8641SAndroid Build Coastguard Worker #define BASE_HASH_NAMESPACE base_hash 20*635a8641SAndroid Build Coastguard Worker 21*635a8641SAndroid Build Coastguard Worker namespace BASE_HASH_NAMESPACE { 22*635a8641SAndroid Build Coastguard Worker 23*635a8641SAndroid Build Coastguard Worker // A separate hasher which, by default, forwards to std::hash. This is so legacy 24*635a8641SAndroid Build Coastguard Worker // uses of BASE_HASH_NAMESPACE with base::hash_map do not interfere with 25*635a8641SAndroid Build Coastguard Worker // std::hash mid-transition. 26*635a8641SAndroid Build Coastguard Worker template<typename T> 27*635a8641SAndroid Build Coastguard Worker struct hash { operatorhash28*635a8641SAndroid Build Coastguard Worker std::size_t operator()(const T& value) const { return std::hash<T>()(value); } 29*635a8641SAndroid Build Coastguard Worker }; 30*635a8641SAndroid Build Coastguard Worker 31*635a8641SAndroid Build Coastguard Worker // Use base::IntPairHash from base/hash.h as a custom hasher instead. 32*635a8641SAndroid Build Coastguard Worker template <typename Type1, typename Type2> 33*635a8641SAndroid Build Coastguard Worker struct hash<std::pair<Type1, Type2>> { 34*635a8641SAndroid Build Coastguard Worker std::size_t operator()(std::pair<Type1, Type2> value) const { 35*635a8641SAndroid Build Coastguard Worker return base::HashInts(value.first, value.second); 36*635a8641SAndroid Build Coastguard Worker } 37*635a8641SAndroid Build Coastguard Worker }; 38*635a8641SAndroid Build Coastguard Worker 39*635a8641SAndroid Build Coastguard Worker } // namespace BASE_HASH_NAMESPACE 40*635a8641SAndroid Build Coastguard Worker 41*635a8641SAndroid Build Coastguard Worker namespace base { 42*635a8641SAndroid Build Coastguard Worker 43*635a8641SAndroid Build Coastguard Worker // Use std::unordered_map instead. 44*635a8641SAndroid Build Coastguard Worker template <class Key, 45*635a8641SAndroid Build Coastguard Worker class T, 46*635a8641SAndroid Build Coastguard Worker class Hash = BASE_HASH_NAMESPACE::hash<Key>, 47*635a8641SAndroid Build Coastguard Worker class Pred = std::equal_to<Key>, 48*635a8641SAndroid Build Coastguard Worker class Alloc = std::allocator<std::pair<const Key, T>>> 49*635a8641SAndroid Build Coastguard Worker using hash_map = std::unordered_map<Key, T, Hash, Pred, Alloc>; 50*635a8641SAndroid Build Coastguard Worker 51*635a8641SAndroid Build Coastguard Worker // Use std::unordered_multimap instead. 52*635a8641SAndroid Build Coastguard Worker template <class Key, 53*635a8641SAndroid Build Coastguard Worker class T, 54*635a8641SAndroid Build Coastguard Worker class Hash = BASE_HASH_NAMESPACE::hash<Key>, 55*635a8641SAndroid Build Coastguard Worker class Pred = std::equal_to<Key>, 56*635a8641SAndroid Build Coastguard Worker class Alloc = std::allocator<std::pair<const Key, T>>> 57*635a8641SAndroid Build Coastguard Worker using hash_multimap = std::unordered_multimap<Key, T, Hash, Pred, Alloc>; 58*635a8641SAndroid Build Coastguard Worker 59*635a8641SAndroid Build Coastguard Worker // Use std::unordered_multiset instead. 60*635a8641SAndroid Build Coastguard Worker template <class Key, 61*635a8641SAndroid Build Coastguard Worker class Hash = BASE_HASH_NAMESPACE::hash<Key>, 62*635a8641SAndroid Build Coastguard Worker class Pred = std::equal_to<Key>, 63*635a8641SAndroid Build Coastguard Worker class Alloc = std::allocator<Key>> 64*635a8641SAndroid Build Coastguard Worker using hash_multiset = std::unordered_multiset<Key, Hash, Pred, Alloc>; 65*635a8641SAndroid Build Coastguard Worker 66*635a8641SAndroid Build Coastguard Worker // Use std::unordered_set instead. 67*635a8641SAndroid Build Coastguard Worker template <class Key, 68*635a8641SAndroid Build Coastguard Worker class Hash = BASE_HASH_NAMESPACE::hash<Key>, 69*635a8641SAndroid Build Coastguard Worker class Pred = std::equal_to<Key>, 70*635a8641SAndroid Build Coastguard Worker class Alloc = std::allocator<Key>> 71*635a8641SAndroid Build Coastguard Worker using hash_set = std::unordered_set<Key, Hash, Pred, Alloc>; 72*635a8641SAndroid Build Coastguard Worker 73*635a8641SAndroid Build Coastguard Worker } // namespace base 74*635a8641SAndroid Build Coastguard Worker 75*635a8641SAndroid Build Coastguard Worker #endif // BASE_CONTAINERS_HASH_TABLES_H_ 76