You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
41 lines
969 B
41 lines
969 B
// Copyright 2016 The RE2 Authors. All Rights Reserved. |
|
// Use of this source code is governed by a BSD-style |
|
// license that can be found in the LICENSE file. |
|
|
|
#ifndef UTIL_MIX_H_ |
|
#define UTIL_MIX_H_ |
|
|
|
#include <stddef.h> |
|
#include <limits> |
|
|
|
namespace re2 { |
|
|
|
// Silence "truncation of constant value" warning for kMul in 32-bit mode. |
|
// Since this is a header file, push and then pop to limit the scope. |
|
#ifdef _MSC_VER |
|
#pragma warning(push) |
|
#pragma warning(disable: 4309) |
|
#endif |
|
|
|
class HashMix { |
|
public: |
|
HashMix() : hash_(1) {} |
|
explicit HashMix(size_t val) : hash_(val + 83) {} |
|
void Mix(size_t val) { |
|
static const size_t kMul = static_cast<size_t>(0xdc3eb94af8ab4c93ULL); |
|
hash_ *= kMul; |
|
hash_ = ((hash_ << 19) | |
|
(hash_ >> (std::numeric_limits<size_t>::digits - 19))) + val; |
|
} |
|
size_t get() const { return hash_; } |
|
private: |
|
size_t hash_; |
|
}; |
|
|
|
#ifdef _MSC_VER |
|
#pragma warning(pop) |
|
#endif |
|
|
|
} // namespace re2 |
|
|
|
#endif // UTIL_MIX_H_
|
|
|