xref: /aosp_15_r20/external/libchrome/base/containers/hash_tables.h (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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