diff options
author | 2014-02-17 16:11:55 +0100 | |
---|---|---|
committer | 2014-02-17 16:11:55 +0100 | |
commit | d595fd31f544009e62a55d6ffc26e0b62f3147d5 (patch) | |
tree | d65354f2693e90a686ba6f31a4a57a5dbec7b9c8 /Eigen/src/Core/Assign.h | |
parent | bffa15142c4271313a70801e6bb7d01365a00bc9 (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.h | 27 |
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 |