// This file is part of Eigen, a lightweight C++ template library // for linear algebra. // // Copyright (C) 2018 Gael Guennebaud // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. namespace Eigen { template class DenseStlIteratorBase { public: typedef std::ptrdiff_t difference_type; typedef std::random_access_iterator_tag iterator_category; DenseStlIteratorBase() : mp_xpr(0), m_index(0) {} DenseStlIteratorBase(XprType& xpr, Index index) : mp_xpr(&xpr), m_index(index) {} void swap(DenseStlIteratorBase& other) { std::swap(mp_xpr,other.mp_xpr); std::swap(m_index,other.m_index); } Derived& operator++() { ++m_index; return derived(); } Derived& operator--() { --m_index; return derived(); } Derived operator++(int) { Derived prev(derived()); operator++(); return prev;} Derived operator--(int) { Derived prev(derived()); operator--(); return prev;} friend Derived operator+(const DenseStlIteratorBase& a, int b) { Derived ret(a.derived()); ret += b; return ret; } friend Derived operator-(const DenseStlIteratorBase& a, int b) { Derived ret(a.derived()); ret -= b; return ret; } friend Derived operator+(int a, const DenseStlIteratorBase& b) { Derived ret(b.derived()); ret += a; return ret; } friend Derived operator-(int a, const DenseStlIteratorBase& b) { Derived ret(b.derived()); ret -= a; return ret; } Derived& operator+=(int b) { m_index += b; return derived(); } Derived& operator-=(int b) { m_index -= b; return derived(); } difference_type operator-(const DenseStlIteratorBase& other) const { eigen_assert(mp_xpr == other.mp_xpr);return m_index - other.m_index; } bool operator==(const DenseStlIteratorBase& other) { eigen_assert(mp_xpr == other.mp_xpr); return m_index == other.m_index; } bool operator!=(const DenseStlIteratorBase& other) { eigen_assert(mp_xpr == other.mp_xpr); return m_index != other.m_index; } bool operator< (const DenseStlIteratorBase& other) { eigen_assert(mp_xpr == other.mp_xpr); return m_index < other.m_index; } bool operator<=(const DenseStlIteratorBase& other) { eigen_assert(mp_xpr == other.mp_xpr); return m_index <= other.m_index; } bool operator> (const DenseStlIteratorBase& other) { eigen_assert(mp_xpr == other.mp_xpr); return m_index > other.m_index; } bool operator>=(const DenseStlIteratorBase& other) { eigen_assert(mp_xpr == other.mp_xpr); return m_index >= other.m_index; } protected: Derived& derived() { return static_cast(*this); } const Derived& derived() const { return static_cast(*this); } XprType *mp_xpr; Index m_index; }; template class DenseStlIterator : public DenseStlIteratorBase > { public: typedef typename XprType::Scalar value_type; protected: enum { has_direct_access = (internal::traits::Flags & DirectAccessBit) ? 1 : 0, has_write_access = internal::is_lvalue::value }; typedef DenseStlIteratorBase Base; using Base::m_index; using Base::mp_xpr; typedef typename internal::conditional::type read_only_ref_t; public: typedef typename internal::conditional::type pointer; typedef typename internal::conditional::type reference; DenseStlIterator() : Base() {} DenseStlIterator(XprType& xpr, Index index) : Base(xpr,index) {} reference operator*() const { return (*mp_xpr)(m_index); } reference operator[](int i) const { return (*mp_xpr)(i); } pointer operator->() const { return &((*mp_xpr)(m_index)); } }; template void swap(DenseStlIteratorBase& a, DenseStlIteratorBase& b) { a.swap(b); } template inline DenseStlIterator DenseBase::begin() { EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived); return DenseStlIterator(derived(), 0); } template inline DenseStlIterator DenseBase::begin() const { return cbegin(); } template inline DenseStlIterator DenseBase::cbegin() const { EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived); return DenseStlIterator(derived(), 0); } template inline DenseStlIterator DenseBase::end() { EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived); return DenseStlIterator(derived(), size()); } template inline DenseStlIterator DenseBase::end() const { return cend(); } template inline DenseStlIterator DenseBase::cend() const { EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived); return DenseStlIterator(derived(), size()); } template class DenseColStlIterator : public DenseStlIteratorBase > { protected: enum { is_lvalue = internal::is_lvalue::value }; typedef DenseStlIteratorBase Base; using Base::m_index; using Base::mp_xpr; public: typedef typename internal::conditional::type value_type; typedef value_type* pointer; typedef value_type reference; DenseColStlIterator() : Base() {} DenseColStlIterator(XprType& xpr, Index index) : Base(xpr,index) {} reference operator*() const { return (*mp_xpr).col(m_index); } reference operator[](int i) const { return (*mp_xpr).col(i); } pointer operator->() const { return &((*mp_xpr).col(m_index)); } }; template class DenseRowStlIterator : public DenseStlIteratorBase > { protected: enum { is_lvalue = internal::is_lvalue::value }; typedef DenseStlIteratorBase Base; using Base::m_index; using Base::mp_xpr; public: typedef typename internal::conditional::type value_type; typedef value_type* pointer; typedef value_type reference; DenseRowStlIterator() : Base() {} DenseRowStlIterator(XprType& xpr, Index index) : Base(xpr,index) {} reference operator*() const { return (*mp_xpr).row(m_index); } reference operator[](int i) const { return (*mp_xpr).row(i); } pointer operator->() const { return &((*mp_xpr).row(m_index)); } }; template class ColsProxy { public: ColsProxy(Xpr& xpr) : m_xpr(xpr) {} DenseColStlIterator begin() const { return DenseColStlIterator(m_xpr, 0); } DenseColStlIterator cbegin() const { return DenseColStlIterator(m_xpr, 0); } DenseColStlIterator end() const { return DenseColStlIterator(m_xpr, m_xpr.cols()); } DenseColStlIterator cend() const { return DenseColStlIterator(m_xpr, m_xpr.cols()); } protected: Xpr& m_xpr; }; template class RowsProxy { public: RowsProxy(Xpr& xpr) : m_xpr(xpr) {} DenseRowStlIterator begin() const { return DenseRowStlIterator(m_xpr, 0); } DenseRowStlIterator cbegin() const { return DenseRowStlIterator(m_xpr, 0); } DenseRowStlIterator end() const { return DenseRowStlIterator(m_xpr, m_xpr.rows()); } DenseRowStlIterator cend() const { return DenseRowStlIterator(m_xpr, m_xpr.rows()); } protected: Xpr& m_xpr; }; template ColsProxy DenseBase::allCols() { return ColsProxy(derived()); } template ColsProxy DenseBase::allCols() const { return ColsProxy(derived()); } template RowsProxy DenseBase::allRows() { return RowsProxy(derived()); } template RowsProxy DenseBase::allRows() const { return RowsProxy(derived()); } } // namespace Eigen