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