From 9d26d65d4a17f107b3073598310f0bee86b47d3e Mon Sep 17 00:00:00 2001
From: Justin Carpentier <justin.carpentier@inria.fr>
Date: Thu, 18 Jul 2019 14:29:55 +0200
Subject: [PATCH] core: improve efficiency of memory mapping from Eigen to
 Python

---
 include/eigenpy/details.hpp | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/include/eigenpy/details.hpp b/include/eigenpy/details.hpp
index 92df398a..73f87f5f 100644
--- a/include/eigenpy/details.hpp
+++ b/include/eigenpy/details.hpp
@@ -18,7 +18,6 @@
 
 #define GET_PY_ARRAY_TYPE(array) PyArray_ObjectType(reinterpret_cast<PyObject *>(array), 0)
 
-
 namespace eigenpy
 {
   template <typename SCALAR>  struct NumpyEquivalentType {};
@@ -160,19 +159,38 @@ namespace eigenpy
         *mat_ptr = MapNumpy<MatType,double>::map(pyArray).template cast<Scalar>();
     }
     
-    static void convert(Type const & mat , PyArrayObject * pyArray)
+    /// \brief Copy mat into the Python array using Eigen::Map
+    static void convert(Type const & mat, PyArrayObject * pyArray)
     {
+      if(NumpyEquivalentType<Scalar>::type_code == GET_PY_ARRAY_TYPE(pyArray))
+      {
+        MapNumpy<MatType,Scalar>::map(pyArray) = mat; // no cast needed
+        return;
+      }
+      
       if(GET_PY_ARRAY_TYPE(pyArray) == NPY_INT)
+      {
         MapNumpy<MatType,int>::map(pyArray) = mat.template cast<int>();
+        return;
+      }
       
       if(GET_PY_ARRAY_TYPE(pyArray) == NPY_LONG)
+      {
         MapNumpy<MatType,long>::map(pyArray) = mat.template cast<long>();
+        return;
+      }
       
       if(GET_PY_ARRAY_TYPE(pyArray) == NPY_FLOAT)
+      {
         MapNumpy<MatType,float>::map(pyArray) = mat.template cast<float>();
+        return;
+      }
       
       if(GET_PY_ARRAY_TYPE(pyArray) == NPY_DOUBLE)
+      {
         MapNumpy<MatType,double>::map(pyArray) = mat.template cast<double>();
+        return;
+      }
     }
   };
   
-- 
GitLab