1 2 /* 3 * Copyright 2014 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 #ifndef GrMurmur3HashKey_DEFINED 11 #define GrMurmur3HashKey_DEFINED 12 13 #include "SkChecksum.h" 14 #include "GrTypes.h" 15 16 /** 17 * GrMurmur3HashKey is a hash key class that can take a data chunk of any predetermined 18 * length. It uses the Murmur3 hash function. It is intended to be used with 19 * SkTDynamicHash. 20 */ 21 template<size_t KEY_SIZE_IN_BYTES> 22 class GrMurmur3HashKey { 23 public: GrMurmur3HashKey()24 GrMurmur3HashKey() { 25 this->reset(); 26 } 27 reset()28 void reset() { 29 fHash = 0; 30 #ifdef SK_DEBUG 31 fIsValid = false; 32 #endif 33 } 34 setKeyData(const uint32_t * data)35 void setKeyData(const uint32_t* data) { 36 SK_COMPILE_ASSERT(KEY_SIZE_IN_BYTES % 4 == 0, key_size_mismatch); 37 memcpy(fData, data, KEY_SIZE_IN_BYTES); 38 39 fHash = SkChecksum::Murmur3(fData, KEY_SIZE_IN_BYTES); 40 #ifdef SK_DEBUG 41 fIsValid = true; 42 #endif 43 } 44 45 bool operator==(const GrMurmur3HashKey& other) const { 46 if (fHash != other.fHash) { 47 return false; 48 } 49 50 return !memcmp(fData, other.fData, KEY_SIZE_IN_BYTES); 51 } 52 getHash()53 uint32_t getHash() const { 54 SkASSERT(fIsValid); 55 return fHash; 56 } 57 getData()58 const uint8_t* getData() const { 59 SkASSERT(fIsValid); 60 return reinterpret_cast<const uint8_t*>(fData); 61 } 62 63 private: 64 uint32_t fHash; 65 uint32_t fData[KEY_SIZE_IN_BYTES / sizeof(uint32_t)]; // Buffer for key storage. 66 67 #ifdef SK_DEBUG 68 public: 69 bool fIsValid; 70 #endif 71 }; 72 73 #endif 74