4#include "NonCopyable.hpp"
11#include <shared_mutex>
14#include <unordered_map>
26class Cache :
public NonCopyable<>
30 virtual ~Cache() =
default;
43template <
class Resource>
54 ResourceCache(
const std::function<std::optional<Resource>(
const std::string&)>& loadFunction,
55 const std::function<
void(Resource)>& unloadFunction) :
56 m_loadFunction(loadFunction),
57 m_unloadFunction(unloadFunction)
70 std::shared_ptr<Resource>
Get(
const std::string& name)
72 std::shared_lock lock(m_mutex);
74 auto it = m_map.find(name);
75 if (it != m_map.end())
91 std::shared_ptr<Resource>
Load(
const std::string& path)
93 std::optional<Resource> opt = m_loadFunction(path);
100 auto unload = m_unloadFunction;
102 auto ptr = std::shared_ptr<Resource>(
new Resource(std::move(*opt)), [unload](Resource* resource)
109 std::unique_lock lock(m_mutex);
126 std::shared_ptr<Resource>
Add(Resource&&
object,
const std::string& name)
128 auto unload = m_unloadFunction;
130 auto ptr = std::shared_ptr<Resource>(
new Resource(std::move(
object)), [unload](Resource* resource)
137 std::unique_lock lock(m_mutex);
155 std::unique_lock lock(m_mutex);
162 std::unordered_map<std::string, std::shared_ptr<Resource>> m_map;
164 std::function<std::optional<Resource>(
const std::string&)> m_loadFunction;
165 std::function<void(Resource)> m_unloadFunction;
167 std::shared_mutex m_mutex;
192 template <
typename Resource,
typename... Args>
193 std::shared_ptr<ResourceCache<Resource>>
AddCache(Args&&... args)
195 std::unique_lock lock(m_mutex);
197 auto it = m_caches.find(
typeid(Resource));
198 if (it != m_caches.end())
200 return std::static_pointer_cast<ResourceCache<Resource>>(it->second);
203 auto ptr = std::make_shared<ResourceCache<Resource>>(std::forward<Args>(args)...);
205 m_caches.emplace(
typeid(Resource), ptr);
218 template <
typename Resource>
219 std::shared_ptr<ResourceCache<Resource>>
GetCache()
221 std::shared_lock lock(m_mutex);
223 auto it = m_caches.find(
typeid(Resource));
224 Assert(it != m_caches.end(),
"No cache exists holding type ",
typeid(Resource).name());
226 return std::static_pointer_cast<ResourceCache<Resource>>(it->second);
237 template <
typename Resource>
240 std::unique_lock lock(m_mutex);
242 m_caches.erase(
typeid(Resource));
257 std::shared_mutex m_mutex;
259 std::unordered_map<std::type_index, std::shared_ptr<Cache>> m_caches;
Abstract base for type-erased resource caches.
Definition ResourceManager.hpp:27
Core engine.
Definition Engine.hpp:90
Thread-safe cache for a single resource type.
Definition ResourceManager.hpp:45
std::shared_ptr< Resource > Load(const std::string &path)
Loads a resource from disk and caches it under its path.
Definition ResourceManager.hpp:91
std::shared_ptr< Resource > Add(Resource &&object, const std::string &name)
Stores an already-constructed resource under an arbitrary name.
Definition ResourceManager.hpp:126
std::shared_ptr< Resource > Get(const std::string &name)
Looks up a cached resource by name without loading it.
Definition ResourceManager.hpp:70
ResourceCache(const std::function< std::optional< Resource >(const std::string &)> &loadFunction, const std::function< void(Resource)> &unloadFunction)
Constructs a cache with the given load and unload functions.
Definition ResourceManager.hpp:54
void Remove(const std::string &path)
Removes a resource from the cache.
Definition ResourceManager.hpp:153
Owns a collection of typed resource caches.
Definition ResourceManager.hpp:179
void RemoveCache()
Removes the cache for the given resource type.
Definition ResourceManager.hpp:238
std::shared_ptr< ResourceCache< Resource > > GetCache()
Returns the cache for the given resource type.
Definition ResourceManager.hpp:219
std::shared_ptr< ResourceCache< Resource > > AddCache(Args &&... args)
Creates and registers a cache for a resource type.
Definition ResourceManager.hpp:193
void ClearCaches()
Removes all registered caches.
Definition ResourceManager.cpp:3