11 #ifndef EIGEN_MAPBASE_H 12 #define EIGEN_MAPBASE_H 14 #define EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) \ 15 EIGEN_STATIC_ASSERT((int(internal::evaluator<Derived>::Flags) & LinearAccessBit) || Derived::IsVectorAtCompileTime, \ 16 YOU_ARE_TRYING_TO_USE_AN_INDEX_BASED_ACCESSOR_ON_AN_EXPRESSION_THAT_DOES_NOT_SUPPORT_THAT) 28 :
public internal::dense_xpr_base<Derived>::type
32 typedef typename internal::dense_xpr_base<Derived>::type Base;
34 RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
35 ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
36 SizeAtCompileTime = Base::SizeAtCompileTime
39 typedef typename internal::traits<Derived>::StorageKind StorageKind;
40 typedef typename internal::traits<Derived>::Scalar Scalar;
41 typedef typename internal::packet_traits<Scalar>::type PacketScalar;
42 typedef typename NumTraits<Scalar>::Real RealScalar;
43 typedef typename internal::conditional<
44 bool(internal::is_lvalue<Derived>::value),
53 using Base::MaxRowsAtCompileTime;
54 using Base::MaxColsAtCompileTime;
55 using Base::MaxSizeAtCompileTime;
56 using Base::IsVectorAtCompileTime;
58 using Base::IsRowMajor;
65 using Base::lazyAssign;
68 using Base::innerStride;
69 using Base::outerStride;
70 using Base::rowStride;
71 using Base::colStride;
74 using Base::operator=;
76 typedef typename Base::CoeffReturnType CoeffReturnType;
78 EIGEN_DEVICE_FUNC
inline Index rows()
const {
return m_rows.value(); }
79 EIGEN_DEVICE_FUNC
inline Index cols()
const {
return m_cols.value(); }
87 EIGEN_DEVICE_FUNC
inline const Scalar* data()
const {
return m_data; }
90 inline const Scalar& coeff(Index rowId, Index colId)
const 92 return m_data[colId * colStride() + rowId * rowStride()];
96 inline const Scalar& coeff(Index index)
const 98 EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
99 return m_data[index * innerStride()];
103 inline const Scalar& coeffRef(Index rowId, Index colId)
const 105 return this->m_data[colId * colStride() + rowId * rowStride()];
109 inline const Scalar& coeffRef(Index index)
const 111 EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
112 return this->m_data[index * innerStride()];
115 template<
int LoadMode>
116 inline PacketScalar packet(Index rowId, Index colId)
const 118 return internal::ploadt<PacketScalar, LoadMode>
119 (m_data + (colId * colStride() + rowId * rowStride()));
122 template<
int LoadMode>
123 inline PacketScalar packet(Index index)
const 125 EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
126 return
internal::ploadt<PacketScalar, LoadMode>(m_data + index * innerStride());
130 explicit inline MapBase(PointerType dataPtr) : m_data(dataPtr), m_rows(RowsAtCompileTime), m_cols(ColsAtCompileTime)
132 EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
137 inline MapBase(PointerType dataPtr, Index vecSize)
139 m_rows(RowsAtCompileTime == Dynamic ? vecSize : Index(RowsAtCompileTime)),
140 m_cols(ColsAtCompileTime == Dynamic ? vecSize : Index(ColsAtCompileTime))
142 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
143 eigen_assert(vecSize >= 0);
144 eigen_assert(dataPtr == 0 || SizeAtCompileTime == Dynamic || SizeAtCompileTime == vecSize);
149 inline MapBase(PointerType dataPtr, Index rows, Index cols)
150 : m_data(dataPtr), m_rows(rows), m_cols(cols)
152 eigen_assert( (dataPtr == 0)
153 || ( rows >= 0 && (RowsAtCompileTime == Dynamic || RowsAtCompileTime == rows)
154 && cols >= 0 && (ColsAtCompileTime == Dynamic || ColsAtCompileTime == cols)));
158 #ifdef EIGEN_MAPBASE_PLUGIN 159 #include EIGEN_MAPBASE_PLUGIN 165 void checkSanity()
const 167 #if EIGEN_MAX_ALIGN_BYTES>0 168 eigen_assert(((
size_t(m_data) % EIGEN_PLAIN_ENUM_MAX(1,internal::traits<Derived>::Alignment)) == 0) &&
"data is not aligned");
173 const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_rows;
174 const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_cols;
178 :
public MapBase<Derived, ReadOnlyAccessors>
180 typedef MapBase<Derived, ReadOnlyAccessors> ReadOnlyMapBase;
183 typedef MapBase<Derived, ReadOnlyAccessors> Base;
185 typedef typename Base::Scalar Scalar;
186 typedef typename Base::PacketScalar PacketScalar;
187 typedef typename Base::StorageIndex StorageIndex;
188 typedef typename Base::PointerType PointerType;
195 using Base::coeffRef;
197 using Base::innerStride;
198 using Base::outerStride;
199 using Base::rowStride;
200 using Base::colStride;
202 typedef typename internal::conditional<
203 internal::is_lvalue<Derived>::value,
206 >::type ScalarWithConstIfNotLvalue;
209 inline const Scalar* data()
const {
return this->m_data; }
211 inline ScalarWithConstIfNotLvalue* data() {
return this->m_data; }
214 inline ScalarWithConstIfNotLvalue& coeffRef(Index row, Index col)
216 return this->m_data[col * colStride() + row * rowStride()];
220 inline ScalarWithConstIfNotLvalue& coeffRef(Index index)
222 EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
223 return this->m_data[index * innerStride()];
226 template<
int StoreMode>
227 inline
void writePacket(Index row, Index col, const PacketScalar& val)
229 internal::pstoret<Scalar, PacketScalar, StoreMode>
230 (this->m_data + (col * colStride() + row * rowStride()), val);
233 template<
int StoreMode>
234 inline void writePacket(Index index,
const PacketScalar& val)
236 EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
237 internal::pstoret<Scalar, PacketScalar, StoreMode>
238 (this->m_data + index * innerStride(), val);
241 EIGEN_DEVICE_FUNC explicit inline MapBase(PointerType dataPtr) : Base(dataPtr) {}
242 EIGEN_DEVICE_FUNC
inline MapBase(PointerType dataPtr, Index vecSize) : Base(dataPtr, vecSize) {}
243 EIGEN_DEVICE_FUNC
inline MapBase(PointerType dataPtr, Index rows, Index cols) : Base(dataPtr, rows, cols) {}
246 Derived& operator=(
const MapBase& other)
248 ReadOnlyMapBase::Base::operator=(other);
254 using ReadOnlyMapBase::Base::operator=;
257 #undef EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS 261 #endif // EIGEN_MAPBASE_H Definition: Constants.h:368
Definition: Constants.h:366
Definition: Eigen_Colamd.h:54