Add LRU cache implementation
This commit is contained in:
parent
ba9c7a4418
commit
71f6fc9baf
1 changed files with 59 additions and 0 deletions
59
libs/util/include/psemek/util/lru_cache.hpp
Normal file
59
libs/util/include/psemek/util/lru_cache.hpp
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue