From c70f037add32a11ce444b02cb84d3ddbdea234bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 4 Feb 2014 12:03:33 +0100 Subject: [PATCH] Deprecate implicit conversion of Resource to U&. We are allowing implicit conversions only if they are harmless and this is *not* harmless, as it might fire an assertion. The user should use operator*() or operator->() instead, which will make these conversions stand out more in the code. Also reduced code duplication. --- .../Implementation/CapsuleRenderer.cpp | 12 +++---- src/Magnum/Resource.h | 31 +++++++++++++------ 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/Magnum/DebugTools/Implementation/CapsuleRenderer.cpp b/src/Magnum/DebugTools/Implementation/CapsuleRenderer.cpp index c897e9d97..5007e1e81 100644 --- a/src/Magnum/DebugTools/Implementation/CapsuleRenderer.cpp +++ b/src/Magnum/DebugTools/Implementation/CapsuleRenderer.cpp @@ -45,21 +45,21 @@ AbstractCapsuleRenderer<2>::AbstractCapsuleRenderer(): AbstractShapeRenderer<2>( /* Bottom hemisphere */ if(!(bottom = ResourceManager::instance().get("capsule2d-bottom"))) { - auto view = new MeshView(wireframeMesh); + auto view = new MeshView(*wireframeMesh); view->setIndexRange(0, rings*4, 0, rings*2+1); ResourceManager::instance().set(bottom.key(), view, ResourceDataState::Final, ResourcePolicy::Manual); } /* Cylinder */ if(!(cylinder = ResourceManager::instance().get("capsule2d-cylinder"))) { - auto view = new MeshView(wireframeMesh); + auto view = new MeshView(*wireframeMesh); view->setIndexRange(rings*4, 4, rings*2+1, rings*2+3); ResourceManager::instance().set(cylinder.key(), view, ResourceDataState::Final, ResourcePolicy::Manual); } /* Top hemisphere */ if(!(top = ResourceManager::instance().get("capsule2d-top"))) { - auto view = new MeshView(wireframeMesh); + auto view = new MeshView(*wireframeMesh); view->setIndexRange(rings*4+4, rings*4, rings*2+3, rings*4+4); ResourceManager::instance().set(top.key(), view, ResourceDataState::Final, ResourcePolicy::Manual); } @@ -72,21 +72,21 @@ AbstractCapsuleRenderer<3>::AbstractCapsuleRenderer(): AbstractShapeRenderer<3>( /* Bottom hemisphere */ if(!(bottom = ResourceManager::instance().get("capsule3d-bottom"))) { - auto view = new MeshView(wireframeMesh); + auto view = new MeshView(*wireframeMesh); view->setIndexRange(0, rings*8, 0, rings*4+1); ResourceManager::instance().set(bottom.key(), view, ResourceDataState::Final, ResourcePolicy::Manual); } /* Cylinder */ if(!(cylinder = ResourceManager::instance().get("capsule3d-cylinder"))) { - auto view = new MeshView(wireframeMesh); + auto view = new MeshView(*wireframeMesh); view->setIndexRange(rings*8, segments*4+8, rings*4+1, rings*4+segments*2+5); ResourceManager::instance().set(cylinder.key(), view, ResourceDataState::Final, ResourcePolicy::Manual); } /* Top */ if(!(top = ResourceManager::instance().get("capsule3d-top"))) { - auto view = new MeshView(wireframeMesh); + auto view = new MeshView(*wireframeMesh); view->setIndexRange(rings*8+segments*4+8, rings*8, rings*4+segments*2+5, rings*8+segments*2+6); ResourceManager::instance().set(top.key(), view, ResourceDataState::Final, ResourcePolicy::Manual); } diff --git a/src/Magnum/Resource.h b/src/Magnum/Resource.h index 77f472722..57d701a03 100644 --- a/src/Magnum/Resource.h +++ b/src/Magnum/Resource.h @@ -191,28 +191,39 @@ class Resource { * @brief Reference to resource data * * The resource must be loaded before accessing it. Use boolean - * conversion operator or state() for testing whether it is loaded. + * conversion operator or @ref state() for testing whether it is + * loaded. */ - operator U&() { + U& operator*() { acquire(); CORRADE_ASSERT(data, "Resource: accessing not loaded data with key" << key(), *static_cast(data)); return *static_cast(data); } - /** @overload */ + #ifdef MAGNUM_BUILD_DEPRECATED + /** + * @overload + * @deprecated Use the explicit @ref Magnum::Resource::operator*() "operator*()" or + * @ref Magnum::Resource::operator->() "operator->()" instead. + * Implicit conversion is no longer allowed if it might throw an + * assertion. + */ + CORRADE_DEPRECATED("use operator*() or operator->() instead") operator U&() { return **this; } + #endif + + /** + * @brief Access to resource data + * + * The resource must be loaded before accessing it. Use boolean + * conversion operator or @ref state() for testing whether it is + * loaded. + */ U* operator->() { acquire(); CORRADE_ASSERT(data, "Resource: accessing not loaded data with key" << key(), nullptr); return static_cast(data); } - /** @overload */ - U& operator*() { - acquire(); - CORRADE_ASSERT(data, "Resource: accessing not loaded data with key" << key(), *static_cast(data)); - return *static_cast(data); - } - private: Resource(Implementation::ResourceManagerData* manager, ResourceKey key): manager(manager), _key(key), lastCheck(0), _state(ResourceState::NotLoaded), data(nullptr) { manager->incrementReferenceCount(key);