33 lines
708 B
C++
33 lines
708 B
C++
|
#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
|