Browse Source

Deprecate implicit conversion of Resource<T, U> 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.
pull/51/head
Vladimír Vondruš 12 years ago
parent
commit
c70f037add
  1. 12
      src/Magnum/DebugTools/Implementation/CapsuleRenderer.cpp
  2. 31
      src/Magnum/Resource.h

12
src/Magnum/DebugTools/Implementation/CapsuleRenderer.cpp

@ -45,21 +45,21 @@ AbstractCapsuleRenderer<2>::AbstractCapsuleRenderer(): AbstractShapeRenderer<2>(
/* Bottom hemisphere */ /* Bottom hemisphere */
if(!(bottom = ResourceManager::instance().get<MeshView>("capsule2d-bottom"))) { if(!(bottom = ResourceManager::instance().get<MeshView>("capsule2d-bottom"))) {
auto view = new MeshView(wireframeMesh); auto view = new MeshView(*wireframeMesh);
view->setIndexRange(0, rings*4, 0, rings*2+1); view->setIndexRange(0, rings*4, 0, rings*2+1);
ResourceManager::instance().set(bottom.key(), view, ResourceDataState::Final, ResourcePolicy::Manual); ResourceManager::instance().set(bottom.key(), view, ResourceDataState::Final, ResourcePolicy::Manual);
} }
/* Cylinder */ /* Cylinder */
if(!(cylinder = ResourceManager::instance().get<MeshView>("capsule2d-cylinder"))) { if(!(cylinder = ResourceManager::instance().get<MeshView>("capsule2d-cylinder"))) {
auto view = new MeshView(wireframeMesh); auto view = new MeshView(*wireframeMesh);
view->setIndexRange(rings*4, 4, rings*2+1, rings*2+3); view->setIndexRange(rings*4, 4, rings*2+1, rings*2+3);
ResourceManager::instance().set(cylinder.key(), view, ResourceDataState::Final, ResourcePolicy::Manual); ResourceManager::instance().set(cylinder.key(), view, ResourceDataState::Final, ResourcePolicy::Manual);
} }
/* Top hemisphere */ /* Top hemisphere */
if(!(top = ResourceManager::instance().get<MeshView>("capsule2d-top"))) { if(!(top = ResourceManager::instance().get<MeshView>("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); view->setIndexRange(rings*4+4, rings*4, rings*2+3, rings*4+4);
ResourceManager::instance().set(top.key(), view, ResourceDataState::Final, ResourcePolicy::Manual); ResourceManager::instance().set(top.key(), view, ResourceDataState::Final, ResourcePolicy::Manual);
} }
@ -72,21 +72,21 @@ AbstractCapsuleRenderer<3>::AbstractCapsuleRenderer(): AbstractShapeRenderer<3>(
/* Bottom hemisphere */ /* Bottom hemisphere */
if(!(bottom = ResourceManager::instance().get<MeshView>("capsule3d-bottom"))) { if(!(bottom = ResourceManager::instance().get<MeshView>("capsule3d-bottom"))) {
auto view = new MeshView(wireframeMesh); auto view = new MeshView(*wireframeMesh);
view->setIndexRange(0, rings*8, 0, rings*4+1); view->setIndexRange(0, rings*8, 0, rings*4+1);
ResourceManager::instance().set(bottom.key(), view, ResourceDataState::Final, ResourcePolicy::Manual); ResourceManager::instance().set(bottom.key(), view, ResourceDataState::Final, ResourcePolicy::Manual);
} }
/* Cylinder */ /* Cylinder */
if(!(cylinder = ResourceManager::instance().get<MeshView>("capsule3d-cylinder"))) { if(!(cylinder = ResourceManager::instance().get<MeshView>("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); 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); ResourceManager::instance().set(cylinder.key(), view, ResourceDataState::Final, ResourcePolicy::Manual);
} }
/* Top */ /* Top */
if(!(top = ResourceManager::instance().get<MeshView>("capsule3d-top"))) { if(!(top = ResourceManager::instance().get<MeshView>("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); 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); ResourceManager::instance().set(top.key(), view, ResourceDataState::Final, ResourcePolicy::Manual);
} }

31
src/Magnum/Resource.h

@ -191,28 +191,39 @@ class Resource {
* @brief Reference to resource data * @brief Reference to resource data
* *
* The resource must be loaded before accessing it. Use boolean * 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(); acquire();
CORRADE_ASSERT(data, "Resource: accessing not loaded data with key" << key(), *static_cast<U*>(data)); CORRADE_ASSERT(data, "Resource: accessing not loaded data with key" << key(), *static_cast<U*>(data));
return *static_cast<U*>(data); return *static_cast<U*>(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->() { U* operator->() {
acquire(); acquire();
CORRADE_ASSERT(data, "Resource: accessing not loaded data with key" << key(), nullptr); CORRADE_ASSERT(data, "Resource: accessing not loaded data with key" << key(), nullptr);
return static_cast<U*>(data); return static_cast<U*>(data);
} }
/** @overload */
U& operator*() {
acquire();
CORRADE_ASSERT(data, "Resource: accessing not loaded data with key" << key(), *static_cast<U*>(data));
return *static_cast<U*>(data);
}
private: private:
Resource(Implementation::ResourceManagerData<T>* manager, ResourceKey key): manager(manager), _key(key), lastCheck(0), _state(ResourceState::NotLoaded), data(nullptr) { Resource(Implementation::ResourceManagerData<T>* manager, ResourceKey key): manager(manager), _key(key), lastCheck(0), _state(ResourceState::NotLoaded), data(nullptr) {
manager->incrementReferenceCount(key); manager->incrementReferenceCount(key);

Loading…
Cancel
Save