From ceb150f6d6ea445795e76c5239036a579ba2e487 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 8 Feb 2014 22:39:40 +0100 Subject: [PATCH] SceneGraph: workaround ambiguous overloads on deprecated GCC < 4.7 build. GCC 4.7 cannot detect proper overload based on arguments in initializer list constructor of some type, thus we need to provide explicit overload taking std::initializer_lists. --- src/Magnum/SceneGraph/AbstractObject.h | 18 ++++++++++++++++ src/Magnum/SceneGraph/Object.h | 27 +++++++++++++++++++++++ src/Magnum/SceneGraph/Object.hpp | 30 ++++++++++++++++++++++++++ 3 files changed, 75 insertions(+) diff --git a/src/Magnum/SceneGraph/AbstractObject.h b/src/Magnum/SceneGraph/AbstractObject.h index f02872d09..d464e2702 100644 --- a/src/Magnum/SceneGraph/AbstractObject.h +++ b/src/Magnum/SceneGraph/AbstractObject.h @@ -165,6 +165,15 @@ template class AbstractObject * @deprecated Use @ref Magnum::SceneGraph::AbstractObject::transformationMatrices(const std::vector>>&, const MatrixType&) "transformationMatrices(const std::vector>>&, const MatrixType&)" instead. */ CORRADE_DEPRECATED("use transformationMatrices(const std::vector>>&, const MatrixType&) instead") std::vector transformationMatrices(const std::vector*>& objects, const MatrixType& initialTransformationMatrix = MatrixType()) const; + + #ifdef CORRADE_GCC47_COMPATIBILITY + /* Workarounds to avoid ambiguous overload errors on GCC < 4.8. And I + thought 4.7 was bug-free. */ + std::vector transformationMatrices(std::initializer_list>>& objects, const MatrixType& initialTransformationMatrix = MatrixType()) { + return transformationMatrices(std::vector>>{objects}, initialTransformationMatrix); + } + CORRADE_DEPRECATED("use transformationMatrices(const std::vector>>&, const MatrixType&) instead") std::vector transformationMatrices(std::initializer_list*> objects, const MatrixType& initialTransformationMatrix = MatrixType()) const; + #endif #endif /*@}*/ @@ -194,6 +203,15 @@ template class AbstractObject * @deprecated Use @ref Magnum::SceneGraph::AbstractObject::setClean(const std::vector>>&) "setClean(const std::vector>>&)" instead. */ static CORRADE_DEPRECATED("use setClean(const std::vector>>&) instead") void setClean(const std::vector*>& objects); + + #ifdef CORRADE_GCC47_COMPATIBILITY + /* Workarounds to avoid ambiguous overload errors on GCC < 4.8. And I + thought 4.7 was bug-free. */ + static void setClean(std::initializer_list>> objects) { + return setClean(std::vector>>{objects}); + } + static CORRADE_DEPRECATED("use setClean(const std::vector>>&) instead") void setClean(std::initializer_list*> objects); + #endif #endif /** diff --git a/src/Magnum/SceneGraph/Object.h b/src/Magnum/SceneGraph/Object.h index 74fcdd6e1..027d8b8f9 100644 --- a/src/Magnum/SceneGraph/Object.h +++ b/src/Magnum/SceneGraph/Object.h @@ -257,6 +257,15 @@ template class Object: public AbstractObject>>&, const MatrixType&) "transformationMatrices(const std::vector>>&, const MatrixType&)" instead. */ CORRADE_DEPRECATED("use transformationMatrices(const std::vector>>&, const MatrixType&) instead") std::vector transformationMatrices(const std::vector*>& objects, const MatrixType& initialTransformationMatrix = MatrixType()) const; + + #ifdef CORRADE_GCC47_COMPATIBILITY + /* Workarounds to avoid ambiguous overload errors on GCC < 4.8. And I + thought 4.7 was bug-free. */ + std::vector transformationMatrices(std::initializer_list>> objects, const MatrixType& initialTransformationMatrix = MatrixType()) const { + return transformationMatrices(std::vector>>{objects}, initialTransformationMatrix); + } + CORRADE_DEPRECATED("use transformationMatrices(const std::vector>>&, const MatrixType&) instead") std::vector transformationMatrices(std::initializer_list*> objects, const MatrixType& initialTransformationMatrix = MatrixType()) const; + #endif #endif /** @@ -276,6 +285,15 @@ template class Object: public AbstractObject>>, const typename Transformation::DataType&) "transformations(std::vector>>, const typename Transformation::DataType&)" instead. */ CORRADE_DEPRECATED("use transformations(std::vector>>, const typename Transformation::DataType&) instead") std::vector transformations(std::vector*> objects, const typename Transformation::DataType& initialTransformation = typename Transformation::DataType()) const; + + #ifdef CORRADE_GCC47_COMPATIBILITY + /* Workarounds to avoid ambiguous overload errors on GCC < 4.8. And I + thought 4.7 was bug-free. */ + std::vector transformations(std::initializer_list>> objects, const typename Transformation::DataType& initialTransformation = typename Transformation::DataType()) const { + return transformations(std::vector>>{objects}, initialTransformation); + } + CORRADE_DEPRECATED("use transformations(std::vector>>, const typename Transformation::DataType&) instead") std::vector transformations(std::initializer_list*> objects, const typename Transformation::DataType& initialTransformation = typename Transformation::DataType()) const; + #endif #endif /*@}*/ @@ -301,6 +319,15 @@ template class Object: public AbstractObject>> "setClean(std::vector>>" instead. */ CORRADE_DEPRECATED("use setClean(std::vector>>) instead") static void setClean(std::vector*> objects); + + #ifdef CORRADE_GCC47_COMPATIBILITY + /* Workarounds to avoid ambiguous overload errors on GCC < 4.8. And I + thought 4.7 was bug-free. */ + static void setClean(std::initializer_list>> objects) { + setClean(std::vector>>{objects}); + } + static CORRADE_DEPRECATED("use setClean(std::vector>>) instead") void setClean(std::initializer_list*> objects); + #endif #endif /** @copydoc AbstractObject::isDirty() */ diff --git a/src/Magnum/SceneGraph/Object.hpp b/src/Magnum/SceneGraph/Object.hpp index 9c2ea5c12..633124f50 100644 --- a/src/Magnum/SceneGraph/Object.hpp +++ b/src/Magnum/SceneGraph/Object.hpp @@ -49,6 +49,12 @@ template void AbstractObject::se setClean(references); } + +#ifdef CORRADE_GCC47_COMPATIBILITY +template void AbstractObject::setClean(std::initializer_list*> objects) { + return setClean(std::vector*>{objects}); +} +#endif #endif template AbstractObject::AbstractObject() {} @@ -65,6 +71,12 @@ template auto AbstractObject::tr return transformationMatrices(references, initialTransformationMatrix); } + +#ifdef CORRADE_GCC47_COMPATIBILITY +template auto AbstractObject::transformationMatrices(std::initializer_list*> objects, const MatrixType& initialTransformationMatrix) const -> std::vector { + return transformationMatrices(std::vector*>{objects}, initialTransformationMatrix); +} +#endif #endif template AbstractTransformation::AbstractTransformation() {} @@ -219,6 +231,12 @@ template auto Object::transformationMatric return transformationMatrices(references, initialTransformationMatrix); } + +#ifdef CORRADE_GCC47_COMPATIBILITY +template auto Object::transformationMatrices(std::initializer_list*> objects, const MatrixType& initialTransformationMatrix) const -> std::vector { + return transformationMatrices(std::vector*>{objects}, initialTransformationMatrix); +} +#endif #endif /* @@ -339,6 +357,12 @@ template std::vector Ob return transformations(references, initialTransformation); } + +#ifdef CORRADE_GCC47_COMPATIBILITY +template std::vector Object::transformations(std::initializer_list*> objects, const typename Transformation::DataType& initialTransformation) const { + return transformations(std::vector*>{objects}, initialTransformation); +} +#endif #endif template typename Transformation::DataType Object::computeJointTransformation(const std::vector>>& jointObjects, std::vector& jointTransformations, const std::size_t joint, const typename Transformation::DataType& initialTransformation) const { @@ -437,6 +461,12 @@ template void Object::setClean(std::vector return setClean(references); } + +#ifdef CORRADE_GCC47_COMPATIBILITY +template void Object::setClean(std::initializer_list*> objects) { + setClean(std::vector*>{objects}); +} +#endif #endif template void Object::setCleanInternal(const typename Transformation::DataType& absoluteTransformation) {