| OLD | NEW |
| 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 <stddef.h> | 8 #include <stddef.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 | 10 |
| 11 #include <cstddef> | 11 #include <cstddef> |
| 12 #include <cstring> | 12 #include <cstring> |
| 13 #include <functional> | 13 #include <functional> |
| 14 #include <utility> | 14 #include <utility> |
| 15 | 15 |
| 16 #include "src/base/base-export.h" |
| 16 #include "src/base/macros.h" | 17 #include "src/base/macros.h" |
| 17 | 18 |
| 18 namespace v8 { | 19 namespace v8 { |
| 19 namespace base { | 20 namespace base { |
| 20 | 21 |
| 21 // base::hash is an implementation of the hash function object specified by | 22 // base::hash is an implementation of the hash function object specified by |
| 22 // C++11. It was designed to be compatible with std::hash (in C++11) and | 23 // C++11. It was designed to be compatible with std::hash (in C++11) and |
| 23 // boost:hash (which in turn is based on the hash function object specified by | 24 // boost:hash (which in turn is based on the hash function object specified by |
| 24 // the Draft Technical Report on C++ Library Extensions (TR1)). | 25 // the Draft Technical Report on C++ Library Extensions (TR1)). |
| 25 // | 26 // |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 // Based on the "Hashing User-Defined Types in C++1y" proposal from Jeffrey | 61 // Based on the "Hashing User-Defined Types in C++1y" proposal from Jeffrey |
| 61 // Yasskin and Chandler Carruth, see | 62 // Yasskin and Chandler Carruth, see |
| 62 // http://www.open-std.org/Jtc1/sc22/wg21/docs/papers/2012/n3333.html. | 63 // http://www.open-std.org/Jtc1/sc22/wg21/docs/papers/2012/n3333.html. |
| 63 | 64 |
| 64 template <typename> | 65 template <typename> |
| 65 struct hash; | 66 struct hash; |
| 66 | 67 |
| 67 | 68 |
| 68 V8_INLINE size_t hash_combine() { return 0u; } | 69 V8_INLINE size_t hash_combine() { return 0u; } |
| 69 V8_INLINE size_t hash_combine(size_t seed) { return seed; } | 70 V8_INLINE size_t hash_combine(size_t seed) { return seed; } |
| 70 size_t hash_combine(size_t seed, size_t value); | 71 V8_BASE_EXPORT size_t hash_combine(size_t seed, size_t value); |
| 71 template <typename T, typename... Ts> | 72 template <typename T, typename... Ts> |
| 72 V8_INLINE size_t hash_combine(T const& v, Ts const&... vs) { | 73 V8_INLINE size_t hash_combine(T const& v, Ts const&... vs) { |
| 73 return hash_combine(hash_combine(vs...), hash<T>()(v)); | 74 return hash_combine(hash_combine(vs...), hash<T>()(v)); |
| 74 } | 75 } |
| 75 | 76 |
| 76 | 77 |
| 77 template <typename Iterator> | 78 template <typename Iterator> |
| 78 V8_INLINE size_t hash_range(Iterator first, Iterator last) { | 79 V8_INLINE size_t hash_range(Iterator first, Iterator last) { |
| 79 size_t seed = 0; | 80 size_t seed = 0; |
| 80 for (; first != last; ++first) { | 81 for (; first != last; ++first) { |
| 81 seed = hash_combine(seed, *first); | 82 seed = hash_combine(seed, *first); |
| 82 } | 83 } |
| 83 return seed; | 84 return seed; |
| 84 } | 85 } |
| 85 | 86 |
| 86 | 87 |
| 87 #define V8_BASE_HASH_VALUE_TRIVIAL(type) \ | 88 #define V8_BASE_HASH_VALUE_TRIVIAL(type) \ |
| 88 V8_INLINE size_t hash_value(type v) { return static_cast<size_t>(v); } | 89 V8_INLINE size_t hash_value(type v) { return static_cast<size_t>(v); } |
| 89 V8_BASE_HASH_VALUE_TRIVIAL(bool) | 90 V8_BASE_HASH_VALUE_TRIVIAL(bool) |
| 90 V8_BASE_HASH_VALUE_TRIVIAL(unsigned char) | 91 V8_BASE_HASH_VALUE_TRIVIAL(unsigned char) |
| 91 V8_BASE_HASH_VALUE_TRIVIAL(unsigned short) // NOLINT(runtime/int) | 92 V8_BASE_HASH_VALUE_TRIVIAL(unsigned short) // NOLINT(runtime/int) |
| 92 #undef V8_BASE_HASH_VALUE_TRIVIAL | 93 #undef V8_BASE_HASH_VALUE_TRIVIAL |
| 93 | 94 |
| 94 size_t hash_value(unsigned int); | 95 V8_BASE_EXPORT size_t hash_value(unsigned int); |
| 95 size_t hash_value(unsigned long); // NOLINT(runtime/int) | 96 V8_BASE_EXPORT size_t hash_value(unsigned long); // NOLINT(runtime/int) |
| 96 size_t hash_value(unsigned long long); // NOLINT(runtime/int) | 97 V8_BASE_EXPORT size_t hash_value(unsigned long long); // NOLINT(runtime/int) |
| 97 | 98 |
| 98 #define V8_BASE_HASH_VALUE_SIGNED(type) \ | 99 #define V8_BASE_HASH_VALUE_SIGNED(type) \ |
| 99 V8_INLINE size_t hash_value(signed type v) { \ | 100 V8_INLINE size_t hash_value(signed type v) { \ |
| 100 return hash_value(bit_cast<unsigned type>(v)); \ | 101 return hash_value(bit_cast<unsigned type>(v)); \ |
| 101 } | 102 } |
| 102 V8_BASE_HASH_VALUE_SIGNED(char) | 103 V8_BASE_HASH_VALUE_SIGNED(char) |
| 103 V8_BASE_HASH_VALUE_SIGNED(short) // NOLINT(runtime/int) | 104 V8_BASE_HASH_VALUE_SIGNED(short) // NOLINT(runtime/int) |
| 104 V8_BASE_HASH_VALUE_SIGNED(int) // NOLINT(runtime/int) | 105 V8_BASE_HASH_VALUE_SIGNED(int) // NOLINT(runtime/int) |
| 105 V8_BASE_HASH_VALUE_SIGNED(long) // NOLINT(runtime/int) | 106 V8_BASE_HASH_VALUE_SIGNED(long) // NOLINT(runtime/int) |
| 106 V8_BASE_HASH_VALUE_SIGNED(long long) // NOLINT(runtime/int) | 107 V8_BASE_HASH_VALUE_SIGNED(long long) // NOLINT(runtime/int) |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 } \ | 219 } \ |
| 219 }; | 220 }; |
| 220 V8_BASE_BIT_SPECIALIZE_BIT_CAST(float, uint32_t) | 221 V8_BASE_BIT_SPECIALIZE_BIT_CAST(float, uint32_t) |
| 221 V8_BASE_BIT_SPECIALIZE_BIT_CAST(double, uint64_t) | 222 V8_BASE_BIT_SPECIALIZE_BIT_CAST(double, uint64_t) |
| 222 #undef V8_BASE_BIT_SPECIALIZE_BIT_CAST | 223 #undef V8_BASE_BIT_SPECIALIZE_BIT_CAST |
| 223 | 224 |
| 224 } // namespace base | 225 } // namespace base |
| 225 } // namespace v8 | 226 } // namespace v8 |
| 226 | 227 |
| 227 #endif // V8_BASE_FUNCTIONAL_H_ | 228 #endif // V8_BASE_FUNCTIONAL_H_ |
| OLD | NEW |