ArrayWrapper.h 7.86 KB
Newer Older
LM's avatar
LM committed
1 2 3 4 5
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
//
Don Gagne's avatar
Don Gagne committed
6 7 8
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
LM's avatar
LM committed
9 10 11 12

#ifndef EIGEN_ARRAYWRAPPER_H
#define EIGEN_ARRAYWRAPPER_H

Don Gagne's avatar
Don Gagne committed
13 14
namespace Eigen { 

LM's avatar
LM committed
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
/** \class ArrayWrapper
  * \ingroup Core_Module
  *
  * \brief Expression of a mathematical vector or matrix as an array object
  *
  * This class is the return type of MatrixBase::array(), and most of the time
  * this is the only way it is use.
  *
  * \sa MatrixBase::array(), class MatrixWrapper
  */

namespace internal {
template<typename ExpressionType>
struct traits<ArrayWrapper<ExpressionType> >
  : public traits<typename remove_all<typename ExpressionType::Nested>::type >
{
  typedef ArrayXpr XprKind;
};
}

template<typename ExpressionType>
class ArrayWrapper : public ArrayBase<ArrayWrapper<ExpressionType> >
{
  public:
    typedef ArrayBase<ArrayWrapper> Base;
    EIGEN_DENSE_PUBLIC_INTERFACE(ArrayWrapper)
    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(ArrayWrapper)

    typedef typename internal::conditional<
                       internal::is_lvalue<ExpressionType>::value,
                       Scalar,
                       const Scalar
                     >::type ScalarWithConstIfNotLvalue;

    typedef typename internal::nested<ExpressionType>::type NestedExpressionType;

Don Gagne's avatar
Don Gagne committed
51
    inline ArrayWrapper(ExpressionType& matrix) : m_expression(matrix) {}
LM's avatar
LM committed
52 53 54 55 56 57

    inline Index rows() const { return m_expression.rows(); }
    inline Index cols() const { return m_expression.cols(); }
    inline Index outerStride() const { return m_expression.outerStride(); }
    inline Index innerStride() const { return m_expression.innerStride(); }

Don Gagne's avatar
Don Gagne committed
58
    inline ScalarWithConstIfNotLvalue* data() { return m_expression.const_cast_derived().data(); }
LM's avatar
LM committed
59 60
    inline const Scalar* data() const { return m_expression.data(); }

Don Gagne's avatar
Don Gagne committed
61
    inline CoeffReturnType coeff(Index rowId, Index colId) const
LM's avatar
LM committed
62
    {
Don Gagne's avatar
Don Gagne committed
63
      return m_expression.coeff(rowId, colId);
LM's avatar
LM committed
64 65
    }

Don Gagne's avatar
Don Gagne committed
66
    inline Scalar& coeffRef(Index rowId, Index colId)
LM's avatar
LM committed
67
    {
Don Gagne's avatar
Don Gagne committed
68
      return m_expression.const_cast_derived().coeffRef(rowId, colId);
LM's avatar
LM committed
69 70
    }

Don Gagne's avatar
Don Gagne committed
71
    inline const Scalar& coeffRef(Index rowId, Index colId) const
LM's avatar
LM committed
72
    {
Don Gagne's avatar
Don Gagne committed
73
      return m_expression.const_cast_derived().coeffRef(rowId, colId);
LM's avatar
LM committed
74 75
    }

Don Gagne's avatar
Don Gagne committed
76
    inline CoeffReturnType coeff(Index index) const
LM's avatar
LM committed
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
    {
      return m_expression.coeff(index);
    }

    inline Scalar& coeffRef(Index index)
    {
      return m_expression.const_cast_derived().coeffRef(index);
    }

    inline const Scalar& coeffRef(Index index) const
    {
      return m_expression.const_cast_derived().coeffRef(index);
    }

    template<int LoadMode>
Don Gagne's avatar
Don Gagne committed
92
    inline const PacketScalar packet(Index rowId, Index colId) const
LM's avatar
LM committed
93
    {
Don Gagne's avatar
Don Gagne committed
94
      return m_expression.template packet<LoadMode>(rowId, colId);
LM's avatar
LM committed
95 96 97
    }

    template<int LoadMode>
Don Gagne's avatar
Don Gagne committed
98
    inline void writePacket(Index rowId, Index colId, const PacketScalar& val)
LM's avatar
LM committed
99
    {
Don Gagne's avatar
Don Gagne committed
100
      m_expression.const_cast_derived().template writePacket<LoadMode>(rowId, colId, val);
LM's avatar
LM committed
101 102 103 104 105 106 107 108 109
    }

    template<int LoadMode>
    inline const PacketScalar packet(Index index) const
    {
      return m_expression.template packet<LoadMode>(index);
    }

    template<int LoadMode>
Don Gagne's avatar
Don Gagne committed
110
    inline void writePacket(Index index, const PacketScalar& val)
LM's avatar
LM committed
111
    {
Don Gagne's avatar
Don Gagne committed
112
      m_expression.const_cast_derived().template writePacket<LoadMode>(index, val);
LM's avatar
LM committed
113 114 115 116 117
    }

    template<typename Dest>
    inline void evalTo(Dest& dst) const { dst = m_expression; }

Don Gagne's avatar
Don Gagne committed
118 119 120 121 122 123 124 125 126 127 128 129 130
    const typename internal::remove_all<NestedExpressionType>::type& 
    nestedExpression() const 
    {
      return m_expression;
    }

    /** Forwards the resizing request to the nested expression
      * \sa DenseBase::resize(Index)  */
    void resize(Index newSize) { m_expression.const_cast_derived().resize(newSize); }
    /** Forwards the resizing request to the nested expression
      * \sa DenseBase::resize(Index,Index)*/
    void resize(Index nbRows, Index nbCols) { m_expression.const_cast_derived().resize(nbRows,nbCols); }

LM's avatar
LM committed
131
  protected:
Don Gagne's avatar
Don Gagne committed
132
    NestedExpressionType m_expression;
LM's avatar
LM committed
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
};

/** \class MatrixWrapper
  * \ingroup Core_Module
  *
  * \brief Expression of an array as a mathematical vector or matrix
  *
  * This class is the return type of ArrayBase::matrix(), and most of the time
  * this is the only way it is use.
  *
  * \sa MatrixBase::matrix(), class ArrayWrapper
  */

namespace internal {
template<typename ExpressionType>
struct traits<MatrixWrapper<ExpressionType> >
 : public traits<typename remove_all<typename ExpressionType::Nested>::type >
{
  typedef MatrixXpr XprKind;
};
}

template<typename ExpressionType>
class MatrixWrapper : public MatrixBase<MatrixWrapper<ExpressionType> >
{
  public:
    typedef MatrixBase<MatrixWrapper<ExpressionType> > Base;
    EIGEN_DENSE_PUBLIC_INTERFACE(MatrixWrapper)
    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(MatrixWrapper)

    typedef typename internal::conditional<
                       internal::is_lvalue<ExpressionType>::value,
                       Scalar,
                       const Scalar
                     >::type ScalarWithConstIfNotLvalue;

    typedef typename internal::nested<ExpressionType>::type NestedExpressionType;

Don Gagne's avatar
Don Gagne committed
171
    inline MatrixWrapper(ExpressionType& a_matrix) : m_expression(a_matrix) {}
LM's avatar
LM committed
172 173 174 175 176 177

    inline Index rows() const { return m_expression.rows(); }
    inline Index cols() const { return m_expression.cols(); }
    inline Index outerStride() const { return m_expression.outerStride(); }
    inline Index innerStride() const { return m_expression.innerStride(); }

Don Gagne's avatar
Don Gagne committed
178
    inline ScalarWithConstIfNotLvalue* data() { return m_expression.const_cast_derived().data(); }
LM's avatar
LM committed
179 180
    inline const Scalar* data() const { return m_expression.data(); }

Don Gagne's avatar
Don Gagne committed
181
    inline CoeffReturnType coeff(Index rowId, Index colId) const
LM's avatar
LM committed
182
    {
Don Gagne's avatar
Don Gagne committed
183
      return m_expression.coeff(rowId, colId);
LM's avatar
LM committed
184 185
    }

Don Gagne's avatar
Don Gagne committed
186
    inline Scalar& coeffRef(Index rowId, Index colId)
LM's avatar
LM committed
187
    {
Don Gagne's avatar
Don Gagne committed
188
      return m_expression.const_cast_derived().coeffRef(rowId, colId);
LM's avatar
LM committed
189 190
    }

Don Gagne's avatar
Don Gagne committed
191
    inline const Scalar& coeffRef(Index rowId, Index colId) const
LM's avatar
LM committed
192
    {
Don Gagne's avatar
Don Gagne committed
193
      return m_expression.derived().coeffRef(rowId, colId);
LM's avatar
LM committed
194 195
    }

Don Gagne's avatar
Don Gagne committed
196
    inline CoeffReturnType coeff(Index index) const
LM's avatar
LM committed
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
    {
      return m_expression.coeff(index);
    }

    inline Scalar& coeffRef(Index index)
    {
      return m_expression.const_cast_derived().coeffRef(index);
    }

    inline const Scalar& coeffRef(Index index) const
    {
      return m_expression.const_cast_derived().coeffRef(index);
    }

    template<int LoadMode>
Don Gagne's avatar
Don Gagne committed
212
    inline const PacketScalar packet(Index rowId, Index colId) const
LM's avatar
LM committed
213
    {
Don Gagne's avatar
Don Gagne committed
214
      return m_expression.template packet<LoadMode>(rowId, colId);
LM's avatar
LM committed
215 216 217
    }

    template<int LoadMode>
Don Gagne's avatar
Don Gagne committed
218
    inline void writePacket(Index rowId, Index colId, const PacketScalar& val)
LM's avatar
LM committed
219
    {
Don Gagne's avatar
Don Gagne committed
220
      m_expression.const_cast_derived().template writePacket<LoadMode>(rowId, colId, val);
LM's avatar
LM committed
221 222 223 224 225 226 227 228 229
    }

    template<int LoadMode>
    inline const PacketScalar packet(Index index) const
    {
      return m_expression.template packet<LoadMode>(index);
    }

    template<int LoadMode>
Don Gagne's avatar
Don Gagne committed
230 231 232 233 234 235 236
    inline void writePacket(Index index, const PacketScalar& val)
    {
      m_expression.const_cast_derived().template writePacket<LoadMode>(index, val);
    }

    const typename internal::remove_all<NestedExpressionType>::type& 
    nestedExpression() const 
LM's avatar
LM committed
237
    {
Don Gagne's avatar
Don Gagne committed
238
      return m_expression;
LM's avatar
LM committed
239 240
    }

Don Gagne's avatar
Don Gagne committed
241 242 243 244 245 246 247
    /** Forwards the resizing request to the nested expression
      * \sa DenseBase::resize(Index)  */
    void resize(Index newSize) { m_expression.const_cast_derived().resize(newSize); }
    /** Forwards the resizing request to the nested expression
      * \sa DenseBase::resize(Index,Index)*/
    void resize(Index nbRows, Index nbCols) { m_expression.const_cast_derived().resize(nbRows,nbCols); }

LM's avatar
LM committed
248
  protected:
Don Gagne's avatar
Don Gagne committed
249
    NestedExpressionType m_expression;
LM's avatar
LM committed
250 251
};

Don Gagne's avatar
Don Gagne committed
252 253
} // end namespace Eigen

LM's avatar
LM committed
254
#endif // EIGEN_ARRAYWRAPPER_H