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