diff options
Diffstat (limited to 'src/crepe/api/ResourceManager.cpp')
| -rw-r--r-- | src/crepe/api/ResourceManager.cpp | 27 | 
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 &); + |