11#ifndef EIGEN_DENSECOEFFSBASE_H
12#define EIGEN_DENSECOEFFSBASE_H
15#include "./InternalHeaderCheck.h"
31template <
typename Derived>
34 using StorageKind =
typename internal::traits<Derived>::StorageKind;
35 using Scalar =
typename internal::traits<Derived>::Scalar;
36 using PacketScalar =
typename internal::packet_traits<Scalar>::type;
51 using CoeffReturnType =
53 std::conditional_t<internal::is_arithmetic<Scalar>::value, Scalar,
const Scalar>>;
55 using PacketReturnType = std::conditional_t<internal::is_arithmetic<PacketScalar>::value, PacketScalar,
56 internal::add_const_on_value_type_t<PacketScalar>>;
58 using Base = EigenBase<Derived>;
64 EIGEN_DEVICE_FUNC
constexpr EIGEN_STRONG_INLINE Index rowIndexByOuterInner(Index outer, Index inner)
const {
65 return int(Derived::RowsAtCompileTime) == 1 ? 0
66 : int(Derived::ColsAtCompileTime) == 1 ? inner
71 EIGEN_DEVICE_FUNC
constexpr EIGEN_STRONG_INLINE Index colIndexByOuterInner(Index outer, Index inner)
const {
72 return int(Derived::ColsAtCompileTime) == 1 ? 0
73 : int(Derived::RowsAtCompileTime) == 1 ? inner
92 EIGEN_DEVICE_FUNC
constexpr CoeffReturnType coeff(Index row, Index col)
const {
93 eigen_internal_assert(row >= 0 && row < rows() && col >= 0 && col < cols());
94 return internal::evaluator<Derived>(derived()).coeff(row, col);
97 EIGEN_DEVICE_FUNC
constexpr CoeffReturnType coeffByOuterInner(Index outer, Index inner)
const {
98 return coeff(rowIndexByOuterInner(outer, inner), colIndexByOuterInner(outer, inner));
105 EIGEN_DEVICE_FUNC
constexpr CoeffReturnType operator()(Index row, Index col)
const {
106 eigen_assert(row >= 0 && row < rows() && col >= 0 && col < cols());
107 return coeff(row, col);
110#ifdef EIGEN_MULTIDIMENSIONAL_SUBSCRIPT
115 EIGEN_DEVICE_FUNC
constexpr CoeffReturnType operator[](Index row, Index col)
const {
return operator()(row, col); }
133 EIGEN_DEVICE_FUNC
constexpr CoeffReturnType coeff(Index index)
const {
134 EIGEN_STATIC_ASSERT(internal::evaluator<Derived>::Flags &
LinearAccessBit,
135 THIS_COEFFICIENT_ACCESSOR_TAKING_ONE_ACCESS_IS_ONLY_FOR_EXPRESSIONS_ALLOWING_LINEAR_ACCESS)
136 eigen_internal_assert(index >= 0 && index < size());
137 return internal::evaluator<Derived>(derived()).coeff(index);
149 EIGEN_DEVICE_FUNC
constexpr CoeffReturnType operator[](Index index)
const {
150 EIGEN_STATIC_ASSERT(Derived::IsVectorAtCompileTime,
151 THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD)
152 eigen_assert(index >= 0 && index < size());
166 EIGEN_DEVICE_FUNC
constexpr CoeffReturnType operator()(Index index)
const {
167 eigen_assert(index >= 0 && index < size());
173 EIGEN_DEVICE_FUNC
constexpr CoeffReturnType x()
const {
return (*
this)[0]; }
177 EIGEN_DEVICE_FUNC
constexpr CoeffReturnType y()
const {
178 EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime == -1 || Derived::SizeAtCompileTime >= 2, OUT_OF_RANGE_ACCESS);
184 EIGEN_DEVICE_FUNC
constexpr CoeffReturnType z()
const {
185 EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime == -1 || Derived::SizeAtCompileTime >= 3, OUT_OF_RANGE_ACCESS);
191 EIGEN_DEVICE_FUNC
constexpr CoeffReturnType w()
const {
192 EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime == -1 || Derived::SizeAtCompileTime >= 4, OUT_OF_RANGE_ACCESS);
206 template <
int LoadMode>
207 EIGEN_STRONG_INLINE PacketReturnType packet(Index row, Index col)
const {
208 using DefaultPacketType =
typename internal::packet_traits<Scalar>::type;
209 eigen_internal_assert(row >= 0 && row < rows() && col >= 0 && col < cols());
210 return internal::evaluator<Derived>(derived()).template packet<LoadMode, DefaultPacketType>(row, col);
214 template <
int LoadMode>
215 EIGEN_STRONG_INLINE PacketReturnType packetByOuterInner(Index outer, Index inner)
const {
216 return packet<LoadMode>(rowIndexByOuterInner(outer, inner), colIndexByOuterInner(outer, inner));
229 template <
int LoadMode>
230 EIGEN_STRONG_INLINE PacketReturnType packet(Index index)
const {
231 EIGEN_STATIC_ASSERT(internal::evaluator<Derived>::Flags &
LinearAccessBit,
232 THIS_COEFFICIENT_ACCESSOR_TAKING_ONE_ACCESS_IS_ONLY_FOR_EXPRESSIONS_ALLOWING_LINEAR_ACCESS)
233 using DefaultPacketType =
typename internal::packet_traits<Scalar>::type;
234 eigen_internal_assert(index >= 0 && index < size());
235 return internal::evaluator<Derived>(derived()).template packet<LoadMode, DefaultPacketType>(index);
245 void coeffRefByOuterInner();
247 void writePacketByOuterInner();
249 void copyCoeffByOuterInner();
251 void copyPacketByOuterInner();
271template <
typename Derived>
272class DenseCoeffsBase<Derived,
WriteAccessors> :
public DenseCoeffsBase<Derived, ReadOnlyAccessors> {
274 using Base = DenseCoeffsBase<Derived, ReadOnlyAccessors>;
276 using StorageKind =
typename internal::traits<Derived>::StorageKind;
277 using Scalar =
typename internal::traits<Derived>::Scalar;
278 using PacketScalar =
typename internal::packet_traits<Scalar>::type;
279 using RealScalar =
typename NumTraits<Scalar>::Real;
282 using Base::colIndexByOuterInner;
285 using Base::rowIndexByOuterInner;
288 using Base::operator[];
289 using Base::operator();
309 EIGEN_DEVICE_FUNC
constexpr Scalar& coeffRef(Index row, Index col) {
310 eigen_internal_assert(row >= 0 && row < rows() && col >= 0 && col < cols());
311 return internal::evaluator<Derived>(derived()).coeffRef(row, col);
314 EIGEN_DEVICE_FUNC
constexpr EIGEN_STRONG_INLINE Scalar& coeffRefByOuterInner(Index outer, Index inner) {
315 return coeffRef(rowIndexByOuterInner(outer, inner), colIndexByOuterInner(outer, inner));
322 EIGEN_DEVICE_FUNC
constexpr Scalar& operator()(Index row, Index col) {
323 eigen_assert(row >= 0 && row < rows() && col >= 0 && col < cols());
324 return coeffRef(row, col);
327#ifdef EIGEN_MULTIDIMENSIONAL_SUBSCRIPT
332 EIGEN_DEVICE_FUNC
constexpr Scalar& operator[](Index row, Index col) {
return operator()(row, col); }
350 EIGEN_DEVICE_FUNC
constexpr Scalar& coeffRef(Index index) {
351 EIGEN_STATIC_ASSERT(internal::evaluator<Derived>::Flags &
LinearAccessBit,
352 THIS_COEFFICIENT_ACCESSOR_TAKING_ONE_ACCESS_IS_ONLY_FOR_EXPRESSIONS_ALLOWING_LINEAR_ACCESS)
353 eigen_internal_assert(index >= 0 && index < size());
354 return internal::evaluator<Derived>(derived()).coeffRef(index);
365 EIGEN_DEVICE_FUNC
constexpr Scalar& operator[](Index index) {
366 EIGEN_STATIC_ASSERT(Derived::IsVectorAtCompileTime,
367 THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD)
368 eigen_assert(index >= 0 && index < size());
369 return coeffRef(index);
381 EIGEN_DEVICE_FUNC
constexpr Scalar& operator()(Index index) {
382 eigen_assert(index >= 0 && index < size());
383 return coeffRef(index);
388 EIGEN_DEVICE_FUNC
constexpr Scalar& x() {
return (*
this)[0]; }
392 EIGEN_DEVICE_FUNC
constexpr Scalar& y() {
393 EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime == -1 || Derived::SizeAtCompileTime >= 2, OUT_OF_RANGE_ACCESS);
399 EIGEN_DEVICE_FUNC
constexpr Scalar& z() {
400 EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime == -1 || Derived::SizeAtCompileTime >= 3, OUT_OF_RANGE_ACCESS);
406 EIGEN_DEVICE_FUNC
constexpr Scalar& w() {
407 EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime == -1 || Derived::SizeAtCompileTime >= 4, OUT_OF_RANGE_ACCESS);
424template <
typename Derived>
425class DenseCoeffsBase<Derived,
DirectAccessors> :
public DenseCoeffsBase<Derived, ReadOnlyAccessors> {
427 using Base = DenseCoeffsBase<Derived, ReadOnlyAccessors>;
428 using Scalar =
typename internal::traits<Derived>::Scalar;
429 using RealScalar =
typename NumTraits<Scalar>::Real;
440 EIGEN_DEVICE_FUNC
constexpr Index
innerStride()
const {
return derived().innerStride(); }
447 EIGEN_DEVICE_FUNC
constexpr Index
outerStride()
const {
return derived().outerStride(); }
450 constexpr Index stride()
const {
return Derived::IsVectorAtCompileTime ? innerStride() : outerStride(); }
477template <
typename Derived>
480 using Base = DenseCoeffsBase<Derived, WriteAccessors>;
481 using Scalar =
typename internal::traits<Derived>::Scalar;
482 using RealScalar =
typename NumTraits<Scalar>::Real;
493 EIGEN_DEVICE_FUNC
constexpr Index
innerStride() const noexcept {
return derived().innerStride(); }
500 EIGEN_DEVICE_FUNC
constexpr Index
outerStride() const noexcept {
return derived().outerStride(); }
503 constexpr Index stride() const noexcept {
return Derived::IsVectorAtCompileTime ? innerStride() : outerStride(); }
509 EIGEN_DEVICE_FUNC
constexpr Index
rowStride() const noexcept {
517 EIGEN_DEVICE_FUNC
constexpr Index
colStride() const noexcept {
524template <
int Alignment,
typename Derived,
bool JustReturnZero>
525struct first_aligned_impl {
526 static constexpr Index run(
const Derived&)
noexcept {
return 0; }
529template <
int Alignment,
typename Derived>
530struct first_aligned_impl<Alignment, Derived, false> {
531 static inline Index run(
const Derived& m) {
return internal::first_aligned<Alignment>(m.data(), m.size()); }
542template <
int Alignment,
typename Derived>
543static inline Index first_aligned(
const DenseBase<Derived>& m) {
544 enum { ReturnZero = (int(evaluator<Derived>::Alignment) >= Alignment) || !(Derived::Flags &
DirectAccessBit) };
545 return first_aligned_impl<Alignment, Derived, ReturnZero>::run(m.derived());
548template <
typename Derived>
549static inline Index first_default_aligned(
const DenseBase<Derived>& m) {
550 using Scalar =
typename Derived::Scalar;
551 using DefaultPacketType =
typename packet_traits<Scalar>::type;
552 return internal::first_aligned<int(unpacket_traits<DefaultPacketType>::alignment), Derived>(m);
555template <typename Derived, bool HasDirectAccess = has_direct_access<Derived>::value>
556struct inner_stride_at_compile_time : std::integral_constant<int, traits<Derived>::InnerStrideAtCompileTime> {};
558template <
typename Derived>
559struct inner_stride_at_compile_time<Derived, false> : std::integral_constant<int, 0> {};
561template <typename Derived, bool HasDirectAccess = has_direct_access<Derived>::value>
562struct outer_stride_at_compile_time : std::integral_constant<int, traits<Derived>::OuterStrideAtCompileTime> {};
564template <
typename Derived>
565struct outer_stride_at_compile_time<Derived, false> : std::integral_constant<int, 0> {};
constexpr Index rowStride() const
Definition DenseCoeffsBase.h:456
constexpr Index innerStride() const
Definition DenseCoeffsBase.h:440
constexpr Index colStride() const
Definition DenseCoeffsBase.h:462
constexpr Index outerStride() const
Definition DenseCoeffsBase.h:447
constexpr Index colStride() const noexcept
Definition DenseCoeffsBase.h:517
constexpr Index innerStride() const noexcept
Definition DenseCoeffsBase.h:493
constexpr Index outerStride() const noexcept
Definition DenseCoeffsBase.h:500
constexpr Index rowStride() const noexcept
Definition DenseCoeffsBase.h:509
@ DirectAccessors
Definition Constants.h:381
@ ReadOnlyAccessors
Definition Constants.h:377
@ WriteAccessors
Definition Constants.h:379
@ DirectWriteAccessors
Definition Constants.h:383
constexpr unsigned int DirectAccessBit
Definition Constants.h:160
constexpr unsigned int LinearAccessBit
Definition Constants.h:134
constexpr unsigned int LvalueBit
Definition Constants.h:149
constexpr unsigned int RowMajorBit
Definition Constants.h:71
Definition EigenBase.h:34