Skip to content

Commit a9653f1

Browse files
authored
Merge pull request #282 from ManifoldFR/devel
test/eigen_ref: test using Eigen::Ref as data member
2 parents 9958e35 + 1994d64 commit a9653f1

File tree

2 files changed

+23
-0
lines changed

2 files changed

+23
-0
lines changed

unittest/eigen_ref.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,12 @@ 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+
MatrixXd J;
91+
Eigen::Ref<MatrixXd> Jref;
92+
has_ref_member() : J(4, 4), Jref(J.topRightCorner(3, 3)) { J.setZero(); }
93+
};
94+
8995
BOOST_PYTHON_MODULE(eigen_ref) {
9096
namespace bp = boost::python;
9197
eigenpy::enableEigenPy();
@@ -119,4 +125,13 @@ BOOST_PYTHON_MODULE(eigen_ref) {
119125
.def_readonly("J", &modify_block::J)
120126
.def("modify", &modify_block::modify)
121127
.def("call", bp::pure_virtual(&modify_wrap::call));
128+
129+
bp::class_<has_ref_member, boost::noncopyable>("has_ref_member", bp::init<>())
130+
.def_readonly("J", &has_ref_member::J)
131+
.add_property(
132+
"Jref",
133+
bp::make_getter(&has_ref_member::Jref,
134+
bp::return_value_policy<bp::return_by_value>()));
135+
// can't return Eigen::Ref by reference but by value
136+
// (def_readonly creates a by-reference getter)
122137
}

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)