Skip to content

Commit a151a4c

Browse files
committed
test/eigen_ref: test using Eigen::Ref as data member
* show correct return_value_policy to use
1 parent 9958e35 commit a151a4c

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

unittest/eigen_ref.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,13 @@ struct modify_wrap : modify_block, bp::wrapper<modify_block> {
8686
void call(Eigen::Ref<MatrixXd> mat) { this->get_override("call")(mat); }
8787
};
8888

89+
struct has_ref_member
90+
{
91+
MatrixXd J;
92+
Eigen::Ref<MatrixXd> Jref;
93+
has_ref_member() : J(4, 4), Jref(J.topRightCorner(3, 3)) { J.setZero(); }
94+
};
95+
8996
BOOST_PYTHON_MODULE(eigen_ref) {
9097
namespace bp = boost::python;
9198
eigenpy::enableEigenPy();
@@ -119,4 +126,11 @@ BOOST_PYTHON_MODULE(eigen_ref) {
119126
.def_readonly("J", &modify_block::J)
120127
.def("modify", &modify_block::modify)
121128
.def("call", bp::pure_virtual(&modify_wrap::call));
129+
130+
bp::class_<has_ref_member, boost::noncopyable>("has_ref_member", bp::init<>())
131+
.def_readonly("J", &has_ref_member::J)
132+
.add_property("Jref", bp::make_getter(&has_ref_member::Jref,
133+
bp::return_value_policy<bp::return_by_value>()));
134+
// can't return Eigen::Ref by reference but by value
135+
// (def_readonly creates a by-reference getter)
122136
}

unittest/python/test_eigen_ref.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ def call(self, mat):
6262

6363
assert np.array_equal(Jref, modify.J)
6464

65+
hasref = has_ref_member()
66+
A = np.ones((3, 3)) / 2
67+
hasref.Jref[:, :] = A
68+
J_true = np.zeros((4, 4))
69+
J_true[:3, 1:] = A
70+
71+
assert np.array_equal(hasref.J, J_true)
72+
6573

6674
rows = 10
6775
cols = 30

0 commit comments

Comments
 (0)