From 5e7ae5b1eccd738749f32ee8f4a3dabf921ae07f Mon Sep 17 00:00:00 2001
From: Justin Carpentier <justin.carpentier@inria.fr>
Date: Sun, 23 Feb 2020 18:05:56 +0100
Subject: [PATCH] core: add helper np_type_is_convertible_into_scalar

---
 include/eigenpy/eigen-from-python.hpp | 31 ++-------------------------
 include/eigenpy/numpy-type.hpp        | 30 ++++++++++++++++++++++++++
 2 files changed, 32 insertions(+), 29 deletions(-)

diff --git a/include/eigenpy/eigen-from-python.hpp b/include/eigenpy/eigen-from-python.hpp
index 9bfbcb99..c9bf04cf 100644
--- a/include/eigenpy/eigen-from-python.hpp
+++ b/include/eigenpy/eigen-from-python.hpp
@@ -86,34 +86,7 @@ namespace eigenpy
   template<typename MatType>
   struct EigenFromPy
   {
-    
-    static bool isScalarConvertible(const int np_type)
-    {
-      if(NumpyEquivalentType<typename MatType::Scalar>::type_code == np_type)
-        return true;
-      
-      switch(np_type)
-      {
-        case NPY_INT:
-          return FromTypeToType<int,typename MatType::Scalar>::value;
-        case NPY_LONG:
-          return FromTypeToType<long,typename MatType::Scalar>::value;
-        case NPY_FLOAT:
-          return FromTypeToType<float,typename MatType::Scalar>::value;
-        case NPY_CFLOAT:
-          return FromTypeToType<std::complex<float>,typename MatType::Scalar>::value;
-        case NPY_DOUBLE:
-          return FromTypeToType<double,typename MatType::Scalar>::value;
-        case NPY_CDOUBLE:
-          return FromTypeToType<std::complex<double>,typename MatType::Scalar>::value;
-        case NPY_LONGDOUBLE:
-          return FromTypeToType<long double,typename MatType::Scalar>::value;
-        case NPY_CLONGDOUBLE:
-          return FromTypeToType<std::complex<long double>,typename MatType::Scalar>::value;
-        default:
-          return false;
-      }
-    }
+    typedef typename MatType::Scalar Scalar;
     
     /// \brief Determine if pyObj can be converted into a MatType object
     static void* convertible(PyArrayObject* pyArray)
@@ -121,7 +94,7 @@ namespace eigenpy
       if(!PyArray_Check(pyArray))
         return 0;
       
-      if(!isScalarConvertible(EIGENPY_GET_PY_ARRAY_TYPE(pyArray)))
+      if(!np_type_is_convertible_into_scalar<Scalar>(EIGENPY_GET_PY_ARRAY_TYPE(pyArray)))
         return 0;
 
       if(MatType::IsVectorAtCompileTime)
diff --git a/include/eigenpy/numpy-type.hpp b/include/eigenpy/numpy-type.hpp
index 2bf7d03b..3085b55e 100644
--- a/include/eigenpy/numpy-type.hpp
+++ b/include/eigenpy/numpy-type.hpp
@@ -6,6 +6,7 @@
 #define __eigenpy_numpy_type_hpp__
 
 #include "eigenpy/fwd.hpp"
+#include "eigenpy/scalar-conversion.hpp"
 
 #include <patchlevel.h> // For PY_MAJOR_VERSION
 
@@ -23,6 +24,35 @@ namespace eigenpy
   template <> struct NumpyEquivalentType< std::complex<long double> >  { enum { type_code = NPY_CLONGDOUBLE };};
   template <> struct NumpyEquivalentType<int>     { enum { type_code = NPY_INT    };};
   template <> struct NumpyEquivalentType<long>    { enum { type_code = NPY_LONG    };};
+
+  template<typename Scalar>
+  bool np_type_is_convertible_into_scalar(const int np_type)
+  {
+    if(NumpyEquivalentType<Scalar>::type_code == np_type)
+      return true;
+    
+    switch(np_type)
+    {
+      case NPY_INT:
+        return FromTypeToType<int,Scalar>::value;
+      case NPY_LONG:
+        return FromTypeToType<long,Scalar>::value;
+      case NPY_FLOAT:
+        return FromTypeToType<float,Scalar>::value;
+      case NPY_CFLOAT:
+        return FromTypeToType<std::complex<float>,Scalar>::value;
+      case NPY_DOUBLE:
+        return FromTypeToType<double,Scalar>::value;
+      case NPY_CDOUBLE:
+        return FromTypeToType<std::complex<double>,Scalar>::value;
+      case NPY_LONGDOUBLE:
+        return FromTypeToType<long double,Scalar>::value;
+      case NPY_CLONGDOUBLE:
+        return FromTypeToType<std::complex<long double>,Scalar>::value;
+      default:
+        return false;
+    }
+  }
    
   enum NP_TYPE
   {
-- 
GitLab