diff --git a/src/AbstractResourceLoader.h b/src/AbstractResourceLoader.h index 3c7e4e697..830297489 100644 --- a/src/AbstractResourceLoader.h +++ b/src/AbstractResourceLoader.h @@ -161,6 +161,11 @@ template class AbstractResourceLoader { */ void set(ResourceKey key, T* data, ResourceDataState state, ResourcePolicy policy); + /** @overload */ + template void set(ResourceKey key, U&& data, ResourceDataState state, ResourcePolicy policy) { + set(key, new typename std::remove_cv::type>::type(std::forward(data)), state, policy); + } + /** * @brief Set loaded resource to resource manager * @@ -171,6 +176,11 @@ template class AbstractResourceLoader { set(key, data, ResourceDataState::Final, ResourcePolicy::Resident); } + /** @overload */ + template void set(ResourceKey key, U&& data) { + set(key, new typename std::remove_cv::type>::type(std::forward(data))); + } + /** * @brief Mark resource as not found * diff --git a/src/ResourceManager.h b/src/ResourceManager.h index a1d4df745..b18393c49 100644 --- a/src/ResourceManager.h +++ b/src/ResourceManager.h @@ -313,17 +313,27 @@ template class ResourceManager: private Implementation::Resource return *this; } + /** @overload */ + template ResourceManager& set(ResourceKey key, U&& data, ResourceDataState state, ResourcePolicy policy) { + return set(key, new typename std::remove_cv::type>::type(std::forward(data)), state, policy); + } + /** * @brief Set resource data * @return Reference to self (for method chaining) * - * Same as above function with state set to @ref ResourceDataState "ResourceDataState::Final" + * Same as above with state set to @ref ResourceDataState "ResourceDataState::Final" * and policy to @ref ResourcePolicy "ResourcePolicy::Resident". */ template ResourceManager& set(ResourceKey key, T* data) { return set(key, data, ResourceDataState::Final, ResourcePolicy::Resident); } + /** @overload */ + template ResourceManager& set(ResourceKey key, U&& data) { + return set(key, new typename std::remove_cv::type>::type(std::forward(data))); + } + /** @brief Fallback for not found resources */ template T* fallback() { return this->Implementation::ResourceManagerData::fallback(); @@ -343,6 +353,11 @@ template class ResourceManager: private Implementation::Resource return *this; } + /** @overload */ + template ResourceManager& setFallback(U&& data) { + return setFallback(new typename std::remove_cv::type>::type(std::forward(data))); + } + /** * @brief Free all resources of given type which are not referenced * @return Reference to self (for method chaining) diff --git a/src/Test/ResourceManagerTest.cpp b/src/Test/ResourceManagerTest.cpp index c6d38cf02..92c325343 100644 --- a/src/Test/ResourceManagerTest.cpp +++ b/src/Test/ResourceManagerTest.cpp @@ -129,8 +129,7 @@ void ResourceManagerTest::stateDisallowed() { std::ostringstream out; Error::setOutput(&out); - Data d; - rm.set("data", &d, ResourceDataState::Loading, ResourcePolicy::Resident); + rm.set("data", Data(), ResourceDataState::Loading, ResourcePolicy::Resident); CORRADE_COMPARE(out.str(), "ResourceManager::set(): data should be null if and only if state is NotFound or Loading\n"); out.str({}); @@ -144,8 +143,8 @@ void ResourceManagerTest::basic() { /* One mutable, one final */ ResourceKey questionKey("the-question"); ResourceKey answerKey("the-answer"); - rm.set(questionKey, new Int(10), ResourceDataState::Mutable, ResourcePolicy::Resident); - rm.set(answerKey, new Int(42), ResourceDataState::Final, ResourcePolicy::Resident); + rm.set(questionKey, 10, ResourceDataState::Mutable, ResourcePolicy::Resident); + rm.set(answerKey, 42, ResourceDataState::Final, ResourcePolicy::Resident); Resource theQuestion = rm.get(questionKey); Resource theAnswer = rm.get(answerKey); @@ -159,12 +158,12 @@ void ResourceManagerTest::basic() { /* Cannot change already final resource */ std::ostringstream out; Error::setOutput(&out); - rm.set(answerKey, new Int(43), ResourceDataState::Mutable, ResourcePolicy::Resident); + rm.set(answerKey, 43, ResourceDataState::Mutable, ResourcePolicy::Resident); CORRADE_COMPARE(*theAnswer, 42); CORRADE_COMPARE(out.str(), "ResourceManager::set(): cannot change already final resource " + answerKey.hexString() + '\n'); /* But non-final can be changed */ - rm.set(questionKey, new Int(20), ResourceDataState::Final, ResourcePolicy::Resident); + rm.set(questionKey, 20, ResourceDataState::Final, ResourcePolicy::Resident); CORRADE_COMPARE(theQuestion.state(), ResourceState::Final); CORRADE_COMPARE(*theQuestion, 20); } @@ -250,7 +249,7 @@ void ResourceManagerTest::clearWhileReferenced() { Error::setOutput(&out); ResourceManager rm; - rm.set("blah", new Int); + rm.set("blah", Int()); /** @todo this will leak, is there any better solution without hitting assertion in decrementReferenceCount()? */ new Resource(rm.get("blah")); @@ -265,7 +264,7 @@ void ResourceManagerTest::loader() { IntResourceLoader(): resource(ResourceManager::instance().get("data")) {} void load() { - set("hello", new Int(773), ResourceDataState::Final, ResourcePolicy::Resident); + set("hello", 773, ResourceDataState::Final, ResourcePolicy::Resident); setNotFound("world"); }