Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10)

Side by Side Diff: src/base/functional.h

Issue 635733002: Further improve hashing of pointers and integers. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Also fix HashIsOkish test. Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/base/functional.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_BASE_FUNCTIONAL_H_ 5 #ifndef V8_BASE_FUNCTIONAL_H_
6 #define V8_BASE_FUNCTIONAL_H_ 6 #define V8_BASE_FUNCTIONAL_H_
7 7
8 #include <cstddef> 8 #include <cstddef>
9 #include <functional> 9 #include <functional>
10 #include <utility> 10 #include <utility>
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 // } 55 // }
56 // 56 //
57 // Based on the "Hashing User-Defined Types in C++1y" proposal from Jeffrey 57 // Based on the "Hashing User-Defined Types in C++1y" proposal from Jeffrey
58 // Yasskin and Chandler Carruth, see 58 // Yasskin and Chandler Carruth, see
59 // http://www.open-std.org/Jtc1/sc22/wg21/docs/papers/2012/n3333.html. 59 // http://www.open-std.org/Jtc1/sc22/wg21/docs/papers/2012/n3333.html.
60 60
61 template <typename> 61 template <typename>
62 struct hash; 62 struct hash;
63 63
64 64
65 inline size_t hash_combine() { return 0u; } 65 V8_INLINE size_t hash_combine() { return 0u; }
66 inline size_t hash_combine(size_t seed) { return seed; } 66 V8_INLINE size_t hash_combine(size_t seed) { return seed; }
67 size_t hash_combine(size_t seed, size_t value); 67 size_t hash_combine(size_t seed, size_t value);
68 template <typename T, typename... Ts> 68 template <typename T, typename... Ts>
69 inline size_t hash_combine(T const& v, Ts const&... vs) { 69 V8_INLINE size_t hash_combine(T const& v, Ts const&... vs) {
70 return hash_combine(hash<T>()(v), hash_combine(vs...)); 70 return hash_combine(hash<T>()(v), hash_combine(vs...));
71 } 71 }
72 72
73 73
74 #define V8_BASE_HASH_VALUE_TRIVIAL(type) \ 74 #define V8_BASE_HASH_VALUE_TRIVIAL(type) \
75 inline size_t hash_value(type v) { return static_cast<size_t>(v); } 75 V8_INLINE size_t hash_value(type v) { return static_cast<size_t>(v); }
76 V8_BASE_HASH_VALUE_TRIVIAL(bool) 76 V8_BASE_HASH_VALUE_TRIVIAL(bool)
77 V8_BASE_HASH_VALUE_TRIVIAL(unsigned char) 77 V8_BASE_HASH_VALUE_TRIVIAL(unsigned char)
78 V8_BASE_HASH_VALUE_TRIVIAL(unsigned short) // NOLINT(runtime/int) 78 V8_BASE_HASH_VALUE_TRIVIAL(unsigned short) // NOLINT(runtime/int)
79 #undef V8_BASE_HASH_VALUE_TRIVIAL 79 #undef V8_BASE_HASH_VALUE_TRIVIAL
80 80
81 size_t hash_value(unsigned int); 81 size_t hash_value(unsigned int);
82 size_t hash_value(unsigned long); // NOLINT(runtime/int) 82 size_t hash_value(unsigned long); // NOLINT(runtime/int)
83 size_t hash_value(unsigned long long); // NOLINT(runtime/int) 83 size_t hash_value(unsigned long long); // NOLINT(runtime/int)
84 84
85 #define V8_BASE_HASH_VALUE_SIGNED(type) \ 85 #define V8_BASE_HASH_VALUE_SIGNED(type) \
86 inline size_t hash_value(signed type v) { \ 86 V8_INLINE size_t hash_value(signed type v) { \
87 return hash_value(bit_cast<unsigned type>(v)); \ 87 return hash_value(bit_cast<unsigned type>(v)); \
88 } 88 }
89 V8_BASE_HASH_VALUE_SIGNED(char) 89 V8_BASE_HASH_VALUE_SIGNED(char)
90 V8_BASE_HASH_VALUE_SIGNED(short) // NOLINT(runtime/int) 90 V8_BASE_HASH_VALUE_SIGNED(short) // NOLINT(runtime/int)
91 V8_BASE_HASH_VALUE_SIGNED(int) // NOLINT(runtime/int) 91 V8_BASE_HASH_VALUE_SIGNED(int) // NOLINT(runtime/int)
92 V8_BASE_HASH_VALUE_SIGNED(long) // NOLINT(runtime/int) 92 V8_BASE_HASH_VALUE_SIGNED(long) // NOLINT(runtime/int)
93 V8_BASE_HASH_VALUE_SIGNED(long long) // NOLINT(runtime/int) 93 V8_BASE_HASH_VALUE_SIGNED(long long) // NOLINT(runtime/int)
94 #undef V8_BASE_HASH_VALUE_SIGNED 94 #undef V8_BASE_HASH_VALUE_SIGNED
95 95
96 size_t hash_value(float v); 96 V8_INLINE size_t hash_value(float v) {
97 size_t hash_value(double v); 97 // 0 and -0 both hash to zero.
98 return v != 0.0f ? hash_value(bit_cast<uint32_t>(v)) : 0;
99 }
100
101 V8_INLINE size_t hash_value(double v) {
102 // 0 and -0 both hash to zero.
103 return v != 0.0 ? hash_value(bit_cast<uint64_t>(v)) : 0;
104 }
98 105
99 template <typename T> 106 template <typename T>
100 inline size_t hash_value(T* const& v) { 107 V8_INLINE size_t hash_value(T* const& v) {
101 size_t const x = bit_cast<size_t>(v); 108 return hash_value(bit_cast<uintptr_t>(v));
102 return (x >> 3) + x;
103 } 109 }
104 110
105 template <typename T1, typename T2> 111 template <typename T1, typename T2>
106 inline size_t hash_value(std::pair<T1, T2> const& v) { 112 V8_INLINE size_t hash_value(std::pair<T1, T2> const& v) {
107 return hash_combine(v.first, v.second); 113 return hash_combine(v.first, v.second);
108 } 114 }
109 115
110 116
111 template <typename T> 117 template <typename T>
112 struct hash : public std::unary_function<T, size_t> { 118 struct hash : public std::unary_function<T, size_t> {
113 size_t operator()(T const& v) const { return hash_value(v); } 119 V8_INLINE size_t operator()(T const& v) const { return hash_value(v); }
114 }; 120 };
115 121
116 #define V8_BASE_HASH_SPECIALIZE(type) \ 122 #define V8_BASE_HASH_SPECIALIZE(type) \
117 template <> \ 123 template <> \
118 struct hash<type> : public std::unary_function<type, size_t> { \ 124 struct hash<type> : public std::unary_function<type, size_t> { \
119 size_t operator()(type const v) const { \ 125 V8_INLINE size_t operator()(type const v) const { \
120 return ::v8::base::hash_value(v); \ 126 return ::v8::base::hash_value(v); \
121 } \ 127 } \
122 }; 128 };
123 V8_BASE_HASH_SPECIALIZE(bool) 129 V8_BASE_HASH_SPECIALIZE(bool)
124 V8_BASE_HASH_SPECIALIZE(signed char) 130 V8_BASE_HASH_SPECIALIZE(signed char)
125 V8_BASE_HASH_SPECIALIZE(unsigned char) 131 V8_BASE_HASH_SPECIALIZE(unsigned char)
126 V8_BASE_HASH_SPECIALIZE(short) // NOLINT(runtime/int) 132 V8_BASE_HASH_SPECIALIZE(short) // NOLINT(runtime/int)
127 V8_BASE_HASH_SPECIALIZE(unsigned short) // NOLINT(runtime/int) 133 V8_BASE_HASH_SPECIALIZE(unsigned short) // NOLINT(runtime/int)
128 V8_BASE_HASH_SPECIALIZE(int) 134 V8_BASE_HASH_SPECIALIZE(int)
129 V8_BASE_HASH_SPECIALIZE(unsigned int) 135 V8_BASE_HASH_SPECIALIZE(unsigned int)
130 V8_BASE_HASH_SPECIALIZE(long) // NOLINT(runtime/int) 136 V8_BASE_HASH_SPECIALIZE(long) // NOLINT(runtime/int)
131 V8_BASE_HASH_SPECIALIZE(unsigned long) // NOLINT(runtime/int) 137 V8_BASE_HASH_SPECIALIZE(unsigned long) // NOLINT(runtime/int)
132 V8_BASE_HASH_SPECIALIZE(long long) // NOLINT(runtime/int) 138 V8_BASE_HASH_SPECIALIZE(long long) // NOLINT(runtime/int)
133 V8_BASE_HASH_SPECIALIZE(unsigned long long) // NOLINT(runtime/int) 139 V8_BASE_HASH_SPECIALIZE(unsigned long long) // NOLINT(runtime/int)
134 V8_BASE_HASH_SPECIALIZE(float) 140 V8_BASE_HASH_SPECIALIZE(float)
135 V8_BASE_HASH_SPECIALIZE(double) 141 V8_BASE_HASH_SPECIALIZE(double)
136 #undef V8_BASE_HASH_SPECIALIZE 142 #undef V8_BASE_HASH_SPECIALIZE
137 143
138 template <typename T> 144 template <typename T>
139 struct hash<T*> : public std::unary_function<T*, size_t> { 145 struct hash<T*> : public std::unary_function<T*, size_t> {
140 size_t operator()(T* const v) const { return ::v8::base::hash_value(v); } 146 V8_INLINE size_t operator()(T* const v) const {
147 return ::v8::base::hash_value(v);
148 }
141 }; 149 };
142 150
143 template <typename T1, typename T2> 151 template <typename T1, typename T2>
144 struct hash<std::pair<T1, T2> > 152 struct hash<std::pair<T1, T2> >
145 : public std::unary_function<std::pair<T1, T2>, size_t> { 153 : public std::unary_function<std::pair<T1, T2>, size_t> {
146 size_t operator()(std::pair<T1, T2> const& v) const { 154 V8_INLINE size_t operator()(std::pair<T1, T2> const& v) const {
147 return ::v8::base::hash_value(v); 155 return ::v8::base::hash_value(v);
148 } 156 }
149 }; 157 };
150 158
151 } // namespace base 159 } // namespace base
152 } // namespace v8 160 } // namespace v8
153 161
154 #endif // V8_BASE_FUNCTIONAL_H_ 162 #endif // V8_BASE_FUNCTIONAL_H_
OLDNEW
« no previous file with comments | « no previous file | src/base/functional.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698