Home | History | Annotate | Download | only in thumbnail
      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 
     11 template <class Key, class Value>
     12 class 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