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