| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_ANDROID_THUMBNAIL_SCOPED_PTR_EXPIRING_CACHE_H_ |
| #define CHROME_BROWSER_ANDROID_THUMBNAIL_SCOPED_PTR_EXPIRING_CACHE_H_ |
| |
| #include <stddef.h> |
| |
| #include <memory> |
| |
| #include "base/macros.h" |
| #include "net/base/linked_hash_map.h" |
| |
| template <class Key, class Value> |
| class ScopedPtrExpiringCache { |
| private: |
| typedef net::linked_hash_map<Key, Value*> LinkedHashMap; |
| |
| public: |
| typedef typename LinkedHashMap::iterator iterator; |
| |
| explicit ScopedPtrExpiringCache(size_t max_cache_size) |
| : max_cache_size_(max_cache_size) {} |
| |
| ~ScopedPtrExpiringCache() {} |
| |
| void Put(const Key& key, std::unique_ptr<Value> value) { |
| Remove(key); |
| map_[key] = value.release(); |
| EvictIfFull(); |
| } |
| |
| Value* Get(const Key& key) { |
| iterator iter = map_.find(key); |
| if (iter != map_.end()) |
| return iter->second; |
| return NULL; |
| } |
| |
| std::unique_ptr<Value> Remove(const Key& key) { |
| iterator iter = map_.find(key); |
| std::unique_ptr<Value> value; |
| if (iter != map_.end()) { |
| value.reset(iter->second); |
| map_.erase(key); |
| } |
| return std::move(value); |
| } |
| |
| void Clear() { |
| for (iterator iter = map_.begin(); iter != map_.end(); iter++) { |
| delete iter->second; |
| } |
| map_.clear(); |
| } |
| |
| iterator begin() { return map_.begin(); } |
| iterator end() { return map_.end(); } |
| size_t MaximumCacheSize() const { return max_cache_size_; } |
| size_t size() const { return map_.size(); } |
| |
| private: |
| void EvictIfFull() { |
| while (map_.size() > max_cache_size_) { |
| iterator it = map_.begin(); |
| delete it->second; |
| map_.erase(it); |
| } |
| } |
| |
| size_t max_cache_size_; |
| LinkedHashMap map_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ScopedPtrExpiringCache); |
| }; |
| |
| #endif // CHROME_BROWSER_ANDROID_THUMBNAIL_SCOPED_PTR_EXPIRING_CACHE_H_ |