17#include "common/lang/functional.h"
18#include "common/lang/unordered_set.h"
22template <
typename Key,
typename Value,
typename Hash = hash<Key>,
typename Pred = equal_to<Key>>
36 ListNode(
const Key &key,
const Value &value) : key_(key), value_(value) {}
42 size_t operator()(
ListNode *node)
const
44 if (node ==
nullptr) {
47 return hasher_(node->key_);
63 if (node1 ==
nullptr || node2 ==
nullptr) {
67 return pred_(node1->key_, node2->key_);
78 searcher_.reserve(reserve);
82 ~LruCache() { destroy(); }
86 for (ListNode *node : searcher_) {
95 size_t count()
const {
return searcher_.size(); }
97 bool get(
const Key &key,
Value &value)
99 auto iter = searcher_.find((ListNode *)&key);
100 if (iter == searcher_.end()) {
105 value = (*iter)->value_;
109 void put(
const Key &key,
const Value &value)
111 auto iter = searcher_.find((ListNode *)&key);
112 if (iter != searcher_.end()) {
113 ListNode *ln = *iter;
119 ListNode *ln =
new ListNode(key, value);
123 void remove(
const Key &key)
125 auto iter = searcher_.find((ListNode *)&key);
126 if (iter != searcher_.end()) {
131 void pop(
Value *&value)
137 void foreach (function<
bool(
const Key &,
const Value &)> func)
139 for (ListNode *node = lru_front_; node !=
nullptr; node = node->next_) {
140 bool ret = func(node->key_, node->value_);
147 void foreach_reverse(function<
bool(
const Key &,
const Value &)> func)
149 for (ListNode *node = lru_tail_; node !=
nullptr; node = node->prev_) {
150 bool ret = func(node->key_, node->value_);
158 void lru_touch(ListNode *node)
161 if (
nullptr == node->prev_) {
165 node->prev_->next_ = node->next_;
167 if (node->next_ !=
nullptr) {
168 node->next_->prev_ = node->prev_;
170 lru_tail_ = node->prev_;
173 node->prev_ =
nullptr;
174 node->next_ = lru_front_;
175 if (lru_front_ !=
nullptr) {
176 lru_front_->prev_ = node;
181 void lru_push(ListNode *node)
184 if (
nullptr == lru_tail_) {
188 node->prev_ =
nullptr;
189 node->next_ = lru_front_;
190 if (lru_front_ !=
nullptr) {
191 lru_front_->prev_ = node;
195 searcher_.insert(node);
198 void lru_remove(ListNode *node)
200 if (node->prev_ !=
nullptr) {
201 node->prev_->next_ = node->next_;
204 if (node->next_ !=
nullptr) {
205 node->next_->prev_ = node->prev_;
208 if (lru_front_ == node) {
209 lru_front_ = node->next_;
211 if (lru_tail_ == node) {
212 lru_tail_ = node->prev_;
215 searcher_.erase(node);
220 using SearchType = unordered_set<ListNode *, PListNodeHasher, PListNodePredicator>;
221 SearchType searcher_;
222 ListNode *lru_front_ =
nullptr;
223 ListNode *lru_tail_ =
nullptr;
属性的值
Definition: value.h:30
Definition: lru_cache.h:27
Definition: lru_cache.h:40
Definition: lru_cache.h:55
Definition: lru_cache.h:24