From 9162a8492e27fa1a042a5c90d39cab7650be49c9 Mon Sep 17 00:00:00 2001 From: Desire NUENTSA Date: Fri, 16 Nov 2012 20:00:34 +0100 Subject: [PATCH] ReverseInnerIterator for SparseBlock --- Eigen/src/SparseCore/SparseBlock.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Eigen/src/SparseCore/SparseBlock.h b/Eigen/src/SparseCore/SparseBlock.h index f13c6dfe2..ae247c253 100644 --- a/Eigen/src/SparseCore/SparseBlock.h +++ b/Eigen/src/SparseCore/SparseBlock.h @@ -366,9 +366,32 @@ public: inline operator bool() const { return Base::operator bool() && Base::index() < m_end; } }; + class ReverseInnerIterator : public _MatrixTypeNested::ReverseInnerIterator + { + typedef typename _MatrixTypeNested::ReverseInnerIterator Base; + const BlockType& m_block; + Index m_begin; + public: + EIGEN_STRONG_INLINE ReverseInnerIterator(const BlockType& block, Index outer) + : Base(block.derived().nestedExpression(), outer + (IsRowMajor ? block.m_startRow.value() : block.m_startCol.value())), + m_block(block), + m_begin(IsRowMajor ? block.m_startCol.value() : block.m_startRow.value()) + { + while(Base::index() >= (IsRowMajor ? m_block.m_startCol.value()+block.m_blockCols.value() : m_block.m_startRow.value()+block.m_blockRows.value()) ) + Base::operator--(); + } + + inline Index index() const { return Base::index() - (IsRowMajor ? m_block.m_startCol.value() : m_block.m_startRow.value()); } + inline Index outer() const { return Base::outer() - (IsRowMajor ? m_block.m_startRow.value() : m_block.m_startCol.value()); } + inline Index row() const { return Base::row() - m_block.m_startRow.value(); } + inline Index col() const { return Base::col() - m_block.m_startCol.value(); } + + inline operator bool() const { return Base::operator bool() && Base::index() >= m_begin; } + }; protected: friend class InnerIterator; + friend class ReverseInnerIterator; const typename XprType::Nested m_matrix; const internal::variable_if_dynamic m_startRow;