diff --git a/Eigen/src/SparseCore/SparseBlock.h b/Eigen/src/SparseCore/SparseBlock.h index 1342f4e7b..3affff661 100644 --- a/Eigen/src/SparseCore/SparseBlock.h +++ b/Eigen/src/SparseCore/SparseBlock.h @@ -68,6 +68,32 @@ class BlockImpl Index blockRows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); } Index blockCols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); } + inline const Scalar* valuePtr() const { return m_matrix.valuePtr(); } + inline Scalar* valuePtr() { return m_matrix.valuePtr(); } + + inline const StorageIndex* innerIndexPtr() const { return m_matrix.innerIndexPtr(); } + inline StorageIndex* innerIndexPtr() { return m_matrix.innerIndexPtr(); } + + inline const StorageIndex* outerIndexPtr() const { + const StorageIndex* p = m_matrix.outerIndexPtr(); + return p ? p + m_outerStart : 0; + } + inline StorageIndex* outerIndexPtr() { + StorageIndex* p = m_matrix.outerIndexPtr(); + return p ? p + m_outerStart : 0; + } + + inline const StorageIndex* innerNonZeroPtr() const { + const StorageIndex* p = m_matrix.innerNonZeroPtr(); + return p ? p + m_outerStart : 0; + } + inline StorageIndex* innerNonZeroPtr() { + StorageIndex* p = m_matrix.innerNonZeroPtr(); + return p ? p + m_outerStart : 0; + } + + bool isCompressed() const { return m_matrix.innerNonZeroPtr() == 0; } + protected: typename internal::ref_selector::non_const_type m_matrix; Index m_outerStart; diff --git a/test/sparse_block.cpp b/test/sparse_block.cpp index d4d036ae3..398658c8d 100644 --- a/test/sparse_block.cpp +++ b/test/sparse_block.cpp @@ -279,6 +279,22 @@ void sparse_block(const SparseMatrixType& ref) { ++block_iterator; ++matrix_iterator; } + + // Test direct access methods + if (m2.isCompressed()) { + VERIFY(v.isCompressed()); + VERIFY_IS_EQUAL(v.innerNonZeroPtr(), (const StorageIndex*)0); + } else { + VERIFY(!v.isCompressed()); + if (SparseMatrixType::IsRowMajor) { + VERIFY_IS_EQUAL(v.innerNonZeroPtr(), m2.innerNonZeroPtr() + j0); + } else { + VERIFY_IS_EQUAL(v.innerNonZeroPtr(), m2.innerNonZeroPtr() + j0); + } + } + VERIFY_IS_EQUAL(v.valuePtr(), m2.valuePtr()); + VERIFY_IS_EQUAL(v.innerIndexPtr(), m2.innerIndexPtr()); + VERIFY_IS_EQUAL(v.outerIndexPtr(), m2.outerIndexPtr() + j0); } }