1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_ARRAYWRAPPER_H
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_ARRAYWRAPPER_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class ArrayWrapper
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \ingroup Core_Module
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \brief Expression of a mathematical vector or matrix as an array object
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This class is the return type of MatrixBase::array(), and most of the time
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * this is the only way it is use.
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa MatrixBase::array(), class MatrixWrapper
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType>
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<ArrayWrapper<ExpressionType> >
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  : public traits<typename remove_all<typename ExpressionType::Nested>::type >
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef ArrayXpr XprKind;
32615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  // Let's remove NestByRefBit
33615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  enum {
34615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    Flags0 = traits<typename remove_all<typename ExpressionType::Nested>::type >::Flags,
35615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    Flags = Flags0 & ~NestByRefBit
36615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  };
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType>
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass ArrayWrapper : public ArrayBase<ArrayWrapper<ExpressionType> >
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef ArrayBase<ArrayWrapper> Base;
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_DENSE_PUBLIC_INTERFACE(ArrayWrapper)
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(ArrayWrapper)
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::conditional<
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                       internal::is_lvalue<ExpressionType>::value,
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                       Scalar,
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                       const Scalar
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                     >::type ScalarWithConstIfNotLvalue;
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::nested<ExpressionType>::type NestedExpressionType;
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline ArrayWrapper(ExpressionType& matrix) : m_expression(matrix) {}
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index rows() const { return m_expression.rows(); }
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index cols() const { return m_expression.cols(); }
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index outerStride() const { return m_expression.outerStride(); }
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index innerStride() const { return m_expression.innerStride(); }
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    inline ScalarWithConstIfNotLvalue* data() { return m_expression.const_cast_derived().data(); }
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const Scalar* data() const { return m_expression.data(); }
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    inline CoeffReturnType coeff(Index rowId, Index colId) const
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      return m_expression.coeff(rowId, colId);
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
717faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    inline Scalar& coeffRef(Index rowId, Index colId)
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      return m_expression.const_cast_derived().coeffRef(rowId, colId);
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    inline const Scalar& coeffRef(Index rowId, Index colId) const
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      return m_expression.const_cast_derived().coeffRef(rowId, colId);
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline CoeffReturnType coeff(Index index) const
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_expression.coeff(index);
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Scalar& coeffRef(Index index)
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_expression.const_cast_derived().coeffRef(index);
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const Scalar& coeffRef(Index index) const
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_expression.const_cast_derived().coeffRef(index);
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int LoadMode>
977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    inline const PacketScalar packet(Index rowId, Index colId) const
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      return m_expression.template packet<LoadMode>(rowId, colId);
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int LoadMode>
1037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    inline void writePacket(Index rowId, Index colId, const PacketScalar& val)
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
1057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      m_expression.const_cast_derived().template writePacket<LoadMode>(rowId, colId, val);
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int LoadMode>
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const PacketScalar packet(Index index) const
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_expression.template packet<LoadMode>(index);
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int LoadMode>
1157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    inline void writePacket(Index index, const PacketScalar& val)
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
1177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      m_expression.const_cast_derived().template writePacket<LoadMode>(index, val);
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<typename Dest>
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline void evalTo(Dest& dst) const { dst = m_expression; }
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename internal::remove_all<NestedExpressionType>::type&
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    nestedExpression() const
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_expression;
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    /** Forwards the resizing request to the nested expression
1307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      * \sa DenseBase::resize(Index)  */
1317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    void resize(Index newSize) { m_expression.const_cast_derived().resize(newSize); }
1327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    /** Forwards the resizing request to the nested expression
1337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      * \sa DenseBase::resize(Index,Index)*/
1347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    void resize(Index nbRows, Index nbCols) { m_expression.const_cast_derived().resize(nbRows,nbCols); }
1357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    NestedExpressionType m_expression;
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class MatrixWrapper
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \ingroup Core_Module
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \brief Expression of an array as a mathematical vector or matrix
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This class is the return type of ArrayBase::matrix(), and most of the time
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * this is the only way it is use.
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa MatrixBase::matrix(), class ArrayWrapper
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType>
153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<MatrixWrapper<ExpressionType> >
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : public traits<typename remove_all<typename ExpressionType::Nested>::type >
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef MatrixXpr XprKind;
157615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  // Let's remove NestByRefBit
158615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  enum {
159615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    Flags0 = traits<typename remove_all<typename ExpressionType::Nested>::type >::Flags,
160615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray    Flags = Flags0 & ~NestByRefBit
161615d816d068b4d0f5e8df601930b5f160bf7eda1Tim Murray  };
162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType>
166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass MatrixWrapper : public MatrixBase<MatrixWrapper<ExpressionType> >
167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  public:
169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef MatrixBase<MatrixWrapper<ExpressionType> > Base;
170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_DENSE_PUBLIC_INTERFACE(MatrixWrapper)
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(MatrixWrapper)
172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::conditional<
174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                       internal::is_lvalue<ExpressionType>::value,
175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                       Scalar,
176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                       const Scalar
177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                     >::type ScalarWithConstIfNotLvalue;
178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename internal::nested<ExpressionType>::type NestedExpressionType;
180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    inline MatrixWrapper(ExpressionType& a_matrix) : m_expression(a_matrix) {}
182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index rows() const { return m_expression.rows(); }
184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index cols() const { return m_expression.cols(); }
185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index outerStride() const { return m_expression.outerStride(); }
186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Index innerStride() const { return m_expression.innerStride(); }
187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
188810535bb0c575a003b32076e5352ab8fd3f23a1cAmi Patel    inline ScalarWithConstIfNotLvalue* data() { return m_expression.const_cast_derived().data(); }
189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const Scalar* data() const { return m_expression.data(); }
190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1917faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    inline CoeffReturnType coeff(Index rowId, Index colId) const
192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
1937faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      return m_expression.coeff(rowId, colId);
194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1967faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    inline Scalar& coeffRef(Index rowId, Index colId)
197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
1987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      return m_expression.const_cast_derived().coeffRef(rowId, colId);
199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    inline const Scalar& coeffRef(Index rowId, Index colId) const
202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
2037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      return m_expression.derived().coeffRef(rowId, colId);
204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline CoeffReturnType coeff(Index index) const
207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_expression.coeff(index);
209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline Scalar& coeffRef(Index index)
212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_expression.const_cast_derived().coeffRef(index);
214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const Scalar& coeffRef(Index index) const
217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_expression.const_cast_derived().coeffRef(index);
219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int LoadMode>
2227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    inline const PacketScalar packet(Index rowId, Index colId) const
223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
2247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      return m_expression.template packet<LoadMode>(rowId, colId);
225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int LoadMode>
2287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    inline void writePacket(Index rowId, Index colId, const PacketScalar& val)
229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
2307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      m_expression.const_cast_derived().template writePacket<LoadMode>(rowId, colId, val);
231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int LoadMode>
234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    inline const PacketScalar packet(Index index) const
235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_expression.template packet<LoadMode>(index);
237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    template<int LoadMode>
2407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    inline void writePacket(Index index, const PacketScalar& val)
241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
2427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      m_expression.const_cast_derived().template writePacket<LoadMode>(index, val);
243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    const typename internal::remove_all<NestedExpressionType>::type&
246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    nestedExpression() const
247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return m_expression;
249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    /** Forwards the resizing request to the nested expression
2527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      * \sa DenseBase::resize(Index)  */
2537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    void resize(Index newSize) { m_expression.const_cast_derived().resize(newSize); }
2547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    /** Forwards the resizing request to the nested expression
2557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      * \sa DenseBase::resize(Index,Index)*/
2567faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    void resize(Index nbRows, Index nbCols) { m_expression.const_cast_derived().resize(nbRows,nbCols); }
2577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  protected:
259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    NestedExpressionType m_expression;
260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_ARRAYWRAPPER_H
265