Add LRU cache implementation

This commit is contained in:
Nikita Lisitsa 2020-11-08 16:19:37 +03:00
parent ba9c7a4418
commit 71f6fc9baf

View file

@ -0,0 +1,59 @@
#pragma once
#include <list>
#include <unordered_map>
namespace psemek::util
{
template <typename T>
struct lru_cache
{
bool empty() const;
std::size_t count(T const & value) const;
T pop();
void push(T value);
private:
std::list<T> queue_;
std::unordered_map<T, typename std::list<T>::iterator> queue_it_map_;
};
template <typename T>
bool lru_cache<T>::empty() const
{
return queue_.empty();
}
template <typename T>
std::size_t lru_cache<T>::count(T const & value) const
{
return queue_it_map_.count(value);
}
template <typename T>
T lru_cache<T>::pop()
{
auto value = std::move(queue_.front());
queue_.pop_front();
queue_it_map_.erase(value);
return value;
}
template <typename T>
void lru_cache<T>::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);
}
}
}