From 124b5b73b604ca4a973fc942e6b43417ee0b4e0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 14 Nov 2012 14:40:10 +0100 Subject: [PATCH] ResourceManager: wrap global instance pointer in a function. This way only single function can be marked with "extern template" to avoid nasty issues with multiple definition errors. --- src/ResourceManager.h | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/ResourceManager.h b/src/ResourceManager.h index b00732199..3935815ea 100644 --- a/src/ResourceManager.h +++ b/src/ResourceManager.h @@ -453,8 +453,8 @@ template class ResourceManager: protected Implementation::Resour public: /** @brief Global instance */ inline static ResourceManager* instance() { - CORRADE_ASSERT(_instance, "ResourceManager::instance(): no instance exists", nullptr); - return _instance; + CORRADE_ASSERT(internalInstance(), "ResourceManager::instance(): no instance exists", nullptr); + return internalInstance(); } /** @@ -466,8 +466,8 @@ template class ResourceManager: protected Implementation::Resour * @see instance() */ inline ResourceManager() { - CORRADE_ASSERT(!_instance, "ResourceManager::ResourceManager(): another instance is already created", ); - _instance = this; + CORRADE_ASSERT(!internalInstance(), "ResourceManager::ResourceManager(): another instance is already created", ); + internalInstance() = this; } /** @@ -477,8 +477,8 @@ template class ResourceManager: protected Implementation::Resour * @see instance() */ inline ~ResourceManager() { - CORRADE_INTERNAL_ASSERT(_instance == this); - _instance = nullptr; + CORRADE_INTERNAL_ASSERT(internalInstance() == this); + internalInstance() = nullptr; } /** @brief Count of resources of given type */ @@ -564,16 +564,19 @@ template class ResourceManager: protected Implementation::Resour } inline void freeInternal() const {} - static ResourceManager* _instance; + static ResourceManager*& internalInstance(); }; +template ResourceManager*& ResourceManager::internalInstance() { + static ResourceManager* _instance(nullptr); + return _instance; +} + /** @debugoperator{Magnum::ResourceKey} */ template inline Corrade::Utility::Debug operator<<(Corrade::Utility::Debug debug, const ResourceKey& value) { return debug << static_cast&>(value); } -template ResourceManager* ResourceManager::_instance(nullptr); - } #endif