aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/Core/ReturnByValue.h
diff options
context:
space:
mode:
authorGravatar Benoit Jacob <jacob.benoit.1@gmail.com>2009-09-26 22:48:16 -0400
committerGravatar Benoit Jacob <jacob.benoit.1@gmail.com>2009-09-26 22:48:16 -0400
commit924b55e9a92cc30f6caf9e53ea6c5ec96f275dc3 (patch)
tree6edf89d39af1d38b65462f68e105fb30f23de975 /Eigen/src/Core/ReturnByValue.h
parente82ab8a5dd1974db041098f40e8df819e6569d16 (diff)
when copying a ReturnByValue into a MatrixBase, first eval it to a PlainMatrixType.
This allows to limit the number of instantiations of the big template method evalTo. Also allows to get rid of the dummy MatrixBase::resize(). See "TODO" comment.
Diffstat (limited to 'Eigen/src/Core/ReturnByValue.h')
-rw-r--r--Eigen/src/Core/ReturnByValue.h18
1 files changed, 16 insertions, 2 deletions
diff --git a/Eigen/src/Core/ReturnByValue.h b/Eigen/src/Core/ReturnByValue.h
index 55652db48..297ed2456 100644
--- a/Eigen/src/Core/ReturnByValue.h
+++ b/Eigen/src/Core/ReturnByValue.h
@@ -65,8 +65,22 @@ template<typename Derived>
template<typename OtherDerived>
Derived& MatrixBase<Derived>::operator=(const ReturnByValue<OtherDerived>& other)
{
- other.evalTo(derived());
- return derived();
+ // Here we evaluate to a temporary matrix tmp, which we then copy. The main purpose
+ // of this is to limit the number of instantiations of the template method evalTo<Destination>():
+ // we only instantiate for PlainMatrixType.
+ // Notice that this behaviour is specific to this operator in MatrixBase. The corresponding operator in class Matrix
+ // does not evaluate into a temporary first.
+ // TODO find a way to avoid evaluating into a temporary in the cases that matter. At least Block<> matters
+ // for the implementation of blocked algorithms.
+ // Should we:
+ // - try a trick like for the products, where the destination is abstracted as an array with stride?
+ // - or just add an operator in class Block, so we get a separate instantiation there (bad) but at least not more
+ // than that, and at least that's easy to make work?
+ // - or, since here we're talking about a compromise between code size and performance, let the user choose?
+ // Not obvious: many users will never find out about this feature, and it's hard to find a good API.
+ PlainMatrixType tmp;
+ other.evalTo(tmp);
+ return derived() = tmp;
}
#endif // EIGEN_RETURNBYVALUE_H