blob: 3f701f04723ae0a2ae71735da1e365ed0c3c473d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
// Copyright (c) 2006-2008 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.
//
//
// Deal with the differences between Microsoft and GNU implemenations
// of hash_map. Allows all platforms to use |base::hash_map| and
// |base::hash_set|.
// eg:
// base::hash_map<int> my_map;
// base::hash_set<int> my_set;
//
#ifndef BASE_HASH_TABLES_H__
#define BASE_HASH_TABLES_H__
#include "build/build_config.h"
#include "base/string16.h"
#if defined(COMPILER_MSVC)
#include <hash_map>
#include <hash_set>
namespace base {
using stdext::hash_map;
using stdext::hash_set;
}
#elif defined(COMPILER_GCC)
// This is a hack to disable the gcc 4.4 warning about hash_map and hash_set
// being deprecated. We can get rid of this when we upgrade to VS2008 and we
// can use <tr1/unordered_map> and <tr1/unordered_set>.
#ifdef __DEPRECATED
#define CHROME_OLD__DEPRECATED __DEPRECATED
#undef __DEPRECATED
#endif
#include <ext/hash_map>
#include <ext/hash_set>
#ifdef CHROME_OLD__DEPRECATED
#define __DEPRECATED CHROME_OLD__DEPRECATED
#undef CHROME_OLD__DEPRECATED
#endif
#include <tr1/functional>
namespace base {
using __gnu_cxx::hash_map;
using __gnu_cxx::hash_set;
}
// Implement string hash functions so that strings of various flavors can
// be used as keys in STL maps and sets.
namespace __gnu_cxx {
template<>
struct hash<wchar_t*> {
size_t operator()(const wchar_t* s) const {
return std::tr1::hash<const wchar_t*>()(s);
}
};
template<>
struct hash<const wchar_t*> {
size_t operator()(const wchar_t* s) const {
return std::tr1::hash<const wchar_t*>()(s);
}
};
template<>
struct hash<std::wstring> {
size_t operator()(const std::wstring& s) const {
return std::tr1::hash<std::wstring>()(s);
}
};
template<>
struct hash<const std::wstring> {
size_t operator()(const std::wstring& s) const {
return std::tr1::hash<std::wstring>()(s);
}
};
template<>
struct hash<std::string> {
size_t operator()(const std::string& s) const {
return std::tr1::hash<std::string>()(s);
}
};
template<>
struct hash<const std::string> {
size_t operator()(const std::string& s) const {
return std::tr1::hash<std::string>()(s);
}
};
template<>
struct hash<long long> {
size_t operator()(long long i) const {
return std::tr1::hash<long>()((long) i);
}
};
#if defined(WCHAR_T_IS_UTF32)
template<>
struct hash<string16> {
size_t operator()(const string16& s) const {
// This comes from GNU libstdc++, but the types have been changed to
// make it compile. The lib only defines the hash for string and wstring.
std::size_t result = 0;
for (string16::const_iterator i = s.begin(); i != s.end(); ++i)
result = (result * 131) + *i;
return result;
}
};
template<>
struct hash<const string16> {
size_t operator()(const string16& s) const {
// This comes from GNU libstdc++, but the types have been changed to
// make it compile. The lib only defines the hash for string and wstring.
std::size_t result = 0;
for (string16::const_iterator i = s.begin(); i != s.end(); ++i)
result = (result * 131) + *i;
return result;
}
};
#endif
}
#endif
#endif // BASE_HASH_TABLES_H__
|