| Index: src/base/functional.cc
 | 
| diff --git a/src/base/functional.cc b/src/base/functional.cc
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..c4a61adda2452f9203b2b88cf986a58f7f1fea36
 | 
| --- /dev/null
 | 
| +++ b/src/base/functional.cc
 | 
| @@ -0,0 +1,89 @@
 | 
| +// Copyright 2014 the V8 project authors. All rights reserved.
 | 
| +// Use of this source code is governed by a BSD-style license that can be
 | 
| +// found in the LICENSE file.
 | 
| +//
 | 
| +// This also contains public domain code from MurmurHash. From the
 | 
| +// MurmurHash header:
 | 
| +//
 | 
| +// MurmurHash3 was written by Austin Appleby, and is placed in the public
 | 
| +// domain. The author hereby disclaims copyright to this source code.
 | 
| +
 | 
| +#include "src/base/functional.h"
 | 
| +
 | 
| +#include <limits>
 | 
| +
 | 
| +#include "src/base/bits.h"
 | 
| +
 | 
| +namespace v8 {
 | 
| +namespace base {
 | 
| +
 | 
| +namespace {
 | 
| +
 | 
| +template <typename T>
 | 
| +inline size_t hash_value_unsigned(T value) {
 | 
| +  const unsigned size_t_bits = std::numeric_limits<size_t>::digits;
 | 
| +  // ceiling(std::numeric_limits<T>::digits / size_t_bits) - 1
 | 
| +  const unsigned length = (std::numeric_limits<T>::digits - 1) / size_t_bits;
 | 
| +  size_t seed = 0;
 | 
| +  // Hopefully, this loop can be unrolled.
 | 
| +  for (unsigned i = length * size_t_bits; i > 0; i -= size_t_bits) {
 | 
| +    seed ^= static_cast<size_t>(value >> i) + (seed << 6) + (seed >> 2);
 | 
| +  }
 | 
| +  seed ^= static_cast<size_t>(value) + (seed << 6) + (seed >> 2);
 | 
| +  return seed;
 | 
| +}
 | 
| +
 | 
| +}  // namespace
 | 
| +
 | 
| +
 | 
| +// This code was taken from MurmurHash.
 | 
| +size_t hash_combine(size_t seed, size_t value) {
 | 
| +#if V8_HOST_ARCH_32_BIT
 | 
| +  const uint32_t c1 = 0xcc9e2d51;
 | 
| +  const uint32_t c2 = 0x1b873593;
 | 
| +
 | 
| +  value *= c1;
 | 
| +  value = bits::RotateRight32(value, 15);
 | 
| +  value *= c2;
 | 
| +
 | 
| +  seed ^= value;
 | 
| +  seed = bits::RotateRight32(seed, 13);
 | 
| +  seed = seed * 5 + 0xe6546b64;
 | 
| +#else
 | 
| +  const uint64_t m = V8_UINT64_C(0xc6a4a7935bd1e995);
 | 
| +  const uint32_t r = 47;
 | 
| +
 | 
| +  value *= m;
 | 
| +  value ^= value >> r;
 | 
| +  value *= m;
 | 
| +
 | 
| +  seed ^= value;
 | 
| +  seed *= m;
 | 
| +#endif  // V8_HOST_ARCH_32_BIT
 | 
| +  return seed;
 | 
| +}
 | 
| +
 | 
| +
 | 
| +size_t hash_value(unsigned long v) {  // NOLINT(runtime/int)
 | 
| +  return hash_value_unsigned(v);
 | 
| +}
 | 
| +
 | 
| +
 | 
| +size_t hash_value(unsigned long long v) {  // NOLINT(runtime/int)
 | 
| +  return hash_value_unsigned(v);
 | 
| +}
 | 
| +
 | 
| +
 | 
| +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;
 | 
| +}
 | 
| +
 | 
| +
 | 
| +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;
 | 
| +}
 | 
| +
 | 
| +}  // namespace base
 | 
| +}  // namespace v8
 | 
| 
 |