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