@@ -52,6 +52,27 @@ const Eigen::Ref<const MatType> asConstRef(Eigen::Ref<MatType> mat) {
5252 return Eigen::Ref<const MatType>(mat);
5353}
5454
55+ struct modify_block
56+ {
57+ MatrixXd J;
58+ modify_block () : J(10 , 10 ) { J.setZero (); }
59+ void modify (int n, int m)
60+ {
61+ call (J.topLeftCorner (n, m));
62+ }
63+ virtual void call (Eigen::Ref<MatrixXd> mat) = 0;
64+ };
65+
66+ struct modify_wrap : modify_block, bp::wrapper<modify_block>
67+ {
68+ modify_wrap () : modify_block() {}
69+ void call (Eigen::Ref<MatrixXd> mat)
70+ {
71+ this ->get_override (" call" )(mat);
72+ }
73+ };
74+
75+
5576BOOST_PYTHON_MODULE (eigen_ref) {
5677 namespace bp = boost::python;
5778 eigenpy::enableEigenPy ();
@@ -77,4 +98,11 @@ BOOST_PYTHON_MODULE(eigen_ref) {
7798 (Eigen::Ref<MatrixXd>(*)(Eigen::Ref<MatrixXd>))asRef<MatrixXd>);
7899 bp::def (" asConstRef" , (const Eigen::Ref<const MatrixXd> (*)(
79100 Eigen::Ref<MatrixXd>))asConstRef<MatrixXd>);
101+
102+ bp::class_<modify_wrap, boost::noncopyable>(" modify_block" , bp::init<>())
103+ .def_readonly (" J" , &modify_block::J)
104+ .def (" modify" , &modify_block::modify)
105+ .def (" call" , bp::pure_virtual (&modify_wrap::call))
106+ ;
107+
80108}
0 commit comments