diff options
author | Gael Guennebaud <g.gael@free.fr> | 2014-06-27 16:41:45 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2014-06-27 16:41:45 +0200 |
commit | c401167712e632a2739ceed26233a510238fc5fc (patch) | |
tree | 424b130273ea67dfadda5ada334cab53b904e555 /Eigen/src | |
parent | 73e686c6a44adfd54fe75a0d7581fd14bfa58f54 (diff) |
Fix double constructions of the nested CwiseBinaryOp evaluator in sparse*diagonal product iterator.
Diffstat (limited to 'Eigen/src')
-rw-r--r-- | Eigen/src/SparseCore/SparseBlock.h | 3 | ||||
-rw-r--r-- | Eigen/src/SparseCore/SparseDiagonalProduct.h | 23 |
2 files changed, 15 insertions, 11 deletions
diff --git a/Eigen/src/SparseCore/SparseBlock.h b/Eigen/src/SparseCore/SparseBlock.h index f562b5479..3cbbfb185 100644 --- a/Eigen/src/SparseCore/SparseBlock.h +++ b/Eigen/src/SparseCore/SparseBlock.h @@ -607,7 +607,6 @@ struct unary_evaluator<Block<ArgType,BlockRows,BlockCols,InnerPanel>, IteratorBa protected:
typedef typename evaluator<ArgType>::InnerIterator EvalIterator;
- typedef typename evaluator<ArgType>::ReverseInnerIterator EvalReverseIterator;
typename evaluator<ArgType>::nestedType m_argImpl;
const XprType &m_block;
@@ -620,7 +619,7 @@ class unary_evaluator<Block<ArgType,BlockRows,BlockCols,InnerPanel>, IteratorBas const XprType& m_block;
Index m_end;
public:
-
+
EIGEN_STRONG_INLINE InnerVectorInnerIterator(const unary_evaluator& aEval, Index outer)
: EvalIterator(aEval.m_argImpl, outer + (IsRowMajor ? aEval.m_block.startRow() : aEval.m_block.startCol())),
m_block(aEval.m_block),
diff --git a/Eigen/src/SparseCore/SparseDiagonalProduct.h b/Eigen/src/SparseCore/SparseDiagonalProduct.h index cf0f77342..fd7fd1c24 100644 --- a/Eigen/src/SparseCore/SparseDiagonalProduct.h +++ b/Eigen/src/SparseCore/SparseDiagonalProduct.h @@ -266,24 +266,29 @@ struct sparse_diagonal_product_evaluator<SparseXprType, DiagCoeffType, SDP_AsCwi typedef typename evaluator<CwiseProductType>::type CwiseProductEval; typedef typename evaluator<CwiseProductType>::InnerIterator CwiseProductIterator; - class InnerIterator : public CwiseProductIterator + class InnerIterator { public: InnerIterator(const sparse_diagonal_product_evaluator &xprEval, Index outer) - : CwiseProductIterator(CwiseProductEval(xprEval.m_sparseXprNested.innerVector(outer).cwiseProduct(xprEval.m_diagCoeffNested)),0), - m_cwiseEval(xprEval.m_sparseXprNested.innerVector(outer).cwiseProduct(xprEval.m_diagCoeffNested)), + : m_cwiseEval(xprEval.m_sparseXprNested.innerVector(outer).cwiseProduct(xprEval.m_diagCoeffNested)), + m_cwiseIter(m_cwiseEval, 0), m_outer(outer) - { - ::new (static_cast<CwiseProductIterator*>(this)) CwiseProductIterator(m_cwiseEval,0); - } + {} + inline Scalar value() const { return m_cwiseIter.value(); } + inline Index index() const { return m_cwiseIter.index(); } inline Index outer() const { return m_outer; } - inline Index col() const { return SparseXprType::IsRowMajor ? CwiseProductIterator::index() : m_outer; } - inline Index row() const { return SparseXprType::IsRowMajor ? m_outer : CwiseProductIterator::index(); } + inline Index col() const { return SparseXprType::IsRowMajor ? m_cwiseIter.index() : m_outer; } + inline Index row() const { return SparseXprType::IsRowMajor ? m_outer : m_cwiseIter.index(); } + + EIGEN_STRONG_INLINE InnerIterator& operator++() + { ++m_cwiseIter; return *this; } + inline operator bool() const { return m_cwiseIter; } protected: - Index m_outer; CwiseProductEval m_cwiseEval; + CwiseProductIterator m_cwiseIter; + Index m_outer; }; sparse_diagonal_product_evaluator(const SparseXprType &sparseXpr, const DiagCoeffType &diagCoeff) |