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, IteratorBa protected: typedef typename evaluator::InnerIterator EvalIterator; - typedef typename evaluator::ReverseInnerIterator EvalReverseIterator; typename evaluator::nestedType m_argImpl; const XprType &m_block; @@ -620,7 +619,7 @@ class unary_evaluator, 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::type CwiseProductEval; typedef typename evaluator::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(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)