| Index: src/core/SkTHashCache.h
|
| diff --git a/src/core/SkTHashCache.h b/src/core/SkTHashCache.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..cfee9722f2ea1c4e7366444dbf5a0b167291c833
|
| --- /dev/null
|
| +++ b/src/core/SkTHashCache.h
|
| @@ -0,0 +1,77 @@
|
| +/*
|
| + * 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 SkTHASHCACHE_DEFINED
|
| +#define SkTHASHCACHE_DEFINED
|
| +
|
| +#include "SkTypes.h"
|
| +#include "SkTDynamicHash.h"
|
| +
|
| +template <typename T,
|
| +typename Key,
|
| +typename Traits = T,
|
| +int kGrowPercent = 75 >
|
| +class SkTHashCache : public SkNoncopyable {
|
| +public:
|
| +
|
| + SkTHashCache() {
|
| + this->reset();
|
| + }
|
| +
|
| + ~SkTHashCache() {
|
| + this->clear();
|
| + }
|
| +
|
| + T* find(const Key& key) const {
|
| + return fDict->find(key);
|
| + }
|
| +
|
| + /**
|
| + * If element already in cache, return immediately the cached value
|
| + */
|
| + T& add(const T& add) {
|
| + Key key = Traits::GetKey(add);
|
| + if (T* val = this->find(key)) {
|
| + return *val;
|
| + }
|
| +
|
| + T* element = SkNEW_ARGS(T, (add));
|
| +
|
| + fDict->add(element);
|
| +
|
| + return *element;
|
| + }
|
| +
|
| + int size() const {
|
| + return fDict->count();
|
| + }
|
| +
|
| + void reset() {
|
| + this->clear();
|
| +
|
| + fDict.reset(SkNEW(DictType));
|
| + }
|
| +
|
| +private:
|
| + typedef SkTDynamicHash<T, Key, Traits, kGrowPercent> DictType;
|
| +
|
| + void clear() {
|
| + if (fDict.get()) {
|
| + typename DictType::Iter it(fDict.get());
|
| +
|
| + while (!it.done()) {
|
| + SkDELETE(&(*it));
|
| + ++it;
|
| + }
|
| + }
|
| + }
|
| +
|
| + SkAutoTDelete<DictType> fDict;
|
| +};
|
| +
|
| +#endif /* SkHASHCACHE_DEFINED */
|
| +
|
|
|