3 #include <unordered_map>
8 template<
typename Key,
typename Value>
12 Entry(
const Key& key,
const Value& value):
13 key(key), value(value) {}
15 Entry* prev =
nullptr;
16 Entry* next =
nullptr;
22 std::unordered_map<Key, Entry*> cache_;
23 mutable Entry* entries_ =
nullptr;
24 mutable Entry* tail_ =
nullptr;
26 std::size_t max_size_ = 64;
30 assert(cache_.empty());
35 Entry* old_tail = tail_;
39 tail_->next =
nullptr;
45 cache_.erase(old_tail->key);
51 void check_valid()
const {
55 assert(it != it->next);
61 assert(cache_.size() == count);
71 auto it = cache_.find(key);
72 if(it != cache_.end()) {
73 auto entry = it->second;
75 if(entry != entries_) {
77 if(entry->prev) entry->prev->next = entry->next;
78 if(entry->next) entry->next->prev = entry->prev;
85 entry->prev =
nullptr;
86 entry->next = entries_;
87 entries_->prev = entry;
106 bool insert(
const Key& key,
const Value& value) {
107 auto it = cache_.find(key);
108 if(it != cache_.end()) {
114 Entry* new_entry =
new Entry(key, value);
121 new_entry->next = entries_;
123 entries_->prev = new_entry;
126 entries_ = new_entry;
127 cache_.insert(std::make_pair(key, new_entry));
130 if(cache_.size() > max_size_) {
140 bool erase(
const Key& key) {
141 auto it = cache_.find(key);
142 if(it == cache_.end()) {
146 assert(it->second.key == key);
149 auto entry = it->second;
151 if(entry->prev) entry->prev->next = entry->next;
152 if(entry->next) entry->next->prev = entry->prev;
167 void set_max_size(std::size_t size) {
168 while(cache_.size() > size) {
175 std::size_t size()
const {
176 return cache_.size();
179 std::size_t max_size()
const {