00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00018
00019 #ifndef NET_INSTAWEB_UTIL_PUBLIC_LRU_CACHE_H_
00020 #define NET_INSTAWEB_UTIL_PUBLIC_LRU_CACHE_H_
00021
00022 #include <cstddef>
00023 #include <list>
00024 #include <map>
00025 #include <utility>
00026 #include "net/instaweb/util/public/basictypes.h"
00027 #include "net/instaweb/util/public/cache_interface.h"
00028 #include "net/instaweb/util/public/shared_string.h"
00029 #include "net/instaweb/util/public/string.h"
00030
00031 namespace net_instaweb {
00032
00045 class LRUCache : public CacheInterface {
00046 public:
00047 explicit LRUCache(size_t max_size)
00048 : max_bytes_in_cache_(max_size),
00049 current_bytes_in_cache_(0) {
00050 ClearStats();
00051 }
00052 virtual ~LRUCache();
00053
00054 virtual void Get(const GoogleString& key, Callback* callback);
00055
00062 virtual void Put(const GoogleString& key, SharedString* new_value);
00063 virtual void Delete(const GoogleString& key);
00064
00066 size_t size_bytes() const { return current_bytes_in_cache_; }
00067
00069 size_t num_elements() const { return map_.size(); }
00070
00071 size_t num_evictions() const { return num_evictions_; }
00072 size_t num_hits() const { return num_hits_; }
00073 size_t num_misses() const { return num_misses_; }
00074 size_t num_inserts() const { return num_inserts_; }
00075 size_t num_identical_reinserts() const { return num_identical_reinserts_; }
00076 size_t num_deletes() const { return num_deletes_; }
00077
00079 void SanityCheck();
00080
00083 void Clear();
00084
00086 void ClearStats();
00087
00088 virtual const char* Name() const { return "LRUCache"; }
00089
00090 private:
00091 typedef std::pair<const GoogleString*, SharedString> KeyValuePair;
00092 typedef std::list<KeyValuePair*> EntryList;
00094 typedef EntryList::iterator ListNode;
00095 typedef std::map<GoogleString, ListNode> Map;
00096 inline size_t entry_size(KeyValuePair* kvp) const;
00097 inline ListNode Freshen(KeyValuePair* key_value);
00098 bool EvictIfNecessary(size_t bytes_needed);
00099
00100 size_t max_bytes_in_cache_;
00101 size_t current_bytes_in_cache_;
00102 size_t num_evictions_;
00103 size_t num_hits_;
00104 size_t num_misses_;
00105 size_t num_inserts_;
00106 size_t num_identical_reinserts_;
00107 size_t num_deletes_;
00108 EntryList lru_ordered_list_;
00109 Map map_;
00110
00111 DISALLOW_COPY_AND_ASSIGN(LRUCache);
00112 };
00113
00114 }
00115
00116 #endif ///< NET_INSTAWEB_UTIL_PUBLIC_LRU_CACHE_H_