12#ifndef EIGEN_MAPBASE_H
13#define EIGEN_MAPBASE_H
15#define EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) \
16 EIGEN_STATIC_ASSERT((int(internal::evaluator<Derived>::Flags) & LinearAccessBit) || Derived::IsVectorAtCompileTime, \
17 YOU_ARE_TRYING_TO_USE_AN_INDEX_BASED_ACCESSOR_ON_AN_EXPRESSION_THAT_DOES_NOT_SUPPORT_THAT)
20#include "./InternalHeaderCheck.h"
41template <
typename Derived>
42class MapBase<Derived,
ReadOnlyAccessors> :
public internal::dense_xpr_base<Derived>::type {
44 using Base =
typename internal::dense_xpr_base<Derived>::type;
46 RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
47 ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
48 InnerStrideAtCompileTime = internal::traits<Derived>::InnerStrideAtCompileTime,
49 SizeAtCompileTime = Base::SizeAtCompileTime
52 using StorageKind =
typename internal::traits<Derived>::StorageKind;
53 using Scalar =
typename internal::traits<Derived>::Scalar;
54 using PacketScalar =
typename internal::packet_traits<Scalar>::type;
55 using RealScalar =
typename NumTraits<Scalar>::Real;
56 using PointerType = std::conditional_t<bool(internal::is_lvalue<Derived>::value), Scalar*,
const Scalar*>;
63 using Base::IsRowMajor;
64 using Base::IsVectorAtCompileTime;
65 using Base::MaxColsAtCompileTime;
66 using Base::MaxRowsAtCompileTime;
67 using Base::MaxSizeAtCompileTime;
73 using Base::lazyAssign;
77 using Base::colStride;
78 using Base::innerStride;
79 using Base::outerStride;
80 using Base::rowStride;
83 using Base::operator=;
85 using CoeffReturnType =
typename Base::CoeffReturnType;
88 EIGEN_DEVICE_FUNC
constexpr Index rows() const noexcept {
return m_rows.value(); }
90 EIGEN_DEVICE_FUNC
constexpr Index cols() const noexcept {
return m_cols.value(); }
98 EIGEN_DEVICE_FUNC
constexpr const Scalar* data()
const {
return m_data; }
101 EIGEN_DEVICE_FUNC
constexpr inline const Scalar& coeff(Index rowId, Index colId)
const {
102 return m_data[colId * colStride() + rowId * rowStride()];
106 EIGEN_DEVICE_FUNC
constexpr inline const Scalar& coeff(Index index)
const {
107 EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
108 return m_data[index * innerStride()];
112 EIGEN_DEVICE_FUNC
constexpr inline const Scalar& coeffRef(Index rowId, Index colId)
const {
113 return this->m_data[colId * colStride() + rowId * rowStride()];
117 EIGEN_DEVICE_FUNC
constexpr inline const Scalar& coeffRef(Index index)
const {
118 EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
119 return this->m_data[index * innerStride()];
123 template <
int LoadMode>
124 inline PacketScalar packet(Index rowId, Index colId)
const {
125 return internal::ploadt<PacketScalar, LoadMode>(m_data + (colId * colStride() + rowId * rowStride()));
129 template <
int LoadMode>
130 inline PacketScalar packet(Index index)
const {
131 EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
132 return internal::ploadt<PacketScalar, LoadMode>(m_data + index * innerStride());
136 EIGEN_DEVICE_FUNC
constexpr explicit inline MapBase(PointerType dataPtr)
137 : m_data(dataPtr), m_rows(RowsAtCompileTime), m_cols(ColsAtCompileTime) {
138 EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
139 checkSanity<Derived>();
143 EIGEN_DEVICE_FUNC
constexpr inline MapBase(PointerType dataPtr, Index vecSize)
145 m_rows(RowsAtCompileTime == Dynamic ? vecSize : Index(RowsAtCompileTime)),
146 m_cols(ColsAtCompileTime == Dynamic ? vecSize : Index(ColsAtCompileTime)) {
147 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
148 eigen_assert(vecSize >= 0);
149 eigen_assert(dataPtr == 0 || SizeAtCompileTime == Dynamic || SizeAtCompileTime == vecSize);
150 checkSanity<Derived>();
154 EIGEN_DEVICE_FUNC
constexpr inline MapBase(PointerType dataPtr, Index rows, Index cols)
155 : m_data(dataPtr), m_rows(rows), m_cols(cols) {
156 eigen_assert((dataPtr == 0) || (rows >= 0 && (RowsAtCompileTime == Dynamic || RowsAtCompileTime == rows) &&
157 cols >= 0 && (ColsAtCompileTime == Dynamic || ColsAtCompileTime == cols)));
158 checkSanity<Derived>();
161#ifdef EIGEN_MAPBASE_PLUGIN
162#include EIGEN_MAPBASE_PLUGIN
166 EIGEN_DEFAULT_COPY_CONSTRUCTOR(MapBase)
167 EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(MapBase)
169 template <
typename T, std::enable_if_t<(
internal::traits<T>::Alignment > 0),
int> = 0>
170 EIGEN_DEVICE_FUNC
void checkSanity()
const {
173#ifndef EIGEN_ALLOW_UNALIGNED_SCALARS
175 eigen_assert((std::uintptr_t(m_data) %
alignof(Scalar) == 0) &&
"data is not scalar-aligned");
177#if EIGEN_MAX_ALIGN_BYTES > 0
180 constexpr Index minInnerStride = InnerStrideAtCompileTime == Dynamic ? 1 : Index(InnerStrideAtCompileTime);
181 EIGEN_ONLY_USED_FOR_DEBUG(minInnerStride);
182 eigen_assert((((std::uintptr_t(m_data) % internal::traits<Derived>::Alignment) == 0) ||
183 (cols() * rows() * minInnerStride *
sizeof(Scalar)) < internal::traits<Derived>::Alignment) &&
184 "data is not aligned");
188 template <typename T, std::enable_if_t<internal::traits<T>::Alignment == 0,
int> = 0>
189 EIGEN_DEVICE_FUNC
void checkSanity()
const {
190#ifndef EIGEN_ALLOW_UNALIGNED_SCALARS
192 eigen_assert((std::uintptr_t(m_data) %
alignof(Scalar) == 0) &&
"data is not scalar-aligned");
197 const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_rows;
198 const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_cols;
211template <
typename Derived>
212class MapBase<Derived,
WriteAccessors> :
public MapBase<Derived, ReadOnlyAccessors> {
213 using ReadOnlyMapBase = MapBase<Derived, ReadOnlyAccessors>;
216 using Base = MapBase<Derived, ReadOnlyAccessors>;
218 using Scalar =
typename Base::Scalar;
219 using PacketScalar =
typename Base::PacketScalar;
220 using StorageIndex =
typename Base::StorageIndex;
221 using PointerType =
typename Base::PointerType;
224 using Base::coeffRef;
230 using Base::colStride;
231 using Base::innerStride;
232 using Base::outerStride;
233 using Base::rowStride;
235 using ScalarWithConstIfNotLvalue = std::conditional_t<internal::is_lvalue<Derived>::value, Scalar,
const Scalar>;
237 EIGEN_DEVICE_FUNC
constexpr const Scalar* data()
const {
return this->m_data; }
238 EIGEN_DEVICE_FUNC
constexpr ScalarWithConstIfNotLvalue* data() {
242 EIGEN_DEVICE_FUNC
constexpr inline ScalarWithConstIfNotLvalue& coeffRef(Index row, Index col) {
243 return this->m_data[col * colStride() + row * rowStride()];
246 EIGEN_DEVICE_FUNC
constexpr inline ScalarWithConstIfNotLvalue& coeffRef(Index index) {
247 EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
248 return this->m_data[index * innerStride()];
251 template <
int StoreMode>
252 inline void writePacket(Index row, Index col,
const PacketScalar& val) {
253 internal::pstoret<Scalar, PacketScalar, StoreMode>(this->m_data + (col * colStride() + row * rowStride()), val);
256 template <
int StoreMode>
257 inline void writePacket(Index index,
const PacketScalar& val) {
258 EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
259 internal::pstoret<Scalar, PacketScalar, StoreMode>(this->m_data + index * innerStride(), val);
262 EIGEN_DEVICE_FUNC
constexpr explicit inline MapBase(PointerType dataPtr) : Base(dataPtr) {}
263 EIGEN_DEVICE_FUNC
constexpr inline MapBase(PointerType dataPtr, Index vecSize) : Base(dataPtr, vecSize) {}
264 EIGEN_DEVICE_FUNC
constexpr inline MapBase(PointerType dataPtr, Index rows, Index cols) : Base(dataPtr, rows, cols) {}
266 EIGEN_DEVICE_FUNC Derived& operator=(
const MapBase& other) {
267 ReadOnlyMapBase::Base::operator=(other);
273 using ReadOnlyMapBase::Base::operator=;
276 EIGEN_DEFAULT_COPY_CONSTRUCTOR(MapBase)
277 EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(MapBase)
280#undef EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS
@ ReadOnlyAccessors
Definition Constants.h:377
@ WriteAccessors
Definition Constants.h:379