text: // 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_
  