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