Index: src/gpu/GrBinHashKey.h |
diff --git a/src/gpu/GrBinHashKey.h b/src/gpu/GrBinHashKey.h |
index 585a1a1c018850503b393e4e8cd9741ca3fb839a..06ff93180855f806d1e3af22260ce65c969ed151 100644 |
--- a/src/gpu/GrBinHashKey.h |
+++ b/src/gpu/GrBinHashKey.h |
@@ -10,9 +10,67 @@ |
#ifndef GrBinHashKey_DEFINED |
#define GrBinHashKey_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 (where GrBinHashKey is for GrTHashTable). |
+ */ |
+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) { |
mtklein
2014/07/19 14:38:57
I've always had half a mind to cache the hash insi
robertphillips
2014/07/20 16:12:30
I think it is worth a try.
|
+ 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 |
+}; |
+ |
+/** |
* GrBinHashKey is a hash key class that can take a data chunk of any predetermined |
* length. The hash function used is the One-at-a-Time Hash |
* (http://burtleburtle.net/bob/hash/doobs.html). |