Index: src/gpu/GrMurmur3HashKey.h |
diff --git a/src/gpu/GrMurmur3HashKey.h b/src/gpu/GrMurmur3HashKey.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ad1fa7c96dda564ffb8cce56aca8ebc4282ddd09 |
--- /dev/null |
+++ b/src/gpu/GrMurmur3HashKey.h |
@@ -0,0 +1,73 @@ |
+ |
+/* |
+ * 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 (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) { |
+ 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 |