1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_COREITERATORS_H
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_COREITERATORS_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/* This file contains the respective InnerIterator definition of the expressions defined in Eigen/Core
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \ingroup SparseCore_Module
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \class InnerIterator
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \brief An InnerIterator allows to loop over the element of a sparse (or dense) matrix or expression
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * todo
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// generic version for dense matrix and expressions
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class DenseBase<Derived>::InnerIterator
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename Derived::Scalar Scalar;
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename Derived::Index Index;
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    enum { IsRowMajor = (Derived::Flags&RowMajorBit)==RowMajorBit };
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_STRONG_INLINE InnerIterator(const Derived& expr, Index outer)
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      : m_expression(expr), m_inner(0), m_outer(outer), m_end(expr.innerSize())
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {}
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_STRONG_INLINE Scalar value() const
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return (IsRowMajor) ? m_expression.coeff(m_outer, m_inner)
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          : m_expression.coeff(m_inner, m_outer);
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_STRONG_INLINE InnerIterator& operator++() { m_inner++; return *this; }
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_STRONG_INLINE Index index() const { return m_inner; }
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index row() const { return IsRowMajor ? m_outer : index(); }
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index col() const { return IsRowMajor ? index() : m_outer; }
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_STRONG_INLINE operator bool() const { return m_inner < m_end && m_inner>=0; }
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Derived& m_expression;
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Index m_inner;
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Index m_outer;
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const Index m_end;
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_COREITERATORS_H
62