29#ifndef HPP_CONSTRAINTS_IMPL_MATRIX_VIEW_OPERATION_HH
30#define HPP_CONSTRAINTS_IMPL_MATRIX_VIEW_OPERATION_HH
39#define HPP_EIGEN_DECLARE_TEMPLATE_ARGS_MATRIX_BLOCK_VIEW \
40 typename _ArgType, int _Rows, int _Cols, bool _allRows, bool _allCols
41#define HPP_EIGEN_MATRIX_BLOCK_VIEW \
42 MatrixBlockView<_ArgType, _Rows, _Cols, _allRows, _allCols>
44#define HPP_EIGEN_SPECIALIZE_CwiseBinaryOpImpl(LHS_TPL, LHS_TYPE, RHS_TPL, \
46 template <typename BinaryOp, LHS_TPL, RHS_TPL> \
47 class CwiseBinaryOpImpl<BinaryOp, LHS_TYPE, RHS_TYPE, Dense> \
48 : public internal::dense_xpr_base< \
49 CwiseBinaryOp<BinaryOp, LHS_TYPE, RHS_TYPE> >::type { \
50 typedef LHS_TYPE Lhs_t; \
51 typedef RHS_TYPE Rhs_t; \
52 typedef CwiseBinaryOp<BinaryOp, LHS_TYPE, RHS_TYPE> Derived; \
55 typedef typename internal::dense_xpr_base<Derived>::type Base; \
56 EIGEN_DENSE_PUBLIC_INTERFACE(Derived) \
58 template <typename OtherDerived> \
59 void evalTo(MatrixBase<OtherDerived>& other) const; \
62#define HPP_EIGEN_DEFINE_CwiseBinaryOpImpl_evalTo(LHS_TPL, LHS_TYPE, RHS_TPL, \
64 template <typename BinaryOp, LHS_TPL, RHS_TPL> \
65 template <typename OtherDerived> \
66 void CwiseBinaryOpImpl<BinaryOp, LHS_TYPE, RHS_TYPE, Dense>::evalTo( \
67 MatrixBase<OtherDerived>& other) const
69#if HPP_EIGEN_USE_EVALUATOR
71#define HPP_EIGEN_SPECIALIZE_ASSIGN_SELECTOR(LHS_TPL, LHS_TYPE, RHS_TPL, \
73 template <typename Derived, typename BinaryOp, LHS_TPL, RHS_TPL, \
74 typename Functor, typename Scalar> \
75 struct Assignment<Derived, CwiseBinaryOp<BinaryOp, LHS_TYPE, RHS_TYPE>, \
76 Functor, Dense2Dense, Scalar> { \
77 typedef CwiseBinaryOp<BinaryOp, LHS_TYPE, RHS_TYPE> CwiseDerived; \
78 static EIGEN_STRONG_INLINE void run(Derived& dst, const CwiseDerived& o, \
86#define HPP_EIGEN_SPECIALIZE_ASSIGN_SELECTOR_IMPL( \
87 LHS_TPL, LHS_TYPE, RHS_TPL, RHS_TYPE, need_to_transpose, EVAL_TO_BODY) \
88 template <typename Derived, typename BinaryOp, LHS_TPL, RHS_TPL> \
89 struct assign_selector<Derived, CwiseBinaryOp<BinaryOp, LHS_TYPE, RHS_TYPE>, \
90 false, need_to_transpose> { \
91 typedef CwiseBinaryOp<BinaryOp, LHS_TYPE, RHS_TYPE> CwiseDerived; \
92 static EIGEN_STRONG_INLINE Derived& run(Derived& dst, \
93 const CwiseDerived& o) { \
94 dst.resize(o.rows(), o.cols()); \
98 template <typename ActualDerived, typename ActualOtherDerived> \
99 static EIGEN_STRONG_INLINE Derived& evalTo( \
100 ActualDerived& dst, const ActualOtherDerived& other) { \
101 EVAL_TO_BODY return dst; \
105#define HPP_EIGEN_EVAL_TO_BODY_NORMAL other.evalTo(dst);
106#define HPP_EIGEN_EVAL_TO_BODY_TRANSPOSE \
107 Transpose<ActualDerived> dstTrans(dst); \
108 other.evalTo(dstTrans);
110#define HPP_EIGEN_SPECIALIZE_ASSIGN_SELECTOR(LHS_TPL, LHS_TYPE, RHS_TPL, \
112 HPP_EIGEN_SPECIALIZE_ASSIGN_SELECTOR_IMPL( \
113 HPP_EIGEN_LHS_TPL, HPP_EIGEN_LHS_TYPE, HPP_EIGEN_RHS_TPL, \
114 HPP_EIGEN_RHS_TYPE, false, HPP_EIGEN_EVAL_TO_BODY_NORMAL) \
115 HPP_EIGEN_SPECIALIZE_ASSIGN_SELECTOR_IMPL( \
116 HPP_EIGEN_LHS_TPL, HPP_EIGEN_LHS_TYPE, HPP_EIGEN_RHS_TPL, \
117 HPP_EIGEN_RHS_TYPE, true, HPP_EIGEN_EVAL_TO_BODY_TRANSPOSE)
122#define HPP_EIGEN_LHS_TPL typename Lhs
123#define HPP_EIGEN_LHS_TYPE Lhs
124#define HPP_EIGEN_RHS_TPL HPP_EIGEN_DECLARE_TEMPLATE_ARGS_MATRIX_BLOCK_VIEW
125#define HPP_EIGEN_RHS_TYPE const HPP_EIGEN_MATRIX_BLOCK_VIEW
133 typedef const Block<Lhs_t> BlockLhs;
134 typedef const typename Rhs_t::template block_t<typename Rhs_t::ArgType>::type
138 const Derived&
d = derived();
139 for (
typename Rhs_t::block_iterator block(
d.rhs()); block.valid(); ++block) {
142 d.lhs().block(block.ro(), block.co(), block.rs(), block.cs());
143 other.derived().block(block.ro(), block.co(), block.rs(), block.cs()) =
152#undef HPP_EIGEN_LHS_TPL
153#undef HPP_EIGEN_LHS_TYPE
154#undef HPP_EIGEN_RHS_TPL
155#undef HPP_EIGEN_RHS_TYPE
158#define HPP_EIGEN_LHS_TPL HPP_EIGEN_DECLARE_TEMPLATE_ARGS_MATRIX_BLOCK_VIEW
159#define HPP_EIGEN_LHS_TYPE const HPP_EIGEN_MATRIX_BLOCK_VIEW
160#define HPP_EIGEN_RHS_TPL typename Rhs
161#define HPP_EIGEN_RHS_TYPE Rhs
168 typedef const typename Lhs_t::template block_t<typename Lhs_t::ArgType>::type
170 typedef const Block<Rhs_t>
BlockRhs;
171 typedef CwiseBinaryOp<BinaryOp, BlockLhs, BlockRhs>
BlockCwiseBOp;
173 const Derived&
d = derived();
174 for (
typename Lhs_t::block_iterator block(
d.lhs()); block.valid(); ++block) {
175 BlockLhs lhs =
d.lhs()._block(block);
177 d.rhs().block(block.ro(), block.co(), block.rs(), block.cs());
178 other.derived().block(block.ro(), block.co(), block.rs(), block.cs()) =
187#undef HPP_EIGEN_LHS_TPL
188#undef HPP_EIGEN_LHS_TYPE
189#undef HPP_EIGEN_RHS_TPL
190#undef HPP_EIGEN_RHS_TYPE
193#define HPP_EIGEN_LHS_TPL HPP_EIGEN_DECLARE_TEMPLATE_ARGS_MATRIX_BLOCK_VIEW
194#define HPP_EIGEN_LHS_TYPE const HPP_EIGEN_MATRIX_BLOCK_VIEW
195#define HPP_EIGEN_RHS_TPL \
196 typename _ArgType2, int _Rows2, int _Cols2, bool _allRows2, bool _allCols2
197#define HPP_EIGEN_RHS_TYPE \
198 const MatrixBlockView<_ArgType2, _Rows2, _Cols2, _allRows2, _allCols2>
206 typedef const typename Lhs_t::template block_t<typename Lhs_t::ArgType>::type
208 typedef const typename Rhs_t::template block_t<typename Rhs_t::ArgType>::type
210 typedef CwiseBinaryOp<BinaryOp, BlockLhs, BlockRhs>
BlockCwiseBOp;
212 const Derived&
d = derived();
214 typename Lhs_t::block_iterator
lblock(
d.lhs());
215 typename Rhs_t::block_iterator
rblock(
d.rhs());
217 BlockLhs lhs =
d.lhs()._block(
lblock);
233#undef HPP_EIGEN_LHS_TPL
234#undef HPP_EIGEN_LHS_TYPE
235#undef HPP_EIGEN_RHS_TPL
236#undef HPP_EIGEN_RHS_TYPE
238#if !HPP_EIGEN_USE_EVALUATOR
239#undef HPP_EIGEN_EVAL_TO_BODY_NORMAL
240#undef HPP_EIGEN_EVAL_TO_BODY_TRANSPOSE
241#undef HPP_EIGEN_SPECIALIZE_ASSIGN_SELECTOR_IMPL
244#undef HPP_EIGEN_SPECIALIZE_CwiseBinaryOpImpl
245#undef HPP_EIGEN_SPECIALIZE_ASSIGN_SELECTOR
246#undef HPP_EIGEN_DEFINE_CwiseBinaryOpImpl_evalTo
247#undef HPP_EIGEN_DECLARE_TEMPLATE_ARGS_MATRIX_BLOCK_VIEW
248#undef HPP_EIGEN_MATRIX_BLOCK_VIEW
#define HPP_EIGEN_SPECIALIZE_ASSIGN_SELECTOR(LHS_TPL, LHS_TYPE, RHS_TPL, RHS_TYPE)
Definition matrix-view-operation.hh:110
#define HPP_EIGEN_LHS_TPL
Definition matrix-view-operation.hh:122
#define HPP_EIGEN_DEFINE_CwiseBinaryOpImpl_evalTo(LHS_TPL, LHS_TYPE, RHS_TPL, RHS_TYPE)
Definition matrix-view-operation.hh:62
#define HPP_EIGEN_SPECIALIZE_CwiseBinaryOpImpl(LHS_TPL, LHS_TYPE, RHS_TPL, RHS_TYPE)
Definition matrix-view-operation.hh:44
HPP_EIGEN_RHS_TPL
Definition matrix-view-operation.hh:131
CwiseBinaryOp< BinaryOp, BlockLhs, BlockRhs > BlockCwiseBOp
Definition matrix-view-operation.hh:136
Lhs_t::block_iterator lblock(d.lhs())
const Rhs_t::template block_t< typenameRhs_t::ArgType >::type BlockRhs
Definition matrix-view-operation.hh:135
HPP_EIGEN_RHS_TYPE
Definition matrix-view-operation.hh:132
assert(d.lhs()._blocks()==d.rhs()._blocks())
Rhs_t::block_iterator rblock(d.rhs())
HPP_EIGEN_LHS_TYPE
Definition matrix-view-operation.hh:130
const Derived & d
Definition matrix-view-operation.hh:138