diff --git a/Eigen/src/Core/AssignEvaluator.h b/Eigen/src/Core/AssignEvaluator.h index 2c9f2426b..3babc16ba 100644 --- a/Eigen/src/Core/AssignEvaluator.h +++ b/Eigen/src/Core/AssignEvaluator.h @@ -504,7 +504,7 @@ struct dense_assignment_loop // This abstraction level permits to keep the evaluation loops as simple and as generic as possible. // One can customize the assignment using this generic dense_assignment_kernel with different // functors, or by completely overloading it, by-passing a functor. -template +template class generic_dense_assignment_kernel { protected: diff --git a/Eigen/src/Core/Swap.h b/Eigen/src/Core/Swap.h index 8fd94b3c7..117f667f6 100644 --- a/Eigen/src/Core/Swap.h +++ b/Eigen/src/Core/Swap.h @@ -139,15 +139,16 @@ template class SwapWrapper // #endif -#ifdef EIGEN_TEST_EVALUATORS +#ifdef EIGEN_ENABLE_EVALUATORS namespace internal { // Overload default assignPacket behavior for swapping them template -class dense_swap_kernel : public generic_dense_assignment_kernel > +class generic_dense_assignment_kernel, Specialized> + : public generic_dense_assignment_kernel, BuiltIn> { - typedef generic_dense_assignment_kernel > Base; + typedef generic_dense_assignment_kernel, BuiltIn> Base; typedef typename DstEvaluatorTypeT::PacketScalar PacketScalar; using Base::m_dst; using Base::m_src; @@ -157,9 +158,10 @@ public: typedef typename Base::Scalar Scalar; typedef typename Base::Index Index; typedef typename Base::DstXprType DstXprType; + typedef swap_assign_op Functor; - dense_swap_kernel(DstEvaluatorTypeT &dst, const SrcEvaluatorTypeT &src, DstXprType& dstExpr) - : Base(dst, src, swap_assign_op(), dstExpr) + generic_dense_assignment_kernel(DstEvaluatorTypeT &dst, const SrcEvaluatorTypeT &src, const Functor &func, DstXprType& dstExpr) + : Base(dst, src, func, dstExpr) {} template @@ -183,25 +185,6 @@ public: assignPacket(row, col); } }; - -template -void call_dense_swap_loop(const DstXprType& dst, const SrcXprType& src) -{ - // TODO there is too much redundancy with call_dense_assignment_loop - - eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); - - typedef typename evaluator::type DstEvaluatorType; - typedef typename evaluator::type SrcEvaluatorType; - - DstEvaluatorType dstEvaluator(dst); - SrcEvaluatorType srcEvaluator(src); - - typedef dense_swap_kernel Kernel; - Kernel kernel(dstEvaluator, srcEvaluator, dst.const_cast_derived()); - - dense_assignment_loop::run(kernel); -} } // namespace internal diff --git a/test/evaluators.cpp b/test/evaluators.cpp index 29192d7f9..63f940318 100644 --- a/test/evaluators.cpp +++ b/test/evaluators.cpp @@ -74,7 +74,8 @@ namespace Eigen { template void swap_using_evaluator(const DstXprType& dst, const SrcXprType& src) { - call_dense_swap_loop(dst.const_cast_derived(), src.const_cast_derived()); + typedef typename DstXprType::Scalar Scalar; + call_assignment(dst.const_cast_derived(), src.const_cast_derived(), internal::swap_assign_op()); } } @@ -193,7 +194,7 @@ void test_evaluators() VERIFY_IS_APPROX_EVALUATOR2(resXX, prod(mX4,m4X), mX4*m4X); VERIFY_IS_APPROX_EVALUATOR2(resXX, prod(mXX,mXX), mXX*mXX); } - +#endif { ArrayXXf a(2,3); ArrayXXf b(3,2); @@ -202,7 +203,7 @@ void test_evaluators() // this does not work because Random is eval-before-nested: // copy_using_evaluator(w, Vector2d::Random().transpose()); - + // test CwiseUnaryOp VERIFY_IS_APPROX_EVALUATOR(v2, 3 * v); VERIFY_IS_APPROX_EVALUATOR(w, (3 * v).transpose()); @@ -405,7 +406,7 @@ void test_evaluators() arr_ref.row(1) /= (arr_ref.row(2) + 1); VERIFY_IS_APPROX(arr, arr_ref); } -#endif + { // test triangular shapes MatrixXd A = MatrixXd::Random(6,6), B(6,6), C(6,6);