1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com> 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_DENSECOEFFSBASE_H 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_DENSECOEFFSBASE_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct add_const_on_value_type_if_arithmetic 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename conditional<is_arithmetic<T>::value, T, typename add_const_on_value_type<T>::type>::type type; 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \brief Base class providing read-only coefficient access to matrices and arrays. 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \ingroup Core_Module 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \tparam Derived Type of the derived class 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \tparam #ReadOnlyAccessors Constant indicating read-only access 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This class defines the \c operator() \c const function and friends, which can be used to read specific 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * entries of a matrix or array. 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa DenseCoeffsBase<Derived, WriteAccessors>, DenseCoeffsBase<Derived, DirectAccessors>, 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \ref TopicClassHierarchy 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass DenseCoeffsBase<Derived,ReadOnlyAccessors> : public EigenBase<Derived> 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::StorageKind StorageKind; 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::Index Index; 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::Scalar Scalar; 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::packet_traits<Scalar>::type PacketScalar; 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // Explanation for this CoeffReturnType typedef. 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // - This is the return type of the coeff() method. 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // - The LvalueBit means exactly that we can offer a coeffRef() method, which means exactly that we can get references 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // to coeffs, which means exactly that we can have coeff() return a const reference (as opposed to returning a value). 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // - The is_artihmetic check is required since "const int", "const double", etc. will cause warnings on some systems 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // while the declaration of "const T", where T is a non arithmetic type does not. Always returning "const Scalar&" is 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // not possible, since the underlying expressions might not offer a valid address the reference could be referring to. 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::conditional<bool(internal::traits<Derived>::Flags&LvalueBit), 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar&, 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename internal::conditional<internal::is_arithmetic<Scalar>::value, Scalar, const Scalar>::type 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath >::type CoeffReturnType; 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::add_const_on_value_type_if_arithmetic< 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typename internal::packet_traits<Scalar>::type 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath >::type PacketReturnType; 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef EigenBase<Derived> Base; 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::rows; 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::cols; 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::size; 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::derived; 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Index rowIndexByOuterInner(Index outer, Index inner) const 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return int(Derived::RowsAtCompileTime) == 1 ? 0 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : int(Derived::ColsAtCompileTime) == 1 ? inner 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : int(Derived::Flags)&RowMajorBit ? outer 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : inner; 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Index colIndexByOuterInner(Index outer, Index inner) const 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return int(Derived::ColsAtCompileTime) == 1 ? 0 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : int(Derived::RowsAtCompileTime) == 1 ? inner 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : int(Derived::Flags)&RowMajorBit ? inner 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : outer; 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Short version: don't use this function, use 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \link operator()(Index,Index) const \endlink instead. 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Long version: this function is similar to 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \link operator()(Index,Index) const \endlink, but without the assertion. 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Use this for limiting the performance cost of debugging code when doing 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * repeated coefficient access. Only use this when it is guaranteed that the 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * parameters \a row and \a col are in range. 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * function equivalent to \link operator()(Index,Index) const \endlink. 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa operator()(Index,Index) const, coeffRef(Index,Index), coeff(Index) const 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_internal_assert(row >= 0 && row < rows() 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath && col >= 0 && col < cols()); 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived().coeff(row, col); 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE CoeffReturnType coeffByOuterInner(Index outer, Index inner) const 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return coeff(rowIndexByOuterInner(outer, inner), 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath colIndexByOuterInner(outer, inner)); 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the coefficient at given the given row and column. 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa operator()(Index,Index), operator[](Index) 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE CoeffReturnType operator()(Index row, Index col) const 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(row >= 0 && row < rows() 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath && col >= 0 && col < cols()); 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived().coeff(row, col); 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Short version: don't use this function, use 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \link operator[](Index) const \endlink instead. 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Long version: this function is similar to 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \link operator[](Index) const \endlink, but without the assertion. 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Use this for limiting the performance cost of debugging code when doing 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * repeated coefficient access. Only use this when it is guaranteed that the 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * parameter \a index is in range. 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * function equivalent to \link operator[](Index) const \endlink. 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa operator[](Index) const, coeffRef(Index), coeff(Index,Index) const 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE CoeffReturnType 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath coeff(Index index) const 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_internal_assert(index >= 0 && index < size()); 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived().coeff(index); 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the coefficient at given index. 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit. 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa operator[](Index), operator()(Index,Index) const, x() const, y() const, 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * z() const, w() const 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE CoeffReturnType 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator[](Index index) const 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #ifndef EIGEN2_SUPPORT 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT(Derived::IsVectorAtCompileTime, 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD) 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #endif 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(index >= 0 && index < size()); 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived().coeff(index); 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the coefficient at given index. 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This is synonymous to operator[](Index) const. 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit. 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa operator[](Index), operator()(Index,Index) const, x() const, y() const, 167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * z() const, w() const 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE CoeffReturnType 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator()(Index index) const 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(index >= 0 && index < size()); 174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived().coeff(index); 175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** equivalent to operator[](0). */ 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE CoeffReturnType 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath x() const { return (*this)[0]; } 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** equivalent to operator[](1). */ 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE CoeffReturnType 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath y() const { return (*this)[1]; } 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** equivalent to operator[](2). */ 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE CoeffReturnType 190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath z() const { return (*this)[2]; } 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** equivalent to operator[](3). */ 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE CoeffReturnType 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath w() const { return (*this)[3]; } 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \internal 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \returns the packet of coefficients starting at the given row and column. It is your responsibility 199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * to ensure that a packet really starts there. This method is only available on expressions having the 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * PacketAccessBit. 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * The \a LoadMode parameter may have the value \a #Aligned or \a #Unaligned. Its effect is to select 203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * starting at an address which is a multiple of the packet size. 205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<int LoadMode> 208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE PacketReturnType packet(Index row, Index col) const 209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_internal_assert(row >= 0 && row < rows() 211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath && col >= 0 && col < cols()); 212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived().template packet<LoadMode>(row,col); 213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \internal */ 217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<int LoadMode> 218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE PacketReturnType packetByOuterInner(Index outer, Index inner) const 219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return packet<LoadMode>(rowIndexByOuterInner(outer, inner), 221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath colIndexByOuterInner(outer, inner)); 222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \internal 225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \returns the packet of coefficients starting at the given index. It is your responsibility 226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * to ensure that a packet really starts there. This method is only available on expressions having the 227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * PacketAccessBit and the LinearAccessBit. 228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * The \a LoadMode parameter may have the value \a #Aligned or \a #Unaligned. Its effect is to select 230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets 231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * starting at an address which is a multiple of the packet size. 232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<int LoadMode> 235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const 236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_internal_assert(index >= 0 && index < size()); 238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived().template packet<LoadMode>(index); 239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath protected: 242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // explanation: DenseBase is doing "using ..." on the methods from DenseCoeffsBase. 243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // But some methods are only available in the DirectAccess case. 244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // So we add dummy methods here with these names, so that "using... " doesn't fail. 245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // It's not private so that the child class DenseBase can access them, and it's not public 246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // either since it's an implementation detail, so has to be protected. 247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void coeffRef(); 248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void coeffRefByOuterInner(); 249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void writePacket(); 250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void writePacketByOuterInner(); 251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void copyCoeff(); 252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void copyCoeffByOuterInner(); 253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void copyPacket(); 254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void copyPacketByOuterInner(); 255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void stride(); 256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void innerStride(); 257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void outerStride(); 258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void rowStride(); 259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void colStride(); 260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \brief Base class providing read/write coefficient access to matrices and arrays. 263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \ingroup Core_Module 264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \tparam Derived Type of the derived class 265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \tparam #WriteAccessors Constant indicating read/write access 266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This class defines the non-const \c operator() function and friends, which can be used to write specific 268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * entries of a matrix or array. This class inherits DenseCoeffsBase<Derived, ReadOnlyAccessors> which 269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * defines the const variant for reading specific entries. 270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa DenseCoeffsBase<Derived, DirectAccessors>, \ref TopicClassHierarchy 272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass DenseCoeffsBase<Derived, WriteAccessors> : public DenseCoeffsBase<Derived, ReadOnlyAccessors> 275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef DenseCoeffsBase<Derived, ReadOnlyAccessors> Base; 279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::StorageKind StorageKind; 281c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::Index Index; 282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::Scalar Scalar; 283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::packet_traits<Scalar>::type PacketScalar; 284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real RealScalar; 285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::coeff; 287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::rows; 288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::cols; 289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::size; 290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::derived; 291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::rowIndexByOuterInner; 292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::colIndexByOuterInner; 293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::operator[]; 294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::operator(); 295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::x; 296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::y; 297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::z; 298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::w; 299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Short version: don't use this function, use 301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \link operator()(Index,Index) \endlink instead. 302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Long version: this function is similar to 304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \link operator()(Index,Index) \endlink, but without the assertion. 305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Use this for limiting the performance cost of debugging code when doing 306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * repeated coefficient access. Only use this when it is guaranteed that the 307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * parameters \a row and \a col are in range. 308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this 310c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * function equivalent to \link operator()(Index,Index) \endlink. 311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa operator()(Index,Index), coeff(Index, Index) const, coeffRef(Index) 313c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Scalar& coeffRef(Index row, Index col) 315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 316c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_internal_assert(row >= 0 && row < rows() 317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath && col >= 0 && col < cols()); 318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived().coeffRef(row, col); 319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Scalar& 322c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath coeffRefByOuterInner(Index outer, Index inner) 323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 324c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return coeffRef(rowIndexByOuterInner(outer, inner), 325c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath colIndexByOuterInner(outer, inner)); 326c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 327c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 328c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns a reference to the coefficient at given the given row and column. 329c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 330c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa operator[](Index) 331c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 333c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Scalar& 334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator()(Index row, Index col) 335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 336c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(row >= 0 && row < rows() 337c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath && col >= 0 && col < cols()); 338c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived().coeffRef(row, col); 339c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 341c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 342c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Short version: don't use this function, use 343c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \link operator[](Index) \endlink instead. 344c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 345c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Long version: this function is similar to 346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \link operator[](Index) \endlink, but without the assertion. 347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Use this for limiting the performance cost of debugging code when doing 348c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * repeated coefficient access. Only use this when it is guaranteed that the 349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * parameters \a row and \a col are in range. 350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 351c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this 352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * function equivalent to \link operator[](Index) \endlink. 353c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 354c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa operator[](Index), coeff(Index) const, coeffRef(Index,Index) 355c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 356c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 357c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Scalar& 358c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath coeffRef(Index index) 359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 360c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_internal_assert(index >= 0 && index < size()); 361c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived().coeffRef(index); 362c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 363c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 364c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns a reference to the coefficient at given index. 365c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 366c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit. 367c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 368c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa operator[](Index) const, operator()(Index,Index), x(), y(), z(), w() 369c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 370c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 371c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Scalar& 372c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator[](Index index) 373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 374c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #ifndef EIGEN2_SUPPORT 375c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT(Derived::IsVectorAtCompileTime, 376c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD) 377c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath #endif 378c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(index >= 0 && index < size()); 379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived().coeffRef(index); 380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 381c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 382c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns a reference to the coefficient at given index. 383c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 384c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This is synonymous to operator[](Index). 385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 386c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit. 387c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 388c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa operator[](Index) const, operator()(Index,Index), x(), y(), z(), w() 389c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 390c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 391c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Scalar& 392c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator()(Index index) 393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(index >= 0 && index < size()); 395c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived().coeffRef(index); 396c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 397c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 398c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** equivalent to operator[](0). */ 399c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 400c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Scalar& 401c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath x() { return (*this)[0]; } 402c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 403c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** equivalent to operator[](1). */ 404c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 405c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Scalar& 406c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath y() { return (*this)[1]; } 407c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 408c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** equivalent to operator[](2). */ 409c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 410c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Scalar& 411c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath z() { return (*this)[2]; } 412c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 413c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** equivalent to operator[](3). */ 414c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 415c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE Scalar& 416c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath w() { return (*this)[3]; } 417c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 418c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \internal 419c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Stores the given packet of coefficients, at the given row and column of this expression. It is your responsibility 420c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * to ensure that a packet really starts there. This method is only available on expressions having the 421c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * PacketAccessBit. 422c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 423c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * The \a LoadMode parameter may have the value \a #Aligned or \a #Unaligned. Its effect is to select 424c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets 425c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * starting at an address which is a multiple of the packet size. 426c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 427c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 428c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<int StoreMode> 429c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE void writePacket 4307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez (Index row, Index col, const typename internal::packet_traits<Scalar>::type& val) 431c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 432c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_internal_assert(row >= 0 && row < rows() 433c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath && col >= 0 && col < cols()); 4347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez derived().template writePacket<StoreMode>(row,col,val); 435c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 436c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 437c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 438c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \internal */ 439c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<int StoreMode> 440c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE void writePacketByOuterInner 4417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez (Index outer, Index inner, const typename internal::packet_traits<Scalar>::type& val) 442c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 443c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath writePacket<StoreMode>(rowIndexByOuterInner(outer, inner), 444c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath colIndexByOuterInner(outer, inner), 4457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez val); 446c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 447c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 448c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \internal 449c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Stores the given packet of coefficients, at the given index in this expression. It is your responsibility 450c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * to ensure that a packet really starts there. This method is only available on expressions having the 451c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * PacketAccessBit and the LinearAccessBit. 452c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 453c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * The \a LoadMode parameter may have the value \a Aligned or \a Unaligned. Its effect is to select 454c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets 455c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * starting at an address which is a multiple of the packet size. 456c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 457c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<int StoreMode> 458c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE void writePacket 4597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez (Index index, const typename internal::packet_traits<Scalar>::type& val) 460c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 461c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_internal_assert(index >= 0 && index < size()); 4627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez derived().template writePacket<StoreMode>(index,val); 463c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 464c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 465c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_PARSED_BY_DOXYGEN 466c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 467c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \internal Copies the coefficient at position (row,col) of other into *this. 468c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 469c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This method is overridden in SwapWrapper, allowing swap() assignments to share 99% of their code 470c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * with usual assignments. 471c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 472c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Outside of this internal usage, this method has probably no usefulness. It is hidden in the public API dox. 473c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 474c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 475c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 476c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE void copyCoeff(Index row, Index col, const DenseBase<OtherDerived>& other) 477c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 478c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_internal_assert(row >= 0 && row < rows() 479c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath && col >= 0 && col < cols()); 480c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath derived().coeffRef(row, col) = other.derived().coeff(row, col); 481c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 482c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 483c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \internal Copies the coefficient at the given index of other into *this. 484c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 485c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This method is overridden in SwapWrapper, allowing swap() assignments to share 99% of their code 486c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * with usual assignments. 487c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 488c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Outside of this internal usage, this method has probably no usefulness. It is hidden in the public API dox. 489c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 490c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 491c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 492c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE void copyCoeff(Index index, const DenseBase<OtherDerived>& other) 493c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 494c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_internal_assert(index >= 0 && index < size()); 495c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath derived().coeffRef(index) = other.derived().coeff(index); 496c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 497c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 498c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 499c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 500c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE void copyCoeffByOuterInner(Index outer, Index inner, const DenseBase<OtherDerived>& other) 501c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 502c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Index row = rowIndexByOuterInner(outer,inner); 503c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Index col = colIndexByOuterInner(outer,inner); 504c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // derived() is important here: copyCoeff() may be reimplemented in Derived! 505c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath derived().copyCoeff(row, col, other); 506c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 507c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 508c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \internal Copies the packet at position (row,col) of other into *this. 509c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 510c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This method is overridden in SwapWrapper, allowing swap() assignments to share 99% of their code 511c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * with usual assignments. 512c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 513c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Outside of this internal usage, this method has probably no usefulness. It is hidden in the public API dox. 514c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 515c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 516c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived, int StoreMode, int LoadMode> 517c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE void copyPacket(Index row, Index col, const DenseBase<OtherDerived>& other) 518c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 519c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_internal_assert(row >= 0 && row < rows() 520c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath && col >= 0 && col < cols()); 521c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath derived().template writePacket<StoreMode>(row, col, 522c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath other.derived().template packet<LoadMode>(row, col)); 523c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 524c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 525c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \internal Copies the packet at the given index of other into *this. 526c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 527c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This method is overridden in SwapWrapper, allowing swap() assignments to share 99% of their code 528c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * with usual assignments. 529c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 530c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Outside of this internal usage, this method has probably no usefulness. It is hidden in the public API dox. 531c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 532c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 533c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived, int StoreMode, int LoadMode> 534c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE void copyPacket(Index index, const DenseBase<OtherDerived>& other) 535c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 536c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_internal_assert(index >= 0 && index < size()); 537c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath derived().template writePacket<StoreMode>(index, 538c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath other.derived().template packet<LoadMode>(index)); 539c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 540c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 541c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \internal */ 542c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived, int StoreMode, int LoadMode> 543c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE void copyPacketByOuterInner(Index outer, Index inner, const DenseBase<OtherDerived>& other) 544c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 545c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Index row = rowIndexByOuterInner(outer,inner); 546c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Index col = colIndexByOuterInner(outer,inner); 547c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // derived() is important here: copyCoeff() may be reimplemented in Derived! 548c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath derived().template copyPacket< OtherDerived, StoreMode, LoadMode>(row, col, other); 549c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 550c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif 551c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 552c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 553c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 554c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \brief Base class providing direct read-only coefficient access to matrices and arrays. 555c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \ingroup Core_Module 556c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \tparam Derived Type of the derived class 557c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \tparam #DirectAccessors Constant indicating direct access 558c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 559c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This class defines functions to work with strides which can be used to access entries directly. This class 560c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * inherits DenseCoeffsBase<Derived, ReadOnlyAccessors> which defines functions to access entries read-only using 561c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \c operator() . 562c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 563c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa \ref TopicClassHierarchy 564c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 565c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 566c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass DenseCoeffsBase<Derived, DirectAccessors> : public DenseCoeffsBase<Derived, ReadOnlyAccessors> 567c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 568c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 569c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 570c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef DenseCoeffsBase<Derived, ReadOnlyAccessors> Base; 571c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::Index Index; 572c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::Scalar Scalar; 573c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real RealScalar; 574c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 575c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::rows; 576c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::cols; 577c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::size; 578c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::derived; 579c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 580c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the pointer increment between two consecutive elements within a slice in the inner direction. 581c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 582c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa outerStride(), rowStride(), colStride() 583c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 584c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index innerStride() const 585c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 586c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived().innerStride(); 587c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 588c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 589c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the pointer increment between two consecutive inner slices (for example, between two consecutive columns 590c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * in a column-major matrix). 591c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 592c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa innerStride(), rowStride(), colStride() 593c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 594c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index outerStride() const 595c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 596c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived().outerStride(); 597c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 598c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 599c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // FIXME shall we remove it ? 600c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index stride() const 601c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 602c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return Derived::IsVectorAtCompileTime ? innerStride() : outerStride(); 603c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 604c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 605c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the pointer increment between two consecutive rows. 606c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 607c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa innerStride(), outerStride(), colStride() 608c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 609c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index rowStride() const 610c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 611c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return Derived::IsRowMajor ? outerStride() : innerStride(); 612c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 613c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 614c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the pointer increment between two consecutive columns. 615c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 616c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa innerStride(), outerStride(), rowStride() 617c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 618c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index colStride() const 619c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 620c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return Derived::IsRowMajor ? innerStride() : outerStride(); 621c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 622c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 623c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 624c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \brief Base class providing direct read/write coefficient access to matrices and arrays. 625c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \ingroup Core_Module 626c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \tparam Derived Type of the derived class 627c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \tparam #DirectWriteAccessors Constant indicating direct access 628c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 629c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This class defines functions to work with strides which can be used to access entries directly. This class 630c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * inherits DenseCoeffsBase<Derived, WriteAccessors> which defines functions to access entries read/write using 631c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \c operator(). 632c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 633c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa \ref TopicClassHierarchy 634c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 635c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 636c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass DenseCoeffsBase<Derived, DirectWriteAccessors> 637c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : public DenseCoeffsBase<Derived, WriteAccessors> 638c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 639c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 640c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 641c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef DenseCoeffsBase<Derived, WriteAccessors> Base; 642c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::Index Index; 643c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::Scalar Scalar; 644c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real RealScalar; 645c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 646c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::rows; 647c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::cols; 648c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::size; 649c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::derived; 650c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 651c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the pointer increment between two consecutive elements within a slice in the inner direction. 652c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 653c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa outerStride(), rowStride(), colStride() 654c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 655c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index innerStride() const 656c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 657c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived().innerStride(); 658c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 659c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 660c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the pointer increment between two consecutive inner slices (for example, between two consecutive columns 661c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * in a column-major matrix). 662c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 663c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa innerStride(), rowStride(), colStride() 664c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 665c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index outerStride() const 666c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 667c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived().outerStride(); 668c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 669c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 670c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // FIXME shall we remove it ? 671c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index stride() const 672c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 673c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return Derived::IsVectorAtCompileTime ? innerStride() : outerStride(); 674c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 675c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 676c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the pointer increment between two consecutive rows. 677c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 678c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa innerStride(), outerStride(), colStride() 679c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 680c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index rowStride() const 681c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 682c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return Derived::IsRowMajor ? outerStride() : innerStride(); 683c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 684c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 685c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the pointer increment between two consecutive columns. 686c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 687c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa innerStride(), outerStride(), rowStride() 688c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 689c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index colStride() const 690c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 691c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return Derived::IsRowMajor ? innerStride() : outerStride(); 692c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 693c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 694c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 695c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 696c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 697c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived, bool JustReturnZero> 698c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct first_aligned_impl 699c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 700c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static inline typename Derived::Index run(const Derived&) 701c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return 0; } 702c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 703c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 704c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 705c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct first_aligned_impl<Derived, false> 706c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 707c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static inline typename Derived::Index run(const Derived& m) 708c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 709c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return internal::first_aligned(&m.const_cast_derived().coeffRef(0,0), m.size()); 710c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 711c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 712c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 713c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal \returns the index of the first element of the array that is well aligned for vectorization. 714c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 715c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * There is also the variant first_aligned(const Scalar*, Integer) defined in Memory.h. See it for more 716c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * documentation. 717c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 718c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 719c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstatic inline typename Derived::Index first_aligned(const Derived& m) 720c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 721c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return first_aligned_impl 722c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath <Derived, (Derived::Flags & AlignedBit) || !(Derived::Flags & DirectAccessBit)> 723c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ::run(m); 724c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 725c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 726c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived, bool HasDirectAccess = has_direct_access<Derived>::ret> 727c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct inner_stride_at_compile_time 728c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 729c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { ret = traits<Derived>::InnerStrideAtCompileTime }; 730c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 731c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 732c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 733c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct inner_stride_at_compile_time<Derived, false> 734c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 735c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { ret = 0 }; 736c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 737c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 738c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived, bool HasDirectAccess = has_direct_access<Derived>::ret> 739c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct outer_stride_at_compile_time 740c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 741c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { ret = traits<Derived>::OuterStrideAtCompileTime }; 742c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 743c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 744c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 745c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct outer_stride_at_compile_time<Derived, false> 746c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 747c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { ret = 0 }; 748c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 749c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 750c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal 751c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 752c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 753c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 754c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_DENSECOEFFSBASE_H 755