InnerIterator::index() should really return a StorageIndex

This commit is contained in:
Gael Guennebaud 2015-09-03 14:53:51 +02:00
parent 941a99ac1a
commit a835dfca73
5 changed files with 20 additions and 12 deletions

View File

@ -74,6 +74,7 @@ public:
class InnerIterator class InnerIterator
{ {
typedef typename traits<XprType>::Scalar Scalar; typedef typename traits<XprType>::Scalar Scalar;
typedef typename XprType::StorageIndex StorageIndex;
public: public:
@ -114,7 +115,7 @@ public:
EIGEN_STRONG_INLINE Scalar value() const { return m_value; } EIGEN_STRONG_INLINE Scalar value() const { return m_value; }
EIGEN_STRONG_INLINE Index index() const { return m_id; } EIGEN_STRONG_INLINE StorageIndex index() const { return m_id; }
EIGEN_STRONG_INLINE Index row() const { return Lhs::IsRowMajor ? m_lhsIter.row() : index(); } EIGEN_STRONG_INLINE Index row() const { return Lhs::IsRowMajor ? m_lhsIter.row() : index(); }
EIGEN_STRONG_INLINE Index col() const { return Lhs::IsRowMajor ? index() : m_lhsIter.col(); } EIGEN_STRONG_INLINE Index col() const { return Lhs::IsRowMajor ? index() : m_lhsIter.col(); }
@ -125,7 +126,7 @@ public:
RhsIterator m_rhsIter; RhsIterator m_rhsIter;
const BinaryOp& m_functor; const BinaryOp& m_functor;
Scalar m_value; Scalar m_value;
Index m_id; StorageIndex m_id;
}; };
@ -166,6 +167,7 @@ public:
class InnerIterator class InnerIterator
{ {
typedef typename traits<XprType>::Scalar Scalar; typedef typename traits<XprType>::Scalar Scalar;
typedef typename XprType::StorageIndex StorageIndex;
public: public:
@ -197,7 +199,7 @@ public:
EIGEN_STRONG_INLINE Scalar value() const { return m_functor(m_lhsIter.value(), m_rhsIter.value()); } EIGEN_STRONG_INLINE Scalar value() const { return m_functor(m_lhsIter.value(), m_rhsIter.value()); }
EIGEN_STRONG_INLINE Index index() const { return m_lhsIter.index(); } EIGEN_STRONG_INLINE StorageIndex index() const { return m_lhsIter.index(); }
EIGEN_STRONG_INLINE Index row() const { return m_lhsIter.row(); } EIGEN_STRONG_INLINE Index row() const { return m_lhsIter.row(); }
EIGEN_STRONG_INLINE Index col() const { return m_lhsIter.col(); } EIGEN_STRONG_INLINE Index col() const { return m_lhsIter.col(); }
@ -247,6 +249,8 @@ public:
class InnerIterator class InnerIterator
{ {
typedef typename traits<XprType>::Scalar Scalar; typedef typename traits<XprType>::Scalar Scalar;
typedef typename XprType::StorageIndex StorageIndex;
enum { IsRowMajor = (int(Rhs::Flags)&RowMajorBit)==RowMajorBit }; enum { IsRowMajor = (int(Rhs::Flags)&RowMajorBit)==RowMajorBit };
public: public:
@ -264,7 +268,7 @@ public:
EIGEN_STRONG_INLINE Scalar value() const EIGEN_STRONG_INLINE Scalar value() const
{ return m_functor(m_lhsEval.coeff(IsRowMajor?m_outer:m_rhsIter.index(),IsRowMajor?m_rhsIter.index():m_outer), m_rhsIter.value()); } { return m_functor(m_lhsEval.coeff(IsRowMajor?m_outer:m_rhsIter.index(),IsRowMajor?m_rhsIter.index():m_outer), m_rhsIter.value()); }
EIGEN_STRONG_INLINE Index index() const { return m_rhsIter.index(); } EIGEN_STRONG_INLINE StorageIndex index() const { return m_rhsIter.index(); }
EIGEN_STRONG_INLINE Index row() const { return m_rhsIter.row(); } EIGEN_STRONG_INLINE Index row() const { return m_rhsIter.row(); }
EIGEN_STRONG_INLINE Index col() const { return m_rhsIter.col(); } EIGEN_STRONG_INLINE Index col() const { return m_rhsIter.col(); }
@ -315,6 +319,7 @@ public:
class InnerIterator class InnerIterator
{ {
typedef typename traits<XprType>::Scalar Scalar; typedef typename traits<XprType>::Scalar Scalar;
typedef typename XprType::StorageIndex StorageIndex;
enum { IsRowMajor = (int(Lhs::Flags)&RowMajorBit)==RowMajorBit }; enum { IsRowMajor = (int(Lhs::Flags)&RowMajorBit)==RowMajorBit };
public: public:
@ -333,7 +338,7 @@ public:
{ return m_functor(m_lhsIter.value(), { return m_functor(m_lhsIter.value(),
m_rhsEval.coeff(IsRowMajor?m_outer:m_lhsIter.index(),IsRowMajor?m_lhsIter.index():m_outer)); } m_rhsEval.coeff(IsRowMajor?m_outer:m_lhsIter.index(),IsRowMajor?m_lhsIter.index():m_outer)); }
EIGEN_STRONG_INLINE Index index() const { return m_lhsIter.index(); } EIGEN_STRONG_INLINE StorageIndex index() const { return m_lhsIter.index(); }
EIGEN_STRONG_INLINE Index row() const { return m_lhsIter.row(); } EIGEN_STRONG_INLINE Index row() const { return m_lhsIter.row(); }
EIGEN_STRONG_INLINE Index col() const { return m_lhsIter.col(); } EIGEN_STRONG_INLINE Index col() const { return m_lhsIter.col(); }

View File

@ -91,6 +91,7 @@ template<typename SparseXprType, typename DiagCoeffType>
struct sparse_diagonal_product_evaluator<SparseXprType, DiagCoeffType, SDP_AsCwiseProduct> struct sparse_diagonal_product_evaluator<SparseXprType, DiagCoeffType, SDP_AsCwiseProduct>
{ {
typedef typename SparseXprType::Scalar Scalar; typedef typename SparseXprType::Scalar Scalar;
typedef typename SparseXprType::StorageIndex StorageIndex;
typedef typename nested_eval<DiagCoeffType,SparseXprType::IsRowMajor ? SparseXprType::RowsAtCompileTime typedef typename nested_eval<DiagCoeffType,SparseXprType::IsRowMajor ? SparseXprType::RowsAtCompileTime
: SparseXprType::ColsAtCompileTime>::type DiagCoeffNested; : SparseXprType::ColsAtCompileTime>::type DiagCoeffNested;
@ -104,7 +105,7 @@ struct sparse_diagonal_product_evaluator<SparseXprType, DiagCoeffType, SDP_AsCwi
{} {}
inline Scalar value() const { return m_sparseIter.value() * m_diagCoeffNested.coeff(index()); } inline Scalar value() const { return m_sparseIter.value() * m_diagCoeffNested.coeff(index()); }
inline Index index() const { return m_sparseIter.index(); } inline StorageIndex index() const { return m_sparseIter.index(); }
inline Index outer() const { return m_sparseIter.outer(); } inline Index outer() const { return m_sparseIter.outer(); }
inline Index col() const { return SparseXprType::IsRowMajor ? m_sparseIter.index() : m_sparseIter.outer(); } inline Index col() const { return SparseXprType::IsRowMajor ? m_sparseIter.index() : m_sparseIter.outer(); }
inline Index row() const { return SparseXprType::IsRowMajor ? m_sparseIter.outer() : m_sparseIter.index(); } inline Index row() const { return SparseXprType::IsRowMajor ? m_sparseIter.outer() : m_sparseIter.index(); }

View File

@ -105,7 +105,7 @@ class TriangularViewImpl<MatrixType,Mode,Sparse>::InnerIterator : public MatrixT
inline Index row() const { return (MatrixType::Flags&RowMajorBit ? Base::outer() : this->index()); } inline Index row() const { return (MatrixType::Flags&RowMajorBit ? Base::outer() : this->index()); }
inline Index col() const { return (MatrixType::Flags&RowMajorBit ? this->index() : Base::outer()); } inline Index col() const { return (MatrixType::Flags&RowMajorBit ? this->index() : Base::outer()); }
inline Index index() const inline StorageIndex index() const
{ {
if(HasUnitDiag && m_returnOne) return Base::outer(); if(HasUnitDiag && m_returnOne) return Base::outer();
else return Base::index(); else return Base::index();
@ -175,6 +175,7 @@ struct unary_evaluator<TriangularView<ArgType,Mode>, IteratorBased>
protected: protected:
typedef typename XprType::Scalar Scalar; typedef typename XprType::Scalar Scalar;
typedef typename XprType::StorageIndex StorageIndex;
typedef typename evaluator<ArgType>::InnerIterator EvalIterator; typedef typename evaluator<ArgType>::InnerIterator EvalIterator;
enum { SkipFirst = ((Mode&Lower) && !(ArgType::Flags&RowMajorBit)) enum { SkipFirst = ((Mode&Lower) && !(ArgType::Flags&RowMajorBit))
@ -251,9 +252,9 @@ public:
// inline Index row() const { return (ArgType::Flags&RowMajorBit ? Base::outer() : this->index()); } // inline Index row() const { return (ArgType::Flags&RowMajorBit ? Base::outer() : this->index()); }
// inline Index col() const { return (ArgType::Flags&RowMajorBit ? this->index() : Base::outer()); } // inline Index col() const { return (ArgType::Flags&RowMajorBit ? this->index() : Base::outer()); }
inline Index index() const inline StorageIndex index() const
{ {
if(HasUnitDiag && m_returnOne) return Base::outer(); if(HasUnitDiag && m_returnOne) return internal::convert_index<StorageIndex>(Base::outer());
else return Base::index(); else return Base::index();
} }
inline Scalar value() const inline Scalar value() const

View File

@ -377,7 +377,7 @@ class SparseVector<Scalar,_Options,_StorageIndex>::InnerIterator
inline Scalar value() const { return m_data.value(m_id); } inline Scalar value() const { return m_data.value(m_id); }
inline Scalar& valueRef() { return const_cast<Scalar&>(m_data.value(m_id)); } inline Scalar& valueRef() { return const_cast<Scalar&>(m_data.value(m_id)); }
inline Index index() const { return m_data.index(m_id); } inline StorageIndex index() const { return m_data.index(m_id); }
inline Index row() const { return IsColVector ? index() : 0; } inline Index row() const { return IsColVector ? index() : 0; }
inline Index col() const { return IsColVector ? 0 : index(); } inline Index col() const { return IsColVector ? 0 : index(); }
@ -414,7 +414,7 @@ class SparseVector<Scalar,_Options,_StorageIndex>::ReverseInnerIterator
inline Scalar value() const { return m_data.value(m_id-1); } inline Scalar value() const { return m_data.value(m_id-1); }
inline Scalar& valueRef() { return const_cast<Scalar&>(m_data.value(m_id-1)); } inline Scalar& valueRef() { return const_cast<Scalar&>(m_data.value(m_id-1)); }
inline Index index() const { return m_data.index(m_id-1); } inline StorageIndex index() const { return m_data.index(m_id-1); }
inline Index row() const { return IsColVector ? index() : 0; } inline Index row() const { return IsColVector ? index() : 0; }
inline Index col() const { return IsColVector ? 0 : index(); } inline Index col() const { return IsColVector ? 0 : index(); }

View File

@ -127,6 +127,7 @@ struct unary_evaluator<SparseView<ArgType>, IndexBased>
protected: protected:
enum { IsRowMajor = (XprType::Flags&RowMajorBit)==RowMajorBit }; enum { IsRowMajor = (XprType::Flags&RowMajorBit)==RowMajorBit };
typedef typename XprType::Scalar Scalar; typedef typename XprType::Scalar Scalar;
typedef typename XprType::StorageIndex StorageIndex;
public: public:
class InnerIterator class InnerIterator
@ -152,7 +153,7 @@ struct unary_evaluator<SparseView<ArgType>, IndexBased>
: m_sve.m_argImpl.coeff(m_inner, m_outer); : m_sve.m_argImpl.coeff(m_inner, m_outer);
} }
EIGEN_STRONG_INLINE Index index() const { return m_inner; } EIGEN_STRONG_INLINE StorageIndex index() const { return m_inner; }
inline Index row() const { return IsRowMajor ? m_outer : index(); } inline Index row() const { return IsRowMajor ? m_outer : index(); }
inline Index col() const { return IsRowMajor ? index() : m_outer; } inline Index col() const { return IsRowMajor ? index() : m_outer; }