diff --git a/include/eigenpy/details.hpp b/include/eigenpy/details.hpp index e502467cf4ce12d6b0708c547e6143cffa0695ca..3c52d662c004454448caca372cb7929adca1d217 100644 --- a/include/eigenpy/details.hpp +++ b/include/eigenpy/details.hpp @@ -425,6 +425,33 @@ namespace eigenpy } }; + template<typename MatType> + struct EigenFromPy< Eigen::MatrixBase<MatType> > + { + typedef EigenFromPy<MatType> EigenFromPyDerived; + typedef Eigen::MatrixBase<MatType> Base; + + /// \brief Determine if pyObj can be converted into a MatType object + static void* convertible(PyArrayObject* pyObj) + { + std::cout << "call: EigenFromPy< Eigen::MatrixBase<MatType> >::convertible" << std::endl; + return EigenFromPyDerived::convertible(pyObj); + } + + /// \brief Allocate memory and copy pyObj in the new storage + static void construct(PyObject* pyObj, + bp::converter::rvalue_from_python_stage1_data* memory) + { + std::cout << "call: EigenFromPy< Eigen::MatrixBase<MatType> >::construct" << std::endl; + EigenFromPyDerived::construct(pyObj,memory); + } + + static void registration() + { + bp::converter::registry::push_back + (reinterpret_cast<void *(*)(_object *)>(&EigenFromPy::convertible), + &EigenFromPy::construct,bp::type_id<Base>()); + } }; #define numpy_import_array() {if (_import_array() < 0) {PyErr_Print(); PyErr_SetString(PyExc_ImportError, "numpy.core.multiarray failed to import"); } } @@ -441,10 +468,10 @@ namespace eigenpy static void registration() { EigenFromPy<MatType>::registration(); + // Add also conversion to Eigen::MatrixBase<MatType> - bp::converter::registry::push_back - (reinterpret_cast<void *(*)(_object *)>(&EigenFromPy<MatType>::convertible), - &EigenFromPy<MatType>::construct,bp::type_id< Eigen::MatrixBase<MatType> >()); + typedef Eigen::MatrixBase<MatType> MatTypeBase; + EigenFromPy<MatTypeBase>::registration(); } };