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

Unified 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/base/functional.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/base/functional.h
diff --git a/src/base/functional.h b/src/base/functional.h
index d815c7214226cfd2e45c002144dac486d39ab59f..7c86f32139e1e87a4082f69231721dc816afe4ac 100644
--- a/src/base/functional.h
+++ b/src/base/functional.h
@@ -62,17 +62,17 @@ template <typename>
struct hash;
-inline size_t hash_combine() { return 0u; }
-inline size_t hash_combine(size_t seed) { return seed; }
+V8_INLINE size_t hash_combine() { return 0u; }
+V8_INLINE size_t hash_combine(size_t seed) { return seed; }
size_t hash_combine(size_t seed, size_t value);
template <typename T, typename... Ts>
-inline size_t hash_combine(T const& v, Ts const&... vs) {
+V8_INLINE size_t hash_combine(T const& v, Ts const&... vs) {
return hash_combine(hash<T>()(v), hash_combine(vs...));
}
#define V8_BASE_HASH_VALUE_TRIVIAL(type) \
- inline size_t hash_value(type v) { return static_cast<size_t>(v); }
+ V8_INLINE size_t hash_value(type v) { return static_cast<size_t>(v); }
V8_BASE_HASH_VALUE_TRIVIAL(bool)
V8_BASE_HASH_VALUE_TRIVIAL(unsigned char)
V8_BASE_HASH_VALUE_TRIVIAL(unsigned short) // NOLINT(runtime/int)
@@ -83,7 +83,7 @@ size_t hash_value(unsigned long); // NOLINT(runtime/int)
size_t hash_value(unsigned long long); // NOLINT(runtime/int)
#define V8_BASE_HASH_VALUE_SIGNED(type) \
- inline size_t hash_value(signed type v) { \
+ V8_INLINE size_t hash_value(signed type v) { \
return hash_value(bit_cast<unsigned type>(v)); \
}
V8_BASE_HASH_VALUE_SIGNED(char)
@@ -93,30 +93,36 @@ V8_BASE_HASH_VALUE_SIGNED(long) // NOLINT(runtime/int)
V8_BASE_HASH_VALUE_SIGNED(long long) // NOLINT(runtime/int)
#undef V8_BASE_HASH_VALUE_SIGNED
-size_t hash_value(float v);
-size_t hash_value(double v);
+V8_INLINE size_t hash_value(float v) {
+ // 0 and -0 both hash to zero.
+ return v != 0.0f ? hash_value(bit_cast<uint32_t>(v)) : 0;
+}
+
+V8_INLINE size_t hash_value(double v) {
+ // 0 and -0 both hash to zero.
+ return v != 0.0 ? hash_value(bit_cast<uint64_t>(v)) : 0;
+}
template <typename T>
-inline size_t hash_value(T* const& v) {
- size_t const x = bit_cast<size_t>(v);
- return (x >> 3) + x;
+V8_INLINE size_t hash_value(T* const& v) {
+ return hash_value(bit_cast<uintptr_t>(v));
}
template <typename T1, typename T2>
-inline size_t hash_value(std::pair<T1, T2> const& v) {
+V8_INLINE size_t hash_value(std::pair<T1, T2> const& v) {
return hash_combine(v.first, v.second);
}
template <typename T>
struct hash : public std::unary_function<T, size_t> {
- size_t operator()(T const& v) const { return hash_value(v); }
+ V8_INLINE size_t operator()(T const& v) const { return hash_value(v); }
};
#define V8_BASE_HASH_SPECIALIZE(type) \
template <> \
struct hash<type> : public std::unary_function<type, size_t> { \
- size_t operator()(type const v) const { \
+ V8_INLINE size_t operator()(type const v) const { \
return ::v8::base::hash_value(v); \
} \
};
@@ -137,13 +143,15 @@ V8_BASE_HASH_SPECIALIZE(double)
template <typename T>
struct hash<T*> : public std::unary_function<T*, size_t> {
- size_t operator()(T* const v) const { return ::v8::base::hash_value(v); }
+ V8_INLINE size_t operator()(T* const v) const {
+ return ::v8::base::hash_value(v);
+ }
};
template <typename T1, typename T2>
struct hash<std::pair<T1, T2> >
: public std::unary_function<std::pair<T1, T2>, size_t> {
- size_t operator()(std::pair<T1, T2> const& v) const {
+ V8_INLINE size_t operator()(std::pair<T1, T2> const& v) const {
return ::v8::base::hash_value(v);
}
};
« 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