aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/Core/Assign.h
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2014-02-17 16:11:55 +0100
committerGravatar Gael Guennebaud <g.gael@free.fr>2014-02-17 16:11:55 +0100
commitd595fd31f544009e62a55d6ffc26e0b62f3147d5 (patch)
treed65354f2693e90a686ba6f31a4a57a5dbec7b9c8 /Eigen/src/Core/Assign.h
parentbffa15142c4271313a70801e6bb7d01365a00bc9 (diff)
Deal with automatic transposition in call_assignment, fix a few shortcomings
Diffstat (limited to 'Eigen/src/Core/Assign.h')
-rw-r--r--Eigen/src/Core/Assign.h27
1 files changed, 26 insertions, 1 deletions
diff --git a/Eigen/src/Core/Assign.h b/Eigen/src/Core/Assign.h
index cefa6f3cc..6080a83f6 100644
--- a/Eigen/src/Core/Assign.h
+++ b/Eigen/src/Core/Assign.h
@@ -531,6 +531,23 @@ EIGEN_STRONG_INLINE Derived& DenseBase<Derived>
namespace internal {
+#ifdef EIGEN_TEST_EVALUATORS
+
+// TODO remove this class which is now useless
+
+template<typename Derived, typename OtherDerived>
+struct assign_selector {
+ EIGEN_DEVICE_FUNC
+ static EIGEN_STRONG_INLINE Derived& run(Derived& dst, const OtherDerived& other) {
+ call_assignment(dst, other.derived(), internal::assign_op<typename OtherDerived::Scalar>());
+ return dst;
+ }
+ template<typename ActualDerived, typename ActualOtherDerived>
+ EIGEN_DEVICE_FUNC
+ static EIGEN_STRONG_INLINE Derived& evalTo(ActualDerived& dst, const ActualOtherDerived& other) { other.evalTo(dst); return dst; }
+};
+
+#else // EIGEN_TEST_EVALUATORS
template<typename Derived, typename OtherDerived,
bool EvalBeforeAssigning = (int(internal::traits<OtherDerived>::Flags) & EvalBeforeAssigningBit) != 0,
bool NeedToTranspose = ((int(Derived::RowsAtCompileTime) == 1 && int(OtherDerived::ColsAtCompileTime) == 1)
@@ -566,7 +583,7 @@ struct assign_selector<Derived,OtherDerived,true,true> {
EIGEN_DEVICE_FUNC
static EIGEN_STRONG_INLINE Derived& run(Derived& dst, const OtherDerived& other) { return dst.lazyAssign(other.transpose().eval()); }
};
-
+#endif // EIGEN_TEST_EVALUATORS
} // end namespace internal
template<typename Derived>
@@ -604,7 +621,11 @@ template <typename OtherDerived>
EIGEN_DEVICE_FUNC
EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::operator=(const EigenBase<OtherDerived>& other)
{
+#ifdef EIGEN_TEST_EVALUATORS
+ return internal::assign_selector<Derived,OtherDerived>::evalTo(derived(), other.derived());
+#else
return internal::assign_selector<Derived,OtherDerived,false>::evalTo(derived(), other.derived());
+#endif
}
template<typename Derived>
@@ -612,7 +633,11 @@ template<typename OtherDerived>
EIGEN_DEVICE_FUNC
EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::operator=(const ReturnByValue<OtherDerived>& other)
{
+#ifdef EIGEN_TEST_EVALUATORS
+ return internal::assign_selector<Derived,OtherDerived>::evalTo(derived(), other.derived());
+#else
return internal::assign_selector<Derived,OtherDerived,false>::evalTo(derived(), other.derived());
+#endif
}
} // end namespace Eigen