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