From a970a579b20058a1c6cb95cbedf962114a579b83 Mon Sep 17 00:00:00 2001 From: Wenzel Jakob Date: Fri, 20 May 2016 12:00:56 +0200 Subject: [PATCH] eigen.h: return compile time vectors as 1D NumPy arrays --- include/pybind11/eigen.h | 53 ++++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/include/pybind11/eigen.h b/include/pybind11/eigen.h index 746f0a2f7..00f0347a8 100644 --- a/include/pybind11/eigen.h +++ b/include/pybind11/eigen.h @@ -41,6 +41,7 @@ template struct type_caster::value>::type> { typedef typename Type::Scalar Scalar; static constexpr bool rowMajor = Type::Flags & Eigen::RowMajorBit; + static constexpr bool isVector = Type::IsVectorAtCompileTime; bool load(handle src, bool) { array_t buffer(src, true); @@ -50,7 +51,7 @@ struct type_caster::value>::t buffer_info info = buffer.request(); if (info.ndim == 1) { typedef Eigen::Stride Strides; - if (!Type::IsVectorAtCompileTime && + if (!isVector && !(Type::RowsAtCompileTime == Eigen::Dynamic && Type::ColsAtCompileTime == Eigen::Dynamic)) return false; @@ -87,23 +88,39 @@ struct type_caster::value>::t } static handle cast(const Type &src, return_value_policy /* policy */, handle /* parent */) { - array result(buffer_info( - /* Pointer to buffer */ - const_cast(src.data()), - /* Size of one scalar */ - sizeof(Scalar), - /* Python struct-style format descriptor */ - format_descriptor::value, - /* Number of dimensions */ - 2, - /* Buffer dimensions */ - { (size_t) src.rows(), - (size_t) src.cols() }, - /* Strides (in bytes) for each index */ - { sizeof(Scalar) * (rowMajor ? src.cols() : 1), - sizeof(Scalar) * (rowMajor ? 1 : src.rows()) } - )); - return result.release(); + if (isVector) { + return array(buffer_info( + /* Pointer to buffer */ + const_cast(src.data()), + /* Size of one scalar */ + sizeof(Scalar), + /* Python struct-style format descriptor */ + format_descriptor::value, + /* Number of dimensions */ + 1, + /* Buffer dimensions */ + { (size_t) src.size() }, + /* Strides (in bytes) for each index */ + { sizeof(Scalar) } + )).release(); + } else { + return array(buffer_info( + /* Pointer to buffer */ + const_cast(src.data()), + /* Size of one scalar */ + sizeof(Scalar), + /* Python struct-style format descriptor */ + format_descriptor::value, + /* Number of dimensions */ + isVector ? 1 : 2, + /* Buffer dimensions */ + { (size_t) src.rows(), + (size_t) src.cols() }, + /* Strides (in bytes) for each index */ + { sizeof(Scalar) * (rowMajor ? src.cols() : 1), + sizeof(Scalar) * (rowMajor ? 1 : src.rows()) } + )).release(); + } } template using cast_op_type = pybind11::detail::cast_op_type<_T>;