diff -r 000000000000 -r 6474c204b198 gfx/skia/trunk/src/gpu/GrBinHashKey.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/skia/trunk/src/gpu/GrBinHashKey.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,102 @@ + +/* + * Copyright 2011 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + + +#ifndef GrBinHashKey_DEFINED +#define GrBinHashKey_DEFINED + +#include "GrTypes.h" + +/** + * 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). + */ +template +class GrBinHashKey { +public: + enum { kKeySize = KEY_SIZE }; + + GrBinHashKey() { + this->reset(); + } + + void reset() { + fHash = 0; +#ifdef SK_DEBUG + fIsValid = false; +#endif + } + + void setKeyData(const uint32_t* SK_RESTRICT data) { + SK_COMPILE_ASSERT(KEY_SIZE % 4 == 0, key_size_mismatch); + memcpy(&fData, data, KEY_SIZE); + + uint32_t hash = 0; + size_t len = KEY_SIZE; + while (len >= 4) { + hash += *data++; + hash += (hash << 10); + hash ^= (hash >> 6); + len -= 4; + } + hash += (hash << 3); + hash ^= (hash >> 11); + hash += (hash << 15); +#ifdef SK_DEBUG + fIsValid = true; +#endif + fHash = hash; + } + + bool operator==(const GrBinHashKey& key) const { + SkASSERT(fIsValid && key.fIsValid); + if (fHash != key.fHash) { + return false; + } + for (size_t i = 0; i < SK_ARRAY_COUNT(fData); ++i) { + if (fData[i] != key.fData[i]) { + return false; + } + } + return true; + } + + bool operator<(const GrBinHashKey& key) const { + SkASSERT(fIsValid && key.fIsValid); + for (size_t i = 0; i < SK_ARRAY_COUNT(fData); ++i) { + if (fData[i] < key.fData[i]) { + return true; + } else if (fData[i] > key.fData[i]) { + return false; + } + } + return false; + } + + uint32_t getHash() const { + SkASSERT(fIsValid); + return fHash; + } + + const uint8_t* getData() const { + SkASSERT(fIsValid); + return reinterpret_cast(fData); + } + +private: + uint32_t fHash; + uint32_t fData[KEY_SIZE / sizeof(uint32_t)]; // Buffer for key storage. + +#ifdef SK_DEBUG +public: + bool fIsValid; +#endif +}; + +#endif