26 #ifndef EIGEN_MAPBASE_H
27 #define EIGEN_MAPBASE_H
29 #define EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) \
30 EIGEN_STATIC_ASSERT((int(internal::traits<Derived>::Flags) & LinearAccessBit) || Derived::IsVectorAtCompileTime, \
31 YOU_ARE_TRYING_TO_USE_AN_INDEX_BASED_ACCESSOR_ON_AN_EXPRESSION_THAT_DOES_NOT_SUPPORT_THAT)
43 :
public internal::dense_xpr_base<Derived>::type
47 typedef typename internal::dense_xpr_base<Derived>::type
Base;
49 RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
50 ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
51 SizeAtCompileTime = Base::SizeAtCompileTime
54 typedef typename internal::traits<Derived>::StorageKind
StorageKind;
55 typedef typename internal::traits<Derived>::Index
Index;
56 typedef typename internal::traits<Derived>::Scalar
Scalar;
57 typedef typename internal::packet_traits<Scalar>::type
PacketScalar;
59 typedef typename internal::conditional<
60 bool(internal::is_lvalue<Derived>::value),
69 using Base::MaxRowsAtCompileTime;
70 using Base::MaxColsAtCompileTime;
71 using Base::MaxSizeAtCompileTime;
72 using Base::IsVectorAtCompileTime;
74 using Base::IsRowMajor;
81 using Base::lazyAssign;
84 using Base::innerStride;
85 using Base::outerStride;
86 using Base::rowStride;
87 using Base::colStride;
90 using Base::operator=;
94 inline Index rows()
const {
return m_rows.value(); }
95 inline Index cols()
const {
return m_cols.value(); }
107 return m_data[col * colStride() + row * rowStride()];
113 return m_data[index * innerStride()];
118 return this->m_data[col * colStride() + row * rowStride()];
124 return this->m_data[index * innerStride()];
127 template<
int LoadMode>
130 return internal::ploadt<PacketScalar, LoadMode>
131 (m_data + (col * colStride() + row * rowStride()));
134 template<
int LoadMode>
138 return internal::ploadt<PacketScalar, LoadMode>(m_data + index * innerStride());
141 inline MapBase(
PointerType data) : m_data(data), m_rows(RowsAtCompileTime), m_cols(ColsAtCompileTime)
149 m_rows(RowsAtCompileTime ==
Dynamic ? size :
Index(RowsAtCompileTime)),
150 m_cols(ColsAtCompileTime ==
Dynamic ? size :
Index(ColsAtCompileTime))
159 : m_data(data), m_rows(rows), m_cols(cols)
162 || ( rows >= 0 && (RowsAtCompileTime ==
Dynamic || RowsAtCompileTime == rows)
163 && cols >= 0 && (ColsAtCompileTime ==
Dynamic || ColsAtCompileTime == cols)));
169 void checkSanity()
const
172 internal::inner_stride_at_compile_time<Derived>::ret==1),
173 PACKET_ACCESS_REQUIRES_TO_HAVE_INNER_STRIDE_FIXED_TO_1);
175 &&
"data is not aligned");
179 const internal::variable_if_dynamic<Index, RowsAtCompileTime>
m_rows;
180 const internal::variable_if_dynamic<Index, ColsAtCompileTime>
m_cols;
184 :
public MapBase<Derived, ReadOnlyAccessors>
200 using Base::coeffRef;
202 using Base::innerStride;
203 using Base::outerStride;
204 using Base::rowStride;
205 using Base::colStride;
207 typedef typename internal::conditional<
208 internal::is_lvalue<Derived>::value,
218 return this->m_data[col * colStride() + row * rowStride()];
224 return this->m_data[index * innerStride()];
227 template<
int StoreMode>
230 internal::pstoret<Scalar, PacketScalar, StoreMode>
231 (this->m_data + (col * colStride() + row * rowStride()), x);
234 template<
int StoreMode>
238 internal::pstoret<Scalar, PacketScalar, StoreMode>
239 (this->m_data + index * innerStride(), x);
248 Base::Base::operator=(other);
252 using Base::Base::operator=;
257 #endif // EIGEN_MAPBASE_H