1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_ANDROID_THUMBNAIL_SCOPED_PTR_EXPIRING_CACHE_H_
6#define CHROME_BROWSER_ANDROID_THUMBNAIL_SCOPED_PTR_EXPIRING_CACHE_H_
7
8#include "base/memory/scoped_ptr.h"
9#include "net/base/linked_hash_map.h"
10
11template <class Key, class Value>
12class ScopedPtrExpiringCache {
13 private:
14  typedef linked_hash_map<Key, Value*> LinkedHashMap;
15
16 public:
17  typedef typename LinkedHashMap::iterator iterator;
18
19  explicit ScopedPtrExpiringCache(size_t max_cache_size)
20      : max_cache_size_(max_cache_size) {}
21
22  ~ScopedPtrExpiringCache() {}
23
24  void Put(const Key& key, scoped_ptr<Value> value) {
25    Remove(key);
26    map_[key] = value.release();
27    EvictIfFull();
28  }
29
30  Value* Get(const Key& key) {
31    iterator iter = map_.find(key);
32    if (iter != map_.end())
33      return iter->second;
34    return NULL;
35  }
36
37  void Remove(const Key& key) {
38    iterator iter = map_.find(key);
39    if (iter != map_.end()) {
40      delete iter->second;
41      map_.erase(key);
42    }
43  }
44
45  void Clear() {
46    for (iterator iter = map_.begin(); iter != map_.end(); iter++) {
47      delete iter->second;
48    }
49    map_.clear();
50  }
51
52  iterator begin() { return map_.begin(); }
53  iterator end() { return map_.end(); }
54  size_t MaximumCacheSize() const { return max_cache_size_; }
55  size_t size() const { return map_.size(); }
56
57 private:
58  void EvictIfFull() {
59    while (map_.size() > max_cache_size_) {
60      iterator it = map_.begin();
61      delete it->second;
62      map_.erase(it);
63    }
64  }
65
66  size_t max_cache_size_;
67  LinkedHashMap map_;
68
69  DISALLOW_COPY_AND_ASSIGN(ScopedPtrExpiringCache);
70};
71
72#endif  // CHROME_BROWSER_ANDROID_THUMBNAIL_SCOPED_PTR_EXPIRING_CACHE_H_
73