From c76bbd205fc2fe7bf61619dfbb109608dd9da076 Mon Sep 17 00:00:00 2001 From: Justin Carpentier <justin.carpentier@inria.fr> Date: Thu, 18 Jul 2019 17:52:38 +0200 Subject: [PATCH] core: change the way ti expose Eigen::MatrixBase<Derived> --- include/eigenpy/details.hpp | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/include/eigenpy/details.hpp b/include/eigenpy/details.hpp index e502467c..3c52d662 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(); } }; -- GitLab