Committer:
jsoh91
Date:
Tue Sep 24 00:18:23 2019 +0000
Revision:
1:3b8049da21b8
Parent:
0:13a5d365ba16
ignore and revise some of error parts

Who changed what in which revision?

UserRevisionLine numberNew 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