aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/api/ResourceManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/crepe/api/ResourceManager.cpp')
-rw-r--r--src/crepe/api/ResourceManager.cpp27
1 files changed, 21 insertions, 6 deletions
diff --git a/src/crepe/api/ResourceManager.cpp b/src/crepe/api/ResourceManager.cpp
index 6eb4afd..7877ed9 100644
--- a/src/crepe/api/ResourceManager.cpp
+++ b/src/crepe/api/ResourceManager.cpp
@@ -1,11 +1,11 @@
+#include <stdexcept>
+
#include "util/Log.h"
#include "ResourceManager.h"
-// default resource cache functions
-#include "../facade/Sound.h"
-
using namespace crepe;
+using namespace std;
ResourceManager & ResourceManager::get_instance() {
static ResourceManager instance;
@@ -19,8 +19,23 @@ void ResourceManager::clear() {
this->resources.clear();
}
-template <>
-Sound & ResourceManager::cache<Sound>(const Asset & asset) {
- return this->cache<Sound>(asset);
+template <typename T>
+T & ResourceManager::cache(const Asset & asset) {
+ dbg_trace();
+ static_assert(is_base_of<Resource, T>::value, "cache must recieve a derivative class of Resource");
+
+ if (!this->resources.contains(asset))
+ this->resources[asset] = make_unique<T>(asset);
+
+ Resource * resource = this->resources.at(asset).get();
+ T * concrete_resource = dynamic_cast<T *>(resource);
+
+ if (concrete_resource == nullptr)
+ throw runtime_error(format("ResourceManager: mismatch between requested type and actual type of resource ({})", asset.get_path()));
+
+ return *concrete_resource;
}
+#include "../facade/Sound.h"
+template Sound & ResourceManager::cache(const Asset &);
+