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
inline const Scalar*
data()
const {
return m_data; }
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()];
112 return this->m_data[colId * colStride() + rowId * rowStride()];
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;
211class MapBase<Derived,
WriteAccessors> :
public MapBase<Derived, ReadOnlyAccessors> {
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
inline const Scalar* data()
const {
return this->m_data; }
237 EIGEN_DEVICE_FUNC
inline 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)