1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
5//
6// This Source Code Form is subject to the terms of the Mozilla
7// Public License v. 2.0. If a copy of the MPL was not distributed
8// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9
10#ifndef EIGEN_ARRAYWRAPPER_H
11#define EIGEN_ARRAYWRAPPER_H
12
13namespace Eigen {
14
15/** \class ArrayWrapper
16 * \ingroup Core_Module
17 *
18 * \brief Expression of a mathematical vector or matrix as an array object
19 *
20 * This class is the return type of MatrixBase::array(), and most of the time
21 * this is the only way it is use.
22 *
23 * \sa MatrixBase::array(), class MatrixWrapper
24 */
25
26namespace internal {
27template<typename ExpressionType>
28struct traits<ArrayWrapper<ExpressionType> >
29 : public traits<typename remove_all<typename ExpressionType::Nested>::type >
30{
31 typedef ArrayXpr XprKind;
32 // Let's remove NestByRefBit
33 enum {
34 Flags0 = traits<typename remove_all<typename ExpressionType::Nested>::type >::Flags,
35 LvalueBitFlag = is_lvalue<ExpressionType>::value ? LvalueBit : 0,
36 Flags = (Flags0 & ~(NestByRefBit | LvalueBit)) | LvalueBitFlag
37 };
38};
39}
40
41template<typename ExpressionType>
42class ArrayWrapper : public ArrayBase<ArrayWrapper<ExpressionType> >
43{
44 public:
45 typedef ArrayBase<ArrayWrapper> Base;
46 EIGEN_DENSE_PUBLIC_INTERFACE(ArrayWrapper)
47 EIGEN_INHERIT_ASSIGNMENT_OPERATORS(ArrayWrapper)
48 typedef typename internal::remove_all<ExpressionType>::type NestedExpression;
49
50 typedef typename internal::conditional<
51 internal::is_lvalue<ExpressionType>::value,
52 Scalar,
53 const Scalar
54 >::type ScalarWithConstIfNotLvalue;
55
56 typedef typename internal::ref_selector<ExpressionType>::non_const_type NestedExpressionType;
57
58 using Base::coeffRef;
59
60 EIGEN_DEVICE_FUNC
61 explicit EIGEN_STRONG_INLINE ArrayWrapper(ExpressionType& matrix) : m_expression(matrix) {}
62
63 EIGEN_DEVICE_FUNC
64 inline Index rows() const { return m_expression.rows(); }
65 EIGEN_DEVICE_FUNC
66 inline Index cols() const { return m_expression.cols(); }
67 EIGEN_DEVICE_FUNC
68 inline Index outerStride() const { return m_expression.outerStride(); }
69 EIGEN_DEVICE_FUNC
70 inline Index innerStride() const { return m_expression.innerStride(); }
71
72 EIGEN_DEVICE_FUNC
73 inline ScalarWithConstIfNotLvalue* data() { return m_expression.data(); }
74 EIGEN_DEVICE_FUNC
75 inline const Scalar* data() const { return m_expression.data(); }
76
77 EIGEN_DEVICE_FUNC
78 inline const Scalar& coeffRef(Index rowId, Index colId) const
79 {
80 return m_expression.coeffRef(rowId, colId);
81 }
82
83 EIGEN_DEVICE_FUNC
84 inline const Scalar& coeffRef(Index index) const
85 {
86 return m_expression.coeffRef(index);
87 }
88
89 template<typename Dest>
90 EIGEN_DEVICE_FUNC
91 inline void evalTo(Dest& dst) const { dst = m_expression; }
92
93 const typename internal::remove_all<NestedExpressionType>::type&
94 EIGEN_DEVICE_FUNC
95 nestedExpression() const
96 {
97 return m_expression;
98 }
99
100 /** Forwards the resizing request to the nested expression
101 * \sa DenseBase::resize(Index) */
102 EIGEN_DEVICE_FUNC
103 void resize(Index newSize) { m_expression.resize(newSize); }
104 /** Forwards the resizing request to the nested expression
105 * \sa DenseBase::resize(Index,Index)*/
106 EIGEN_DEVICE_FUNC
107 void resize(Index rows, Index cols) { m_expression.resize(rows,cols); }
108
109 protected:
110 NestedExpressionType m_expression;
111};
112
113/** \class MatrixWrapper
114 * \ingroup Core_Module
115 *
116 * \brief Expression of an array as a mathematical vector or matrix
117 *
118 * This class is the return type of ArrayBase::matrix(), and most of the time
119 * this is the only way it is use.
120 *
121 * \sa MatrixBase::matrix(), class ArrayWrapper
122 */
123
124namespace internal {
125template<typename ExpressionType>
126struct traits<MatrixWrapper<ExpressionType> >
127 : public traits<typename remove_all<typename ExpressionType::Nested>::type >
128{
129 typedef MatrixXpr XprKind;
130 // Let's remove NestByRefBit
131 enum {
132 Flags0 = traits<typename remove_all<typename ExpressionType::Nested>::type >::Flags,
133 LvalueBitFlag = is_lvalue<ExpressionType>::value ? LvalueBit : 0,
134 Flags = (Flags0 & ~(NestByRefBit | LvalueBit)) | LvalueBitFlag
135 };
136};
137}
138
139template<typename ExpressionType>
140class MatrixWrapper : public MatrixBase<MatrixWrapper<ExpressionType> >
141{
142 public:
143 typedef MatrixBase<MatrixWrapper<ExpressionType> > Base;
144 EIGEN_DENSE_PUBLIC_INTERFACE(MatrixWrapper)
145 EIGEN_INHERIT_ASSIGNMENT_OPERATORS(MatrixWrapper)
146 typedef typename internal::remove_all<ExpressionType>::type NestedExpression;
147
148 typedef typename internal::conditional<
149 internal::is_lvalue<ExpressionType>::value,
150 Scalar,
151 const Scalar
152 >::type ScalarWithConstIfNotLvalue;
153
154 typedef typename internal::ref_selector<ExpressionType>::non_const_type NestedExpressionType;
155
156 using Base::coeffRef;
157
158 EIGEN_DEVICE_FUNC
159 explicit inline MatrixWrapper(ExpressionType& matrix) : m_expression(matrix) {}
160
161 EIGEN_DEVICE_FUNC
162 inline Index rows() const { return m_expression.rows(); }
163 EIGEN_DEVICE_FUNC
164 inline Index cols() const { return m_expression.cols(); }
165 EIGEN_DEVICE_FUNC
166 inline Index outerStride() const { return m_expression.outerStride(); }
167 EIGEN_DEVICE_FUNC
168 inline Index innerStride() const { return m_expression.innerStride(); }
169
170 EIGEN_DEVICE_FUNC
171 inline ScalarWithConstIfNotLvalue* data() { return m_expression.data(); }
172 EIGEN_DEVICE_FUNC
173 inline const Scalar* data() const { return m_expression.data(); }
174
175 EIGEN_DEVICE_FUNC
176 inline const Scalar& coeffRef(Index rowId, Index colId) const
177 {
178 return m_expression.derived().coeffRef(rowId, colId);
179 }
180
181 EIGEN_DEVICE_FUNC
182 inline const Scalar& coeffRef(Index index) const
183 {
184 return m_expression.coeffRef(index);
185 }
186
187 EIGEN_DEVICE_FUNC
188 const typename internal::remove_all<NestedExpressionType>::type&
189 nestedExpression() const
190 {
191 return m_expression;
192 }
193
194 /** Forwards the resizing request to the nested expression
195 * \sa DenseBase::resize(Index) */
196 EIGEN_DEVICE_FUNC
197 void resize(Index newSize) { m_expression.resize(newSize); }
198 /** Forwards the resizing request to the nested expression
199 * \sa DenseBase::resize(Index,Index)*/
200 EIGEN_DEVICE_FUNC
201 void resize(Index rows, Index cols) { m_expression.resize(rows,cols); }
202
203 protected:
204 NestedExpressionType m_expression;
205};
206
207} // end namespace Eigen
208
209#endif // EIGEN_ARRAYWRAPPER_H
210