WPILibC++ 2023.4.3-108-ge5452e3
ArrayWrapper.h
Go to the documentation of this file.
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{
32 // Let's remove NestByRefBit
33 enum {
36 Flags = (Flags0 & ~(NestByRefBit | LvalueBit)) | LvalueBitFlag
37 };
38};
39}
40
41template<typename ExpressionType>
42class ArrayWrapper : public ArrayBase<ArrayWrapper<ExpressionType> >
43{
44 public:
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
55
56 typedef typename internal::ref_selector<ExpressionType>::non_const_type NestedExpressionType;
57
58 using Base::coeffRef;
59
62
64 inline Index rows() const EIGEN_NOEXCEPT { return m_expression.rows(); }
66 inline Index cols() const EIGEN_NOEXCEPT { return m_expression.cols(); }
68 inline Index outerStride() const EIGEN_NOEXCEPT { return m_expression.outerStride(); }
70 inline Index innerStride() const EIGEN_NOEXCEPT { return m_expression.innerStride(); }
71
73 inline ScalarWithConstIfNotLvalue* data() { return m_expression.data(); }
75 inline const Scalar* data() const { return m_expression.data(); }
76
78 inline const Scalar& coeffRef(Index rowId, Index colId) const
79 {
80 return m_expression.coeffRef(rowId, colId);
81 }
82
84 inline const Scalar& coeffRef(Index index) const
85 {
86 return m_expression.coeffRef(index);
87 }
88
89 template<typename Dest>
91 inline void evalTo(Dest& dst) const { dst = m_expression; }
92
96 {
97 return m_expression;
98 }
99
100 /** Forwards the resizing request to the nested expression
101 * \sa DenseBase::resize(Index) */
103 void resize(Index newSize) { m_expression.resize(newSize); }
104 /** Forwards the resizing request to the nested expression
105 * \sa DenseBase::resize(Index,Index)*/
108
109 protected:
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{
130 // Let's remove NestByRefBit
131 enum {
134 Flags = (Flags0 & ~(NestByRefBit | LvalueBit)) | LvalueBitFlag
135 };
136};
137}
138
139template<typename ExpressionType>
140class MatrixWrapper : public MatrixBase<MatrixWrapper<ExpressionType> >
141{
142 public:
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
153
154 typedef typename internal::ref_selector<ExpressionType>::non_const_type NestedExpressionType;
155
156 using Base::coeffRef;
157
159 explicit inline MatrixWrapper(ExpressionType& matrix) : m_expression(matrix) {}
160
162 inline Index rows() const EIGEN_NOEXCEPT { return m_expression.rows(); }
164 inline Index cols() const EIGEN_NOEXCEPT { return m_expression.cols(); }
166 inline Index outerStride() const EIGEN_NOEXCEPT { return m_expression.outerStride(); }
168 inline Index innerStride() const EIGEN_NOEXCEPT { return m_expression.innerStride(); }
169
171 inline ScalarWithConstIfNotLvalue* data() { return m_expression.data(); }
173 inline const Scalar* data() const { return m_expression.data(); }
174
176 inline const Scalar& coeffRef(Index rowId, Index colId) const
177 {
178 return m_expression.derived().coeffRef(rowId, colId);
179 }
180
182 inline const Scalar& coeffRef(Index index) const
183 {
184 return m_expression.coeffRef(index);
185 }
186
190 {
191 return m_expression;
192 }
193
194 /** Forwards the resizing request to the nested expression
195 * \sa DenseBase::resize(Index) */
197 void resize(Index newSize) { m_expression.resize(newSize); }
198 /** Forwards the resizing request to the nested expression
199 * \sa DenseBase::resize(Index,Index)*/
202
203 protected:
205};
206
207} // end namespace Eigen
208
209#endif // EIGEN_ARRAYWRAPPER_H
#define EIGEN_NOEXCEPT
Definition: Macros.h:1428
#define EIGEN_CONSTEXPR
Definition: Macros.h:797
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:986
#define EIGEN_DENSE_PUBLIC_INTERFACE(Derived)
Definition: Macros.h:1293
#define EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Derived)
Definition: Macros.h:1241
#define EIGEN_STRONG_INLINE
Definition: Macros.h:927
Base class for all 1D and 2D array, and related expressions.
Definition: ArrayBase.h:41
EIGEN_DEVICE_FUNC MatrixWrapper< ArrayWrapper< ExpressionType > > matrix()
Definition: ArrayBase.h:148
Expression of a mathematical vector or matrix as an array object.
Definition: ArrayWrapper.h:43
EIGEN_DEVICE_FUNC void resize(Index newSize)
Forwards the resizing request to the nested expression.
Definition: ArrayWrapper.h:103
NestedExpressionType m_expression
Definition: ArrayWrapper.h:110
EIGEN_DEVICE_FUNC const Scalar & coeffRef(Index rowId, Index colId) const
Definition: ArrayWrapper.h:78
EIGEN_DEVICE_FUNC const Scalar & coeffRef(Index index) const
Definition: ArrayWrapper.h:84
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index outerStride() const EIGEN_NOEXCEPT
Definition: ArrayWrapper.h:68
EIGEN_DEVICE_FUNC const Scalar * data() const
Definition: ArrayWrapper.h:75
EIGEN_DEVICE_FUNC void evalTo(Dest &dst) const
Definition: ArrayWrapper.h:91
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index innerStride() const EIGEN_NOEXCEPT
Definition: ArrayWrapper.h:70
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT
Definition: ArrayWrapper.h:66
ArrayBase< ArrayWrapper > Base
Definition: ArrayWrapper.h:45
EIGEN_DEVICE_FUNC void resize(Index rows, Index cols)
Forwards the resizing request to the nested expression.
Definition: ArrayWrapper.h:107
EIGEN_DEVICE_FUNC ScalarWithConstIfNotLvalue * data()
Definition: ArrayWrapper.h:73
EIGEN_DEVICE_FUNC const internal::remove_all< NestedExpressionType >::type & nestedExpression() const
Definition: ArrayWrapper.h:95
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT
Definition: ArrayWrapper.h:64
internal::remove_all< ExpressionType >::type NestedExpression
Definition: ArrayWrapper.h:48
internal::traits< ArrayWrapper< ExpressionType > >::Scalar Scalar
The numeric type of the expression' coefficients, e.g.
Definition: DenseBase.h:66
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:50
EIGEN_DEVICE_FUNC MatrixBase< MatrixWrapper< ExpressionType > > & matrix()
Definition: MatrixBase.h:314
internal::traits< MatrixWrapper< ExpressionType > >::Scalar Scalar
Definition: MatrixBase.h:56
Expression of an array as a mathematical vector or matrix.
Definition: ArrayWrapper.h:141
EIGEN_DEVICE_FUNC void resize(Index newSize)
Forwards the resizing request to the nested expression.
Definition: ArrayWrapper.h:197
MatrixBase< MatrixWrapper< ExpressionType > > Base
Definition: ArrayWrapper.h:143
internal::remove_all< ExpressionType >::type NestedExpression
Definition: ArrayWrapper.h:146
EIGEN_DEVICE_FUNC void resize(Index rows, Index cols)
Forwards the resizing request to the nested expression.
Definition: ArrayWrapper.h:201
EIGEN_DEVICE_FUNC const Scalar & coeffRef(Index rowId, Index colId) const
Definition: ArrayWrapper.h:176
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index cols() const EIGEN_NOEXCEPT
Definition: ArrayWrapper.h:164
EIGEN_DEVICE_FUNC ScalarWithConstIfNotLvalue * data()
Definition: ArrayWrapper.h:171
EIGEN_DEVICE_FUNC const Scalar * data() const
Definition: ArrayWrapper.h:173
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rows() const EIGEN_NOEXCEPT
Definition: ArrayWrapper.h:162
EIGEN_DEVICE_FUNC const Scalar & coeffRef(Index index) const
Definition: ArrayWrapper.h:182
NestedExpressionType m_expression
Definition: ArrayWrapper.h:204
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index innerStride() const EIGEN_NOEXCEPT
Definition: ArrayWrapper.h:168
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index outerStride() const EIGEN_NOEXCEPT
Definition: ArrayWrapper.h:166
EIGEN_DEVICE_FUNC const internal::remove_all< NestedExpressionType >::type & nestedExpression() const
Definition: ArrayWrapper.h:189
Definition: core.h:1240
type
Definition: core.h:575
const unsigned int LvalueBit
Means the expression has a coeffRef() method, i.e.
Definition: Constants.h:144
Namespace containing all symbols from the Eigen library.
Definition: Core:141
const unsigned int NestByRefBit
Definition: Constants.h:169
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74
Definition: Eigen_Colamd.h:50
The type used to identify an array expression.
Definition: Constants.h:525
The type used to identify a matrix expression.
Definition: Constants.h:522
Definition: XprHelper.h:660
T type
Definition: Meta.h:126
ArrayXpr XprKind
Definition: ArrayWrapper.h:31
MatrixXpr XprKind
Definition: ArrayWrapper.h:129
Definition: ForwardDeclarations.h:17
Definition: Meta.h:96