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