diff --git a/include/eigenpy/eigen-allocator.hpp b/include/eigenpy/eigen-allocator.hpp index cdcec2c01248e48952f9d672572d12720a370dfb..91edf0cd4871b1b4753bba09ad8282fdefbf5654 100644 --- a/include/eigenpy/eigen-allocator.hpp +++ b/include/eigenpy/eigen-allocator.hpp @@ -91,20 +91,44 @@ struct init_tensor { #endif template <typename MatType> -bool check_swap(PyArrayObject *pyArray, const Eigen::MatrixBase<MatType> &mat) { - if (PyArray_NDIM(pyArray) == 0) return false; - if (mat.rows() == PyArray_DIMS(pyArray)[0]) - return false; - else - return true; +struct check_swap_impl_matrix; + +template <typename EigenType, + typename BaseType = typename get_eigen_base_type<EigenType>::type> +struct check_swap_impl; + +template <typename MatType> +struct check_swap_impl<MatType, Eigen::MatrixBase<MatType> > + : check_swap_impl_matrix<MatType> {}; + +template <typename MatType> +struct check_swap_impl_matrix { + static bool run(PyArrayObject *pyArray, + const Eigen::MatrixBase<MatType> &mat) { + if (PyArray_NDIM(pyArray) == 0) return false; + if (mat.rows() == PyArray_DIMS(pyArray)[0]) + return false; + else + return true; + } +}; + +template <typename EigenType> +bool check_swap(PyArrayObject *pyArray, const EigenType &mat) { + return check_swap_impl<EigenType>::run(pyArray, mat); } #ifdef EIGENPY_WITH_TENSOR_SUPPORT template <typename TensorType> -bool check_swap(PyArrayObject * /*pyArray*/, - const Eigen::TensorBase<TensorType> & /*tensor*/) { - return false; -} +struct check_swap_impl_tensor { + static bool run(PyArrayObject * /*pyArray*/, const TensorType & /*tensor*/) { + return false; + } +}; + +template <typename TensorType> +struct check_swap_impl<TensorType, Eigen::TensorBase<TensorType> > + : check_swap_impl_tensor<TensorType> {}; #endif template <typename Scalar, typename NewScalar,