feat: Add object cache container

This commit is contained in:
Michael Carlberg 2016-12-26 10:38:19 +01:00
parent b9f9092bbe
commit b7f16672ff

32
include/utils/cache.hpp Normal file
View File

@ -0,0 +1,32 @@
#pragma once
#include <unordered_map>
#include "common.hpp"
#include "utils/concurrency.hpp"
POLYBAR_NS
template <typename ValueType, typename KeyType>
class cache {
public:
using map_type = std::unordered_map<KeyType, std::weak_ptr<ValueType>>;
using safe_map_type = mutex_wrapper<map_type>;
template <typename... MakeArgs>
shared_ptr<ValueType> object(const KeyType& key, MakeArgs&&... make_args) {
std::lock_guard<safe_map_type> guard(m_cache);
auto ptr = m_cache[key].lock();
if (!ptr) {
m_cache[key] = ptr = make_shared<ValueType>(forward<MakeArgs>(make_args)...);
}
return ptr;
}
private:
safe_map_type m_cache;
};
namespace cache_util {}
POLYBAR_NS_END