10 #ifndef EIGEN_SPARSEPRODUCT_H
11 #define EIGEN_SPARSEPRODUCT_H
26 template<
typename Derived>
27 template<
typename OtherDerived>
28 inline const Product<Derived,OtherDerived,AliasFreeProduct>
37 template<
typename Lhs,
typename Rhs,
int ProductType>
40 template<
typename Dest>
41 static void evalTo(Dest& dst,
const Lhs& lhs,
const Rhs& rhs)
43 evalTo(dst, lhs, rhs,
typename evaluator_traits<Dest>::Shape());
47 template<
typename Dest,
typename ActualLhs>
48 static void addTo(Dest& dst,
const ActualLhs& lhs,
const Rhs& rhs,
typename enable_if<
is_same<
typename evaluator_traits<Dest>::Shape,
DenseShape>::value,
int*>::type* = 0)
52 LhsNested lhsNested(lhs);
53 RhsNested rhsNested(rhs);
55 typename remove_all<RhsNested>::type, Dest>::run(lhsNested,rhsNested,dst);
59 template<
typename Dest>
60 static void subTo(Dest& dst,
const Lhs& lhs,
const Rhs& rhs,
typename enable_if<
is_same<
typename evaluator_traits<Dest>::Shape,
DenseShape>::value,
int*>::type* = 0)
62 addTo(dst, -lhs, rhs);
68 template<
typename Dest>
69 static void evalTo(Dest& dst,
const Lhs& lhs,
const Rhs& rhs,
SparseShape)
73 LhsNested lhsNested(lhs);
74 RhsNested rhsNested(rhs);
76 typename remove_all<RhsNested>::type, Dest>::run(lhsNested,rhsNested,dst);
80 template<
typename Dest>
81 static void evalTo(Dest& dst,
const Lhs& lhs,
const Rhs& rhs,
DenseShape)
89 template<
typename Lhs,
typename Rhs,
int ProductType>
95 template<
typename Lhs,
typename Rhs,
int ProductType>
101 template<
typename DstXprType,
typename Lhs,
typename Rhs>
107 Index dstRows = src.rows();
108 Index dstCols = src.cols();
109 if((dst.rows()!=dstRows) || (dst.cols()!=dstCols))
110 dst.resize(dstRows, dstCols);
117 template<
typename DstXprType,
typename Lhs,
typename Rhs>
128 template<
typename DstXprType,
typename Lhs,
typename Rhs>
138 template<
typename Lhs,
typename Rhs,
int Options>
140 :
public evaluator<typename Product<Lhs, Rhs, DefaultProduct>::PlainObject>
143 typedef typename XprType::PlainObject PlainObject;
147 : m_result(xpr.rows(), xpr.cols())
150 ::new (
static_cast<Base*
>(
this))
Base(m_result);
157 typename remove_all<RhsNested>::type, PlainObject>::run(lhsNested,rhsNested,m_result,
158 abs(xpr.reference())*xpr.epsilon());
162 PlainObject m_result;
168 template<
typename Scalar,
int _Options,
typename _StorageIndex>
169 template<
typename Lhs,
typename Rhs>
181 #endif // EIGEN_SPARSEPRODUCT_H