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)
19#include "./InternalHeaderCheck.h"
40template <
typename Derived>
41class MapBase<Derived,
ReadOnlyAccessors> :
public internal::dense_xpr_base<Derived>::type {
43 typedef typename internal::dense_xpr_base<Derived>::type Base;
45 RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
46 ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
47 InnerStrideAtCompileTime = internal::traits<Derived>::InnerStrideAtCompileTime,
48 SizeAtCompileTime = Base::SizeAtCompileTime
51 typedef typename internal::traits<Derived>::StorageKind StorageKind;
52 typedef typename internal::traits<Derived>::Scalar Scalar;
53 typedef typename internal::packet_traits<Scalar>::type PacketScalar;
54 typedef typename NumTraits<Scalar>::Real RealScalar;
55 typedef std::conditional_t<bool(internal::is_lvalue<Derived>::value), Scalar*,
const Scalar*> PointerType;
62 using Base::IsRowMajor;
63 using Base::IsVectorAtCompileTime;
64 using Base::MaxColsAtCompileTime;
65 using Base::MaxRowsAtCompileTime;
66 using Base::MaxSizeAtCompileTime;
72 using Base::lazyAssign;
76 using Base::colStride;
77 using Base::innerStride;
78 using Base::outerStride;
79 using Base::rowStride;
82 using Base::operator=;
84 typedef typename Base::CoeffReturnType CoeffReturnType;
87 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
inline Index rows() const EIGEN_NOEXCEPT {
return m_rows.value(); }
89 EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR
inline Index cols() const EIGEN_NOEXCEPT {
return m_cols.value(); }
97 EIGEN_DEVICE_FUNC
constexpr const Scalar* data()
const {
return m_data; }
100 EIGEN_DEVICE_FUNC
inline const Scalar& coeff(
Index rowId,
Index colId)
const {
101 return m_data[colId * colStride() + rowId * rowStride()];
105 EIGEN_DEVICE_FUNC
inline const Scalar& coeff(
Index index)
const {
106 EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
107 return m_data[index * innerStride()];
111 EIGEN_DEVICE_FUNC
inline const Scalar& coeffRef(
Index rowId,
Index colId)
const {
112 return this->m_data[colId * colStride() + rowId * rowStride()];
116 EIGEN_DEVICE_FUNC
inline const Scalar& coeffRef(
Index index)
const {
117 EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
118 return this->m_data[index * innerStride()];
122 template <
int LoadMode>
123 inline PacketScalar packet(
Index rowId,
Index colId)
const {
124 return internal::ploadt<PacketScalar, LoadMode>(m_data + (colId * colStride() + rowId * rowStride()));
128 template <
int LoadMode>
129 inline PacketScalar packet(
Index index)
const {
130 EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
131 return internal::ploadt<PacketScalar, LoadMode>(m_data + index * innerStride());
135 EIGEN_DEVICE_FUNC
explicit inline MapBase(PointerType dataPtr)
136 : m_data(dataPtr), m_rows(RowsAtCompileTime), m_cols(ColsAtCompileTime) {
137 EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
138 checkSanity<Derived>();
142 EIGEN_DEVICE_FUNC
inline MapBase(PointerType dataPtr,
Index vecSize)
144 m_rows(RowsAtCompileTime ==
Dynamic ? vecSize :
Index(RowsAtCompileTime)),
145 m_cols(ColsAtCompileTime ==
Dynamic ? vecSize :
Index(ColsAtCompileTime)) {
146 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
147 eigen_assert(vecSize >= 0);
148 eigen_assert(dataPtr == 0 || SizeAtCompileTime ==
Dynamic || SizeAtCompileTime == vecSize);
149 checkSanity<Derived>();
153 EIGEN_DEVICE_FUNC
inline MapBase(PointerType dataPtr,
Index rows,
Index cols)
154 : m_data(dataPtr), m_rows(rows), m_cols(cols) {
155 eigen_assert((dataPtr == 0) || (rows >= 0 && (RowsAtCompileTime ==
Dynamic || RowsAtCompileTime == rows) &&
156 cols >= 0 && (ColsAtCompileTime ==
Dynamic || ColsAtCompileTime == cols)));
157 checkSanity<Derived>();
160#ifdef EIGEN_MAPBASE_PLUGIN
161#include EIGEN_MAPBASE_PLUGIN
165 EIGEN_DEFAULT_COPY_CONSTRUCTOR(MapBase)
166 EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(MapBase)
168 template <
typename T>
169 EIGEN_DEVICE_FUNC
void checkSanity(std::enable_if_t<(internal::traits<T>::Alignment > 0),
void*> = 0)
const {
172#ifndef EIGEN_ALLOW_UNALIGNED_SCALARS
174 eigen_assert((std::uintptr_t(m_data) %
alignof(Scalar) == 0) &&
"data is not scalar-aligned");
176#if EIGEN_MAX_ALIGN_BYTES > 0
179 const Index minInnerStride = InnerStrideAtCompileTime ==
Dynamic ? 1 :
Index(InnerStrideAtCompileTime);
180 EIGEN_ONLY_USED_FOR_DEBUG(minInnerStride);
181 eigen_assert((((std::uintptr_t(m_data) % internal::traits<Derived>::Alignment) == 0) ||
182 (cols() * rows() * minInnerStride *
sizeof(Scalar)) < internal::traits<Derived>::Alignment) &&
183 "data is not aligned");
187 template <
typename T>
188 EIGEN_DEVICE_FUNC
void checkSanity(std::enable_if_t<internal::traits<T>::Alignment == 0,
void*> = 0)
const {
189#ifndef EIGEN_ALLOW_UNALIGNED_SCALARS
191 eigen_assert((std::uintptr_t(m_data) %
alignof(Scalar) == 0) &&
"data is not scalar-aligned");
196 const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_rows;
197 const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_cols;
210template <
typename Derived>
211class MapBase<Derived,
WriteAccessors> :
public MapBase<Derived, ReadOnlyAccessors> {
212 typedef MapBase<Derived, ReadOnlyAccessors> ReadOnlyMapBase;
215 typedef MapBase<Derived, ReadOnlyAccessors> Base;
217 typedef typename Base::Scalar Scalar;
218 typedef typename Base::PacketScalar PacketScalar;
219 typedef typename Base::StorageIndex StorageIndex;
220 typedef typename Base::PointerType PointerType;
223 using Base::coeffRef;
229 using Base::colStride;
230 using Base::innerStride;
231 using Base::outerStride;
232 using Base::rowStride;
234 typedef std::conditional_t<internal::is_lvalue<Derived>::value, Scalar,
const Scalar> ScalarWithConstIfNotLvalue;
236 EIGEN_DEVICE_FUNC
constexpr const Scalar* data()
const {
return this->m_data; }
237 EIGEN_DEVICE_FUNC
constexpr ScalarWithConstIfNotLvalue* data() {
241 EIGEN_DEVICE_FUNC
inline ScalarWithConstIfNotLvalue& coeffRef(
Index row,
Index col) {
242 return this->m_data[col * colStride() + row * rowStride()];
245 EIGEN_DEVICE_FUNC
inline ScalarWithConstIfNotLvalue& coeffRef(
Index index) {
246 EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
247 return this->m_data[index * innerStride()];
250 template <
int StoreMode>
251 inline void writePacket(
Index row,
Index col,
const PacketScalar& val) {
252 internal::pstoret<Scalar, PacketScalar, StoreMode>(this->m_data + (col * colStride() + row * rowStride()), val);
255 template <
int StoreMode>
256 inline void writePacket(
Index index,
const PacketScalar& val) {
257 EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
258 internal::pstoret<Scalar, PacketScalar, StoreMode>(this->m_data + index * innerStride(), val);
261 EIGEN_DEVICE_FUNC
explicit inline MapBase(PointerType dataPtr) : Base(dataPtr) {}
262 EIGEN_DEVICE_FUNC
inline MapBase(PointerType dataPtr,
Index vecSize) : Base(dataPtr, vecSize) {}
263 EIGEN_DEVICE_FUNC
inline MapBase(PointerType dataPtr,
Index rows,
Index cols) : Base(dataPtr, rows, cols) {}
265 EIGEN_DEVICE_FUNC Derived& operator=(
const MapBase& other) {
266 ReadOnlyMapBase::Base::operator=(other);
272 using ReadOnlyMapBase::Base::operator=;
275 EIGEN_DEFAULT_COPY_CONSTRUCTOR(MapBase)
276 EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(MapBase)
279#undef EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS
@ ReadOnlyAccessors
Definition Constants.h:372
@ WriteAccessors
Definition Constants.h:374
Namespace containing all symbols from the Eigen library.
Definition B01_Experimental.dox:1
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition Meta.h:82
const int Dynamic
Definition Constants.h:25