blob: 5d1d8f283c94931535413acc78be666679c82310 [file] [log] [blame]
// 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_