implement evaluator for SparseVector

This commit is contained in:
Gael Guennebaud 2014-06-25 09:58:03 +02:00
parent 3849cc65ee
commit 17f119689e

View File

@ -410,6 +410,7 @@ class SparseVector<Scalar,_Options,_Index>::ReverseInnerIterator
namespace internal { namespace internal {
#ifndef EIGEN_TEST_EVALUATORS
template< typename Dest, typename Src> template< typename Dest, typename Src>
struct sparse_vector_assign_selector<Dest,Src,SVA_Inner> { struct sparse_vector_assign_selector<Dest,Src,SVA_Inner> {
static void run(Dest& dst, const Src& src) { static void run(Dest& dst, const Src& src) {
@ -431,6 +432,33 @@ struct sparse_vector_assign_selector<Dest,Src,SVA_Outer> {
} }
} }
}; };
#else // EIGEN_TEST_EVALUATORS
template< typename Dest, typename Src>
struct sparse_vector_assign_selector<Dest,Src,SVA_Inner> {
static void run(Dest& dst, const Src& src) {
eigen_internal_assert(src.innerSize()==src.size());
typedef typename internal::evaluator<Src>::type SrcEvaluatorType;
SrcEvaluatorType srcEval(src);
for(typename SrcEvaluatorType::InnerIterator it(srcEval, 0); it; ++it)
dst.insert(it.index()) = it.value();
}
};
template< typename Dest, typename Src>
struct sparse_vector_assign_selector<Dest,Src,SVA_Outer> {
static void run(Dest& dst, const Src& src) {
eigen_internal_assert(src.outerSize()==src.size());
typedef typename internal::evaluator<Src>::type SrcEvaluatorType;
SrcEvaluatorType srcEval(src);
for(typename Dest::Index i=0; i<src.size(); ++i)
{
typename SrcEvaluatorType::InnerIterator it(srcEval, i);
if(it)
dst.insert(i) = it.value();
}
}
};
#endif // EIGEN_TEST_EVALUATORS
template< typename Dest, typename Src> template< typename Dest, typename Src>
struct sparse_vector_assign_selector<Dest,Src,SVA_RuntimeSwitch> { struct sparse_vector_assign_selector<Dest,Src,SVA_RuntimeSwitch> {