23 ResourceCache(
const std::function<T(
const char*)>& loadFunction,
const std::function<
void(T)>& unloadFunction) :
24 m_loadFunction(loadFunction),
25 m_unloadFunction(unloadFunction)
31 for (
auto& [path,
object] : m_map)
33 m_unloadFunction(*
object);
37 T& Get(
const char* path)
39 auto it = m_map.find(path);
40 if (it != m_map.end())
45 auto ptr = std::make_unique<T>(std::move(m_loadFunction(path)));
48 m_map.emplace(path, std::move(ptr));
53 T& Add(
const T&
object,
const char* name)
55 auto it = m_map.find(name);
56 if (it != m_map.end())
58 m_unloadFunction(*it->second);
61 auto ptr = std::make_unique<T>(std::move(
object));
64 m_map.emplace(name, std::move(ptr));
69 void Remove(
const char* path)
71 auto it = m_map.find(path);
72 if (it != m_map.end())
74 m_unloadFunction(*it->second);
82 std::unordered_map<std::string, std::unique_ptr<T>> m_map;
84 std::function<T(
const char*)> m_loadFunction;
85 std::function<void(T)> m_unloadFunction;
92 template <
typename T,
typename... Args>
95 auto it = m_caches.find(
typeid(T));
96 Assert(it == m_caches.end(),
"Cache of type ",
typeid(T).name(),
" already exists");
98 auto ptr = std::make_unique<ResourceCache<T>>(std::forward<Args>(args)...);
101 m_caches.emplace(
typeid(T), std::move(ptr));
106 template <
typename T>
109 auto it = m_caches.find(
typeid(T));
110 Assert(it != m_caches.end(),
"No cache exists holding type ",
typeid(T).name());
115 template <
typename T>
118 auto it = m_caches.find(
typeid(T));
119 if (it != m_caches.end())
129 std::unordered_map<std::type_index, std::unique_ptr<Cache>> m_caches;