25 #ifndef EIGEN_SPARSE_TRIANGULARVIEW_H
26 #define EIGEN_SPARSE_TRIANGULARVIEW_H
32 template<
typename MatrixType,
int Mode>
33 struct traits<SparseTriangularView<MatrixType,Mode> >
34 :
public traits<MatrixType>
44 SkipLast = !SkipFirst,
45 HasUnitDiag = (Mode&
UnitDiag) ? 1 : 0
53 class ReverseInnerIterator;
67 template<
typename OtherDerived>
78 template<
typename MatrixType,
int Mode>
79 class SparseTriangularView<MatrixType,Mode>::InnerIterator :
public MatrixTypeNestedCleaned::InnerIterator
81 typedef typename MatrixTypeNestedCleaned::InnerIterator
Base;
89 while((*
this) && (HasUnitDiag ? this->index()<=outer : this->index()<outer))
94 else if(HasUnitDiag && ((!Base::operator
bool()) || Base::index()>=Base::outer()))
96 if((!SkipFirst) && Base::operator
bool())
104 if(HasUnitDiag && m_returnOne)
109 if(HasUnitDiag && (!SkipFirst) && ((!Base::operator
bool()) || Base::index()>=Base::outer()))
111 if((!SkipFirst) && Base::operator
bool())
121 inline Index index()
const
123 if(HasUnitDiag && m_returnOne)
return Base::outer();
124 else return Base::index();
126 inline Scalar value()
const
128 if(HasUnitDiag && m_returnOne)
return Scalar(1);
129 else return Base::value();
134 if(HasUnitDiag && m_returnOne)
136 return (SkipFirst ? Base::operator
bool() : (Base::operator
bool() && this->index() <= this->outer()));
142 template<
typename MatrixType,
int Mode>
143 class SparseTriangularView<MatrixType,Mode>::ReverseInnerIterator :
public MatrixTypeNestedCleaned::ReverseInnerIterator
145 typedef typename MatrixTypeNestedCleaned::ReverseInnerIterator
Base;
151 eigen_assert((!HasUnitDiag) &&
"ReverseInnerIterator does not support yet triangular views with a unit diagonal");
153 while((*
this) && this->index()>outer)
158 { Base::operator--();
return *
this; }
165 return SkipLast ? Base::operator
bool() : (
Base::operator bool() && this->index() >= this->outer());
169 template<
typename Derived>
171 inline const SparseTriangularView<Derived, Mode>
179 #endif // EIGEN_SPARSE_TRIANGULARVIEW_H