From 71f6fc9baff6fd4228f7dc70aced72143db31224 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sun, 8 Nov 2020 16:19:37 +0300 Subject: [PATCH] Add LRU cache implementation --- libs/util/include/psemek/util/lru_cache.hpp | 59 +++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 libs/util/include/psemek/util/lru_cache.hpp diff --git a/libs/util/include/psemek/util/lru_cache.hpp b/libs/util/include/psemek/util/lru_cache.hpp new file mode 100644 index 00000000..2acecb47 --- /dev/null +++ b/libs/util/include/psemek/util/lru_cache.hpp @@ -0,0 +1,59 @@ +#pragma once + +#include +#include + +namespace psemek::util +{ + + template + struct lru_cache + { + bool empty() const; + std::size_t count(T const & value) const; + + T pop(); + void push(T value); + + private: + std::list queue_; + std::unordered_map::iterator> queue_it_map_; + }; + + template + bool lru_cache::empty() const + { + return queue_.empty(); + } + + template + std::size_t lru_cache::count(T const & value) const + { + return queue_it_map_.count(value); + } + + template + T lru_cache::pop() + { + auto value = std::move(queue_.front()); + queue_.pop_front(); + queue_it_map_.erase(value); + return value; + } + + template + void lru_cache::push(T value) + { + auto it = queue_it_map_.find(value); + if (it == queue_it_map_.end()) + { + queue_.push_back(value); + queue_it_map_[std::move(value)] = queue_.back(); + } + else + { + queue_.splice(queue_.begin(), queue_, *it); + } + } + +}