diff options
author | Gael Guennebaud <g.gael@free.fr> | 2015-10-29 13:16:15 +0100 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2015-10-29 13:16:15 +0100 |
commit | 568d488a2778b6e539a417b1ab2b62d1a096784e (patch) | |
tree | b12d798da69d2523b568c1070df2f44c3d6bede3 /Eigen/src/SparseCore | |
parent | 7a5f83ca60c667898e6d8096dac5680793ddfce9 (diff) |
Fusion the two similar specialization of Sparse2Dense Assignment.
This change also fixes a compilation issue with MSVC<=2013.
Diffstat (limited to 'Eigen/src/SparseCore')
-rw-r--r-- | Eigen/src/SparseCore/SparseAssign.h | 21 |
1 files changed, 4 insertions, 17 deletions
diff --git a/Eigen/src/SparseCore/SparseAssign.h b/Eigen/src/SparseCore/SparseAssign.h index 4b663a59e..cb154d1c2 100644 --- a/Eigen/src/SparseCore/SparseAssign.h +++ b/Eigen/src/SparseCore/SparseAssign.h @@ -136,33 +136,20 @@ struct Assignment<DstXprType, SrcXprType, Functor, Sparse2Sparse, Scalar> template< typename DstXprType, typename SrcXprType, typename Functor> struct Assignment<DstXprType, SrcXprType, Functor, Sparse2Dense> { + typedef typename DstXprType::Scalar Scalar; static void run(DstXprType &dst, const SrcXprType &src, const Functor &func) { eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); - - internal::evaluator<SrcXprType> srcEval(src); - internal::evaluator<DstXprType> dstEval(dst); - const Index outerEvaluationSize = (internal::evaluator<SrcXprType>::Flags&RowMajorBit) ? src.rows() : src.cols(); - for (Index j=0; j<outerEvaluationSize; ++j) - for (typename internal::evaluator<SrcXprType>::InnerIterator i(srcEval,j); i; ++i) - func.assignCoeff(dstEval.coeffRef(i.row(),i.col()), i.value()); - } -}; -template< typename DstXprType, typename SrcXprType> -struct Assignment<DstXprType, SrcXprType, internal::assign_op<typename DstXprType::Scalar>, Sparse2Dense> -{ - static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar> &) - { - eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols()); + if(internal::is_same<Functor,internal::assign_op<Scalar> >::value) + dst.setZero(); - dst.setZero(); internal::evaluator<SrcXprType> srcEval(src); internal::evaluator<DstXprType> dstEval(dst); const Index outerEvaluationSize = (internal::evaluator<SrcXprType>::Flags&RowMajorBit) ? src.rows() : src.cols(); for (Index j=0; j<outerEvaluationSize; ++j) for (typename internal::evaluator<SrcXprType>::InnerIterator i(srcEval,j); i; ++i) - dstEval.coeffRef(i.row(),i.col()) = i.value(); + func.assignCoeff(dstEval.coeffRef(i.row(),i.col()), i.value()); } }; |