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 | |
13 | namespace 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 | |
26 | namespace internal { |
27 | template<typename ExpressionType> |
28 | struct 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 | |
41 | template<typename ExpressionType> |
42 | class 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 | |
124 | namespace internal { |
125 | template<typename ExpressionType> |
126 | struct 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 | |
139 | template<typename ExpressionType> |
140 | class 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 | |