Skip to content

Commit 5e7ae5b

Browse files
committed
core: add helper np_type_is_convertible_into_scalar
1 parent 4f6f704 commit 5e7ae5b

File tree

2 files changed

+32
-29
lines changed

2 files changed

+32
-29
lines changed

include/eigenpy/eigen-from-python.hpp

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -86,42 +86,15 @@ namespace eigenpy
8686
template<typename MatType>
8787
struct EigenFromPy
8888
{
89-
90-
static bool isScalarConvertible(const int np_type)
91-
{
92-
if(NumpyEquivalentType<typename MatType::Scalar>::type_code == np_type)
93-
return true;
94-
95-
switch(np_type)
96-
{
97-
case NPY_INT:
98-
return FromTypeToType<int,typename MatType::Scalar>::value;
99-
case NPY_LONG:
100-
return FromTypeToType<long,typename MatType::Scalar>::value;
101-
case NPY_FLOAT:
102-
return FromTypeToType<float,typename MatType::Scalar>::value;
103-
case NPY_CFLOAT:
104-
return FromTypeToType<std::complex<float>,typename MatType::Scalar>::value;
105-
case NPY_DOUBLE:
106-
return FromTypeToType<double,typename MatType::Scalar>::value;
107-
case NPY_CDOUBLE:
108-
return FromTypeToType<std::complex<double>,typename MatType::Scalar>::value;
109-
case NPY_LONGDOUBLE:
110-
return FromTypeToType<long double,typename MatType::Scalar>::value;
111-
case NPY_CLONGDOUBLE:
112-
return FromTypeToType<std::complex<long double>,typename MatType::Scalar>::value;
113-
default:
114-
return false;
115-
}
116-
}
89+
typedef typename MatType::Scalar Scalar;
11790

11891
/// \brief Determine if pyObj can be converted into a MatType object
11992
static void* convertible(PyArrayObject* pyArray)
12093
{
12194
if(!PyArray_Check(pyArray))
12295
return 0;
12396

124-
if(!isScalarConvertible(EIGENPY_GET_PY_ARRAY_TYPE(pyArray)))
97+
if(!np_type_is_convertible_into_scalar<Scalar>(EIGENPY_GET_PY_ARRAY_TYPE(pyArray)))
12598
return 0;
12699

127100
if(MatType::IsVectorAtCompileTime)

include/eigenpy/numpy-type.hpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#define __eigenpy_numpy_type_hpp__
77

88
#include "eigenpy/fwd.hpp"
9+
#include "eigenpy/scalar-conversion.hpp"
910

1011
#include <patchlevel.h> // For PY_MAJOR_VERSION
1112

@@ -23,6 +24,35 @@ namespace eigenpy
2324
template <> struct NumpyEquivalentType< std::complex<long double> > { enum { type_code = NPY_CLONGDOUBLE };};
2425
template <> struct NumpyEquivalentType<int> { enum { type_code = NPY_INT };};
2526
template <> struct NumpyEquivalentType<long> { enum { type_code = NPY_LONG };};
27+
28+
template<typename Scalar>
29+
bool np_type_is_convertible_into_scalar(const int np_type)
30+
{
31+
if(NumpyEquivalentType<Scalar>::type_code == np_type)
32+
return true;
33+
34+
switch(np_type)
35+
{
36+
case NPY_INT:
37+
return FromTypeToType<int,Scalar>::value;
38+
case NPY_LONG:
39+
return FromTypeToType<long,Scalar>::value;
40+
case NPY_FLOAT:
41+
return FromTypeToType<float,Scalar>::value;
42+
case NPY_CFLOAT:
43+
return FromTypeToType<std::complex<float>,Scalar>::value;
44+
case NPY_DOUBLE:
45+
return FromTypeToType<double,Scalar>::value;
46+
case NPY_CDOUBLE:
47+
return FromTypeToType<std::complex<double>,Scalar>::value;
48+
case NPY_LONGDOUBLE:
49+
return FromTypeToType<long double,Scalar>::value;
50+
case NPY_CLONGDOUBLE:
51+
return FromTypeToType<std::complex<long double>,Scalar>::value;
52+
default:
53+
return false;
54+
}
55+
}
2656

2757
enum NP_TYPE
2858
{

0 commit comments

Comments
 (0)