10 #ifndef EIGEN_DENSECOEFFSBASE_H 11 #define EIGEN_DENSECOEFFSBASE_H 16 template<
typename T>
struct add_const_on_value_type_if_arithmetic
18 typedef typename conditional<is_arithmetic<T>::value, T,
typename add_const_on_value_type<T>::type>::type type;
33 template<
typename Derived>
37 typedef typename internal::traits<Derived>::StorageKind StorageKind;
38 typedef typename internal::traits<Derived>::Scalar Scalar;
39 typedef typename internal::packet_traits<Scalar>::type PacketScalar;
48 typedef typename internal::conditional<bool(internal::traits<Derived>::Flags&
LvalueBit),
50 typename internal::conditional<internal::is_arithmetic<Scalar>::value, Scalar,
const Scalar>::type
51 >::type CoeffReturnType;
53 typedef typename internal::add_const_on_value_type_if_arithmetic<
54 typename internal::packet_traits<Scalar>::type
55 >::type PacketReturnType;
64 EIGEN_STRONG_INLINE
Index rowIndexByOuterInner(
Index outer,
Index inner)
const 66 return int(Derived::RowsAtCompileTime) == 1 ? 0
67 : int(Derived::ColsAtCompileTime) == 1 ? inner
73 EIGEN_STRONG_INLINE
Index colIndexByOuterInner(
Index outer,
Index inner)
const 75 return int(Derived::ColsAtCompileTime) == 1 ? 0
76 : int(Derived::RowsAtCompileTime) == 1 ? inner
98 eigen_internal_assert(row >= 0 && row < rows()
99 && col >= 0 && col < cols());
100 return internal::evaluator<Derived>(derived()).coeff(row,col);
104 EIGEN_STRONG_INLINE CoeffReturnType coeffByOuterInner(
Index outer,
Index inner)
const 106 return coeff(rowIndexByOuterInner(outer, inner),
107 colIndexByOuterInner(outer, inner));
117 eigen_assert(row >= 0 && row < rows()
118 && col >= 0 && col < cols());
119 return coeff(row, col);
138 EIGEN_STRONG_INLINE CoeffReturnType
141 EIGEN_STATIC_ASSERT(internal::evaluator<Derived>::Flags &
LinearAccessBit,
142 THIS_COEFFICIENT_ACCESSOR_TAKING_ONE_ACCESS_IS_ONLY_FOR_EXPRESSIONS_ALLOWING_LINEAR_ACCESS)
143 eigen_internal_assert(index >= 0 && index < size());
144 return internal::evaluator<Derived>(derived()).coeff(index);
157 EIGEN_STRONG_INLINE CoeffReturnType
160 EIGEN_STATIC_ASSERT(Derived::IsVectorAtCompileTime,
161 THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD)
162 eigen_assert(index >= 0 && index < size());
177 EIGEN_STRONG_INLINE CoeffReturnType
180 eigen_assert(index >= 0 && index < size());
187 EIGEN_STRONG_INLINE CoeffReturnType
188 x()
const {
return (*
this)[0]; }
193 EIGEN_STRONG_INLINE CoeffReturnType
196 EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=2, OUT_OF_RANGE_ACCESS);
203 EIGEN_STRONG_INLINE CoeffReturnType
206 EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=3, OUT_OF_RANGE_ACCESS);
213 EIGEN_STRONG_INLINE CoeffReturnType
216 EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=4, OUT_OF_RANGE_ACCESS);
230 template<
int LoadMode>
231 EIGEN_STRONG_INLINE PacketReturnType packet(
Index row,
Index col)
const 233 typedef typename internal::packet_traits<Scalar>::type DefaultPacketType;
234 eigen_internal_assert(row >= 0 && row < rows() && col >= 0 && col < cols());
235 return internal::evaluator<Derived>(derived()).
template packet<LoadMode,DefaultPacketType>(row,col);
240 template<
int LoadMode>
241 EIGEN_STRONG_INLINE PacketReturnType packetByOuterInner(
Index outer,
Index inner)
const 243 return packet<LoadMode>(rowIndexByOuterInner(outer, inner),
244 colIndexByOuterInner(outer, inner));
257 template<
int LoadMode>
258 EIGEN_STRONG_INLINE PacketReturnType packet(
Index index)
const 260 EIGEN_STATIC_ASSERT(internal::evaluator<Derived>::Flags &
LinearAccessBit,
261 THIS_COEFFICIENT_ACCESSOR_TAKING_ONE_ACCESS_IS_ONLY_FOR_EXPRESSIONS_ALLOWING_LINEAR_ACCESS)
262 typedef typename internal::packet_traits<Scalar>::type DefaultPacketType;
263 eigen_internal_assert(index >= 0 && index < size());
264 return internal::evaluator<Derived>(derived()).
template packet<LoadMode,DefaultPacketType>(index);
274 void coeffRefByOuterInner();
276 void writePacketByOuterInner();
278 void copyCoeffByOuterInner();
280 void copyPacketByOuterInner();
299 template<
typename Derived>
300 class DenseCoeffsBase<Derived,
WriteAccessors> :
public DenseCoeffsBase<Derived, ReadOnlyAccessors>
306 typedef typename internal::traits<Derived>::StorageKind StorageKind;
307 typedef typename internal::traits<Derived>::Scalar Scalar;
308 typedef typename internal::packet_traits<Scalar>::type PacketScalar;
316 using Base::rowIndexByOuterInner;
317 using Base::colIndexByOuterInner;
318 using Base::operator[];
319 using Base::operator();
342 eigen_internal_assert(row >= 0 && row < rows()
343 && col >= 0 && col < cols());
344 return internal::evaluator<Derived>(derived()).coeffRef(row,col);
348 EIGEN_STRONG_INLINE Scalar&
349 coeffRefByOuterInner(
Index outer,
Index inner)
351 return coeffRef(rowIndexByOuterInner(outer, inner),
352 colIndexByOuterInner(outer, inner));
361 EIGEN_STRONG_INLINE Scalar&
364 eigen_assert(row >= 0 && row < rows()
365 && col >= 0 && col < cols());
366 return coeffRef(row, col);
386 EIGEN_STRONG_INLINE Scalar&
389 EIGEN_STATIC_ASSERT(internal::evaluator<Derived>::Flags &
LinearAccessBit,
390 THIS_COEFFICIENT_ACCESSOR_TAKING_ONE_ACCESS_IS_ONLY_FOR_EXPRESSIONS_ALLOWING_LINEAR_ACCESS)
391 eigen_internal_assert(index >= 0 && index < size());
392 return internal::evaluator<Derived>(derived()).coeffRef(index);
403 EIGEN_STRONG_INLINE Scalar&
406 EIGEN_STATIC_ASSERT(Derived::IsVectorAtCompileTime,
407 THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD)
408 eigen_assert(index >= 0 && index < size());
409 return coeffRef(index);
422 EIGEN_STRONG_INLINE Scalar&
425 eigen_assert(index >= 0 && index < size());
426 return coeffRef(index);
432 EIGEN_STRONG_INLINE Scalar&
433 x() {
return (*
this)[0]; }
438 EIGEN_STRONG_INLINE Scalar&
441 EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=2, OUT_OF_RANGE_ACCESS);
448 EIGEN_STRONG_INLINE Scalar&
451 EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=3, OUT_OF_RANGE_ACCESS);
458 EIGEN_STRONG_INLINE Scalar&
461 EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=4, OUT_OF_RANGE_ACCESS);
477 template<
typename Derived>
478 class DenseCoeffsBase<Derived,
DirectAccessors> :
public DenseCoeffsBase<Derived, ReadOnlyAccessors>
483 typedef typename internal::traits<Derived>::Scalar Scalar;
498 return derived().innerStride();
509 return derived().outerStride();
513 inline Index stride()
const 515 return Derived::IsVectorAtCompileTime ? innerStride() : outerStride();
525 return Derived::IsRowMajor ? outerStride() : innerStride();
535 return Derived::IsRowMajor ? innerStride() : outerStride();
550 template<
typename Derived>
552 :
public DenseCoeffsBase<Derived, WriteAccessors>
557 typedef typename internal::traits<Derived>::Scalar Scalar;
572 return derived().innerStride();
583 return derived().outerStride();
587 inline Index stride()
const 589 return Derived::IsVectorAtCompileTime ? innerStride() : outerStride();
599 return Derived::IsRowMajor ? outerStride() : innerStride();
609 return Derived::IsRowMajor ? innerStride() : outerStride();
615 template<
int Alignment,
typename Derived,
bool JustReturnZero>
616 struct first_aligned_impl
618 static inline Index run(
const Derived&)
622 template<
int Alignment,
typename Derived>
623 struct first_aligned_impl<Alignment, Derived, false>
625 static inline Index run(
const Derived& m)
627 return internal::first_aligned<Alignment>(m.data(), m.size());
638 template<
int Alignment,
typename Derived>
641 enum { ReturnZero = (int(evaluator<Derived>::Alignment) >= Alignment) || !(Derived::Flags &
DirectAccessBit) };
642 return first_aligned_impl<Alignment, Derived, ReturnZero>::run(m.
derived());
645 template<
typename Derived>
648 typedef typename Derived::Scalar Scalar;
649 typedef typename packet_traits<Scalar>::type DefaultPacketType;
650 return internal::first_aligned<int(unpacket_traits<DefaultPacketType>::alignment),Derived>(m);
653 template<typename Derived, bool HasDirectAccess = has_direct_access<Derived>::ret>
654 struct inner_stride_at_compile_time
656 enum { ret = traits<Derived>::InnerStrideAtCompileTime };
659 template<
typename Derived>
660 struct inner_stride_at_compile_time<Derived, false>
665 template<typename Derived, bool HasDirectAccess = has_direct_access<Derived>::ret>
666 struct outer_stride_at_compile_time
668 enum { ret = traits<Derived>::OuterStrideAtCompileTime };
671 template<
typename Derived>
672 struct outer_stride_at_compile_time<Derived, false>
681 #endif // EIGEN_DENSECOEFFSBASE_H Scalar & operator()(Index row, Index col)
Definition: DenseCoeffsBase.h:362
Definition: Constants.h:368
CoeffReturnType x() const
Definition: DenseCoeffsBase.h:188
CoeffReturnType operator()(Index row, Index col) const
Definition: DenseCoeffsBase.h:115
CoeffReturnType coeff(Index index) const
Definition: DenseCoeffsBase.h:139
Index rowStride() const
Definition: DenseCoeffsBase.h:523
Index outerStride() const
Definition: DenseCoeffsBase.h:507
Index innerStride() const
Definition: DenseCoeffsBase.h:496
const unsigned int DirectAccessBit
Definition: Constants.h:150
Scalar & coeffRef(Index index)
Definition: DenseCoeffsBase.h:387
const unsigned int LvalueBit
Definition: Constants.h:139
CoeffReturnType w() const
Definition: DenseCoeffsBase.h:214
Namespace containing all symbols from the Eigen library.
Definition: Core:287
Scalar & operator()(Index index)
Definition: DenseCoeffsBase.h:423
Holds information about the various numeric (i.e. scalar) types allowed by Eigen. ...
Definition: NumTraits.h:150
Scalar & y()
Definition: DenseCoeffsBase.h:439
Derived & derived()
Definition: EigenBase.h:45
Index colStride() const
Definition: DenseCoeffsBase.h:533
Eigen::Index Index
The interface type of indices.
Definition: EigenBase.h:38
const unsigned int RowMajorBit
Definition: Constants.h:61
Base class for all dense matrices, vectors, and arrays.
Definition: DenseBase.h:41
CoeffReturnType z() const
Definition: DenseCoeffsBase.h:204
CoeffReturnType coeff(Index row, Index col) const
Definition: DenseCoeffsBase.h:96
Scalar & operator[](Index index)
Definition: DenseCoeffsBase.h:404
Definition: EigenBase.h:29
CoeffReturnType y() const
Definition: DenseCoeffsBase.h:194
Scalar & z()
Definition: DenseCoeffsBase.h:449
Definition: Constants.h:366
CoeffReturnType operator[](Index index) const
Definition: DenseCoeffsBase.h:158
Definition: Constants.h:370
Scalar & x()
Definition: DenseCoeffsBase.h:433
Index rowStride() const
Definition: DenseCoeffsBase.h:597
Definition: Constants.h:372
Definition: Eigen_Colamd.h:50
Scalar & w()
Definition: DenseCoeffsBase.h:459
Index innerStride() const
Definition: DenseCoeffsBase.h:570
Base class providing read-only coefficient access to matrices and arrays.
Definition: DenseCoeffsBase.h:34
CoeffReturnType operator()(Index index) const
Definition: DenseCoeffsBase.h:178
Index outerStride() const
Definition: DenseCoeffsBase.h:581
Base class providing read/write coefficient access to matrices and arrays.
Definition: DenseCoeffsBase.h:300
Index colStride() const
Definition: DenseCoeffsBase.h:607
Scalar & coeffRef(Index row, Index col)
Definition: DenseCoeffsBase.h:340
const unsigned int LinearAccessBit
Definition: Constants.h:125