1234567891011121314151617181920212223242526272829303132333435363738394041 |
- // 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_
|