diff --git a/include/eigenpy/eigen-from-python.hpp b/include/eigenpy/eigen-from-python.hpp index 1a55bcbaba45bdba843a86a979c41bf5f046fb3c..f8616598722fa23764706a0206e0a151514a555b 100644 --- a/include/eigenpy/eigen-from-python.hpp +++ b/include/eigenpy/eigen-from-python.hpp @@ -275,13 +275,13 @@ namespace eigenpy memory->convertible = storage->storage.bytes; } - template<typename MatType> + template<typename MatType, typename _Scalar> struct EigenFromPy { typedef typename MatType::Scalar Scalar; /// \brief Determine if pyObj can be converted into a MatType object - static void* convertible(PyArrayObject* pyArray); + static void* convertible(PyObject* pyObj); /// \brief Allocate memory and copy pyObj in the new storage static void construct(PyObject* pyObj, @@ -290,12 +290,14 @@ namespace eigenpy static void registration(); }; - template<typename MatType> - void* EigenFromPy<MatType>::convertible(PyArrayObject* pyArray) + template<typename MatType, typename _Scalar> + void* EigenFromPy<MatType,_Scalar>::convertible(PyObject* pyObj) { - if(!call_PyArray_Check(reinterpret_cast<PyObject*>(pyArray))) + if(!call_PyArray_Check(reinterpret_cast<PyObject*>(pyObj))) return 0; + PyArrayObject * pyArray = reinterpret_cast<PyArrayObject*>(pyObj); + if(!np_type_is_convertible_into_scalar<Scalar>(EIGENPY_GET_PY_ARRAY_TYPE(pyArray))) return 0; @@ -403,15 +405,15 @@ namespace eigenpy return pyArray; } - template<typename MatType> - void EigenFromPy<MatType>::construct(PyObject* pyObj, - bp::converter::rvalue_from_python_stage1_data* memory) + template<typename MatType, typename _Scalar> + void EigenFromPy<MatType,_Scalar>::construct(PyObject* pyObj, + bp::converter::rvalue_from_python_stage1_data* memory) { eigen_from_py_construct<MatType>(pyObj,memory); } - template<typename MatType> - void EigenFromPy<MatType>::registration() + template<typename MatType, typename _Scalar> + void EigenFromPy<MatType,_Scalar>::registration() { bp::converter::registry::push_back (reinterpret_cast<void *(*)(_object *)>(&EigenFromPy::convertible), @@ -431,7 +433,7 @@ namespace eigenpy // Add conversion to Eigen::EigenBase<MatType> typedef Eigen::EigenBase<MatType> EigenBase; - EigenFromPy<EigenBase>::registration(); + EigenFromPy<EigenBase,typename MatType::Scalar>::registration(); // Add conversion to Eigen::PlainObjectBase<MatType> typedef Eigen::PlainObjectBase<MatType> PlainObjectBase; @@ -449,8 +451,8 @@ namespace eigenpy } }; - template<typename MatType> - struct EigenFromPy< Eigen::MatrixBase<MatType> > : EigenFromPy<MatType> + template<typename MatType, typename _Scalar> + struct EigenFromPy< Eigen::MatrixBase<MatType>, _Scalar > : EigenFromPy<MatType> { typedef EigenFromPy<MatType> EigenFromPyDerived; typedef Eigen::MatrixBase<MatType> Base; @@ -463,8 +465,8 @@ namespace eigenpy } }; - template<typename MatType> - struct EigenFromPy< Eigen::EigenBase<MatType> > : EigenFromPy<MatType> + template<typename MatType, typename _Scalar> + struct EigenFromPy< Eigen::EigenBase<MatType>, _Scalar > : EigenFromPy<MatType> { typedef EigenFromPy<MatType> EigenFromPyDerived; typedef Eigen::EigenBase<MatType> Base; @@ -477,8 +479,8 @@ namespace eigenpy } }; - template<typename MatType> - struct EigenFromPy< Eigen::PlainObjectBase<MatType> > : EigenFromPy<MatType> + template<typename MatType, typename _Scalar> + struct EigenFromPy< Eigen::PlainObjectBase<MatType>, _Scalar > : EigenFromPy<MatType> { typedef EigenFromPy<MatType> EigenFromPyDerived; typedef Eigen::PlainObjectBase<MatType> Base; @@ -493,20 +495,21 @@ namespace eigenpy #if EIGEN_VERSION_AT_LEAST(3,2,0) - template<typename MatType, int Options, typename Stride> - struct EigenFromPy<Eigen::Ref<MatType,Options,Stride> > + template<typename MatType, int Options, typename Stride, typename _Scalar> + struct EigenFromPy<Eigen::Ref<MatType,Options,Stride>,_Scalar> { typedef Eigen::Ref<MatType,Options,Stride> RefType; typedef typename MatType::Scalar Scalar; /// \brief Determine if pyObj can be converted into a MatType object - static void* convertible(PyArrayObject * pyArray) + static void* convertible(PyObject * pyObj) { - if(!call_PyArray_Check(reinterpret_cast<PyObject*>(pyArray))) + if(!call_PyArray_Check(pyObj)) return 0; + PyArrayObject * pyArray = reinterpret_cast<PyArrayObject*>(pyObj); if(!PyArray_ISWRITEABLE(pyArray)) return 0; - return EigenFromPy<MatType>::convertible(pyArray); + return EigenFromPy<MatType>::convertible(pyObj); } static void registration() @@ -517,16 +520,16 @@ namespace eigenpy } }; - template<typename MatType, int Options, typename Stride> - struct EigenFromPy<const Eigen::Ref<const MatType,Options,Stride> > + template<typename MatType, int Options, typename Stride, typename _Scalar> + struct EigenFromPy<const Eigen::Ref<const MatType,Options,Stride>,_Scalar> { typedef const Eigen::Ref<const MatType,Options,Stride> ConstRefType; typedef typename MatType::Scalar Scalar; /// \brief Determine if pyObj can be converted into a MatType object - static void* convertible(PyArrayObject * pyArray) + static void* convertible(PyObject * pyObj) { - return EigenFromPy<MatType>::convertible(pyArray); + return EigenFromPy<MatType>::convertible(pyObj); } static void registration() diff --git a/include/eigenpy/fwd.hpp b/include/eigenpy/fwd.hpp index 3028c6ffd0de62c695825a10c0867337f1ee0208..02ec33450b7c1c6f24e63fe3e96d8a2b6b8a88f2 100644 --- a/include/eigenpy/fwd.hpp +++ b/include/eigenpy/fwd.hpp @@ -28,8 +28,8 @@ namespace eigenpy { - template<typename MatType> struct EigenFromPy; template<typename MatType, typename Scalar = typename boost::remove_reference<MatType>::type::Scalar> struct EigenToPy; + template<typename MatType, typename Scalar = typename boost::remove_reference<MatType>::type::Scalar> struct EigenFromPy; } #endif // ifndef __eigenpy_fwd_hpp__