mirror of https://github.com/polybar/polybar.git
36 lines
821 B
C++
36 lines
821 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>;
|
|
|
|
bool check(const KeyType& key) {
|
|
std::lock_guard<safe_map_type> guard(m_cache);
|
|
return m_cache.find(key) == m_cache.end();
|
|
}
|
|
|
|
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;
|
|
};
|
|
|
|
POLYBAR_NS_END
|