1// Copyright 2016 The RE2 Authors. All Rights Reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5#ifndef UTIL_MIX_H_
6#define UTIL_MIX_H_
7
8#include <stddef.h>
9#include <limits>
10
11namespace re2 {
12
13// Silence "truncation of constant value" warning for kMul in 32-bit mode.
14// Since this is a header file, push and then pop to limit the scope.
15#ifdef _MSC_VER
16#pragma warning(push)
17#pragma warning(disable: 4309)
18#endif
19
20class HashMix {
21 public:
22 HashMix() : hash_(1) {}
23 explicit HashMix(size_t val) : hash_(val + 83) {}
24 void Mix(size_t val) {
25 static const size_t kMul = static_cast<size_t>(0xdc3eb94af8ab4c93ULL);
26 hash_ *= kMul;
27 hash_ = ((hash_ << 19) |
28 (hash_ >> (std::numeric_limits<size_t>::digits - 19))) + val;
29 }
30 size_t get() const { return hash_; }
31 private:
32 size_t hash_;
33};
34
35#ifdef _MSC_VER
36#pragma warning(pop)
37#endif
38
39} // namespace re2
40
41#endif // UTIL_MIX_H_
42