From eedb87f4ba7fa835808168952f70acac6e458452 Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Mon, 14 Nov 2016 14:05:53 +0100 Subject: [PATCH] Fix regression in SparseMatrix::ReverseInnerIterator --- Eigen/src/SparseCore/SparseCompressedBase.h | 11 ++++---- test/sparse_basic.cpp | 30 +++++++++++++++++++++ 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/Eigen/src/SparseCore/SparseCompressedBase.h b/Eigen/src/SparseCore/SparseCompressedBase.h index 55ad91f46..febd9039e 100644 --- a/Eigen/src/SparseCore/SparseCompressedBase.h +++ b/Eigen/src/SparseCore/SparseCompressedBase.h @@ -224,11 +224,11 @@ class SparseCompressedBase::ReverseInnerIterator } else { - m_start.value() = mat.outerIndexPtr()[outer]; + m_start = mat.outerIndexPtr()[outer]; if(mat.isCompressed()) m_id = mat.outerIndexPtr()[outer+1]; else - m_id = m_start.value() + mat.innerNonZeroPtr()[outer]; + m_id = m_start + mat.innerNonZeroPtr()[outer]; } } @@ -254,14 +254,15 @@ class SparseCompressedBase::ReverseInnerIterator inline Index row() const { return IsRowMajor ? m_outer.value() : index(); } inline Index col() const { return IsRowMajor ? index() : m_outer.value(); } - inline operator bool() const { return (m_id > m_start.value()); } + inline operator bool() const { return (m_id > m_start); } protected: const Scalar* m_values; const StorageIndex* m_indices; - const internal::variable_if_dynamic m_outer; + typedef internal::variable_if_dynamic OuterType; + const OuterType m_outer; Index m_id; - const internal::variable_if_dynamic m_start; + Index m_start; }; namespace internal { diff --git a/test/sparse_basic.cpp b/test/sparse_basic.cpp index 7b5f3eb38..552bbac4d 100644 --- a/test/sparse_basic.cpp +++ b/test/sparse_basic.cpp @@ -219,6 +219,36 @@ template void sparse_basic(const SparseMatrixType& re } } + // test reverse iterators + { + DenseMatrix refMat2 = DenseMatrix::Zero(rows, cols); + SparseMatrixType m2(rows, cols); + initSparse(density, refMat2, m2); + std::vector ref_value(m2.innerSize()); + std::vector ref_index(m2.innerSize()); + if(internal::random()) + m2.makeCompressed(); + for(Index j = 0; j