| |
| /* |
| * Copyright 2014 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| |
| #ifndef GrMurmur3HashKey_DEFINED |
| #define GrMurmur3HashKey_DEFINED |
| |
| #include "SkChecksum.h" |
| #include "GrTypes.h" |
| |
| /** |
| * GrMurmur3HashKey is a hash key class that can take a data chunk of any predetermined |
| * length. It uses the Murmur3 hash function. It is intended to be used with |
| * SkTDynamicHash. |
| */ |
| template<size_t KEY_SIZE_IN_BYTES> |
| class GrMurmur3HashKey { |
| public: |
| GrMurmur3HashKey() { |
| this->reset(); |
| } |
| |
| void reset() { |
| fHash = 0; |
| #ifdef SK_DEBUG |
| fIsValid = false; |
| #endif |
| } |
| |
| void setKeyData(const uint32_t* data) { |
| SK_COMPILE_ASSERT(KEY_SIZE_IN_BYTES % 4 == 0, key_size_mismatch); |
| memcpy(fData, data, KEY_SIZE_IN_BYTES); |
| |
| fHash = SkChecksum::Murmur3(fData, KEY_SIZE_IN_BYTES); |
| #ifdef SK_DEBUG |
| fIsValid = true; |
| #endif |
| } |
| |
| bool operator==(const GrMurmur3HashKey& other) const { |
| if (fHash != other.fHash) { |
| return false; |
| } |
| |
| return !memcmp(fData, other.fData, KEY_SIZE_IN_BYTES); |
| } |
| |
| uint32_t getHash() const { |
| SkASSERT(fIsValid); |
| return fHash; |
| } |
| |
| const uint8_t* getData() const { |
| SkASSERT(fIsValid); |
| return reinterpret_cast<const uint8_t*>(fData); |
| } |
| |
| private: |
| uint32_t fHash; |
| uint32_t fData[KEY_SIZE_IN_BYTES / sizeof(uint32_t)]; // Buffer for key storage. |
| |
| #ifdef SK_DEBUG |
| public: |
| bool fIsValid; |
| #endif |
| }; |
| |
| #endif |