Medial Code Documentation
Loading...
Searching...
No Matches
CoreIterators.h
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2008-2014 Gael Guennebaud <gael.guennebaud@inria.fr>
5//
6// This Source Code Form is subject to the terms of the Mozilla
7// Public License v. 2.0. If a copy of the MPL was not distributed
8// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
10#ifndef EIGEN_COREITERATORS_H
11#define EIGEN_COREITERATORS_H
12
13namespace Eigen {
14
15/* This file contains the respective InnerIterator definition of the expressions defined in Eigen/Core
16 */
17
18namespace internal {
19
20template<typename XprType, typename EvaluatorKind>
22
23}
24
32template<typename XprType>
34{
35protected:
38 typedef typename internal::traits<XprType>::Scalar Scalar;
39public:
41 InnerIterator(const XprType &xpr, const Index &outerId)
42 : m_eval(xpr), m_iter(m_eval, outerId, xpr.innerSize())
43 {}
44
46 EIGEN_STRONG_INLINE Scalar value() const { return m_iter.value(); }
50 EIGEN_STRONG_INLINE InnerIterator& operator++() { m_iter.operator++(); return *this; }
52 EIGEN_STRONG_INLINE Index index() const { return m_iter.index(); }
54 EIGEN_STRONG_INLINE Index row() const { return m_iter.row(); }
56 EIGEN_STRONG_INLINE Index col() const { return m_iter.col(); }
58 EIGEN_STRONG_INLINE operator bool() const { return m_iter; }
59
60protected:
61 EvaluatorType m_eval;
62 IteratorType m_iter;
63private:
64 // If you get here, then you're not using the right InnerIterator type, e.g.:
65 // SparseMatrix<double,RowMajor> A;
66 // SparseMatrix<double>::InnerIterator it(A,0);
67 template<typename T> InnerIterator(const EigenBase<T>&,Index outer);
68};
69
70namespace internal {
71
72// Generic inner iterator implementation for dense objects
73template<typename XprType>
74class inner_iterator_selector<XprType, IndexBased>
75{
76protected:
77 typedef evaluator<XprType> EvaluatorType;
78 typedef typename traits<XprType>::Scalar Scalar;
79 enum { IsRowMajor = (XprType::Flags&RowMajorBit)==RowMajorBit };
80
81public:
82 EIGEN_STRONG_INLINE inner_iterator_selector(const EvaluatorType &eval, const Index &outerId, const Index &innerSize)
83 : m_eval(eval), m_inner(0), m_outer(outerId), m_end(innerSize)
84 {}
85
86 EIGEN_STRONG_INLINE Scalar value() const
87 {
88 return (IsRowMajor) ? m_eval.coeff(m_outer, m_inner)
89 : m_eval.coeff(m_inner, m_outer);
90 }
91
92 EIGEN_STRONG_INLINE inner_iterator_selector& operator++() { m_inner++; return *this; }
93
94 EIGEN_STRONG_INLINE Index index() const { return m_inner; }
95 inline Index row() const { return IsRowMajor ? m_outer : index(); }
96 inline Index col() const { return IsRowMajor ? index() : m_outer; }
97
98 EIGEN_STRONG_INLINE operator bool() const { return m_inner < m_end && m_inner>=0; }
99
100protected:
101 const EvaluatorType& m_eval;
102 Index m_inner;
103 const Index m_outer;
104 const Index m_end;
105};
106
107// For iterator-based evaluator, inner-iterator is already implemented as
108// evaluator<>::InnerIterator
109template<typename XprType>
110class inner_iterator_selector<XprType, IteratorBased>
111 : public evaluator<XprType>::InnerIterator
112{
113protected:
114 typedef typename evaluator<XprType>::InnerIterator Base;
115 typedef evaluator<XprType> EvaluatorType;
116
117public:
118 EIGEN_STRONG_INLINE inner_iterator_selector(const EvaluatorType &eval, const Index &outerId, const Index &/*innerSize*/)
119 : Base(eval, outerId)
120 {}
121};
122
123} // end namespace internal
124
125} // end namespace Eigen
126
127#endif // EIGEN_COREITERATORS_H
An InnerIterator allows to loop over the element of any matrix expression.
Definition CoreIterators.h:34
EIGEN_STRONG_INLINE Index col() const
Definition CoreIterators.h:56
EIGEN_STRONG_INLINE Index row() const
Definition CoreIterators.h:54
EIGEN_STRONG_INLINE Scalar value() const
Definition CoreIterators.h:46
InnerIterator(const XprType &xpr, const Index &outerId)
Construct an iterator over the outerId -th row or column of xpr.
Definition CoreIterators.h:41
EIGEN_STRONG_INLINE Index index() const
Definition CoreIterators.h:52
EIGEN_STRONG_INLINE InnerIterator & operator++()
Increment the iterator *this to the next non-zero coefficient.
Definition CoreIterators.h:50
Pseudo expression representing a solving operation.
Definition Solve.h:63
Definition CoreIterators.h:21
const unsigned int RowMajorBit
for a matrix, this means that the storage order is row-major.
Definition Constants.h:61
Definition CoreEvaluators.h:82
Definition ForwardDeclarations.h:17