25 #ifndef EIGEN_DENSECOEFFSBASE_H
26 #define EIGEN_DENSECOEFFSBASE_H
31 template<
typename T>
struct add_const_on_value_type_if_arithmetic
33 typedef typename conditional<is_arithmetic<T>::value, T,
typename add_const_on_value_type<T>::type>::type type;
48 template<
typename Derived>
52 typedef typename internal::traits<Derived>::StorageKind
StorageKind;
53 typedef typename internal::traits<Derived>::Index
Index;
54 typedef typename internal::traits<Derived>::Scalar
Scalar;
55 typedef typename internal::packet_traits<Scalar>::type
PacketScalar;
64 typedef typename internal::conditional<bool(internal::traits<Derived>::Flags&
LvalueBit),
66 typename internal::conditional<internal::is_arithmetic<Scalar>::value,
Scalar,
const Scalar>::type
69 typedef typename internal::add_const_on_value_type_if_arithmetic<
70 typename internal::packet_traits<Scalar>::type
81 return int(Derived::RowsAtCompileTime) == 1 ? 0
82 :
int(Derived::ColsAtCompileTime) == 1 ? inner
89 return int(Derived::ColsAtCompileTime) == 1 ? 0
90 :
int(Derived::RowsAtCompileTime) == 1 ? inner
112 && col >= 0 && col < cols());
113 return derived().coeff(row, col);
118 return coeff(rowIndexByOuterInner(outer, inner),
119 colIndexByOuterInner(outer, inner));
129 && col >= 0 && col < cols());
130 return derived().coeff(row, col);
152 return derived().coeff(index);
167 #ifndef EIGEN2_SUPPORT
169 THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD)
172 return derived().coeff(index);
189 return derived().coeff(index);
195 x()
const {
return (*
this)[0]; }
200 y()
const {
return (*
this)[1]; }
205 z()
const {
return (*
this)[2]; }
210 w()
const {
return (*
this)[3]; }
222 template<
int LoadMode>
226 && col >= 0 && col < cols());
227 return derived().template packet<LoadMode>(
row,
col);
232 template<
int LoadMode>
235 return packet<LoadMode>(rowIndexByOuterInner(outer, inner),
236 colIndexByOuterInner(outer, inner));
249 template<
int LoadMode>
253 return derived().template packet<LoadMode>(index);
263 void coeffRefByOuterInner();
265 void writePacketByOuterInner();
267 void copyCoeffByOuterInner();
269 void copyPacketByOuterInner();
288 template<
typename Derived>
295 typedef typename internal::traits<Derived>::StorageKind
StorageKind;
296 typedef typename internal::traits<Derived>::Index
Index;
297 typedef typename internal::traits<Derived>::Scalar
Scalar;
306 using Base::rowIndexByOuterInner;
307 using Base::colIndexByOuterInner;
308 using Base::operator[];
309 using Base::operator();
332 && col >= 0 && col < cols());
333 return derived().coeffRef(row, col);
339 return coeffRef(rowIndexByOuterInner(outer, inner),
340 colIndexByOuterInner(outer, inner));
352 && col >= 0 && col < cols());
353 return derived().coeffRef(row, col);
376 return derived().coeffRef(index);
389 #ifndef EIGEN2_SUPPORT
391 THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD)
394 return derived().coeffRef(index);
410 return derived().coeffRef(index);
416 x() {
return (*
this)[0]; }
421 y() {
return (*
this)[1]; }
426 z() {
return (*
this)[2]; }
431 w() {
return (*
this)[3]; }
443 template<
int StoreMode>
448 && col >= 0 && col < cols());
449 derived().template writePacket<StoreMode>(
row,
col,x);
454 template<
int StoreMode>
456 (
Index outer,
Index inner,
const typename internal::packet_traits<Scalar>::type& x)
458 writePacket<StoreMode>(rowIndexByOuterInner(outer, inner),
459 colIndexByOuterInner(outer, inner),
472 template<
int StoreMode>
474 (
Index index,
const typename internal::packet_traits<Scalar>::type& x)
477 derived().template writePacket<StoreMode>(index,x);
480 #ifndef EIGEN_PARSED_BY_DOXYGEN
490 template<
typename OtherDerived>
494 && col >= 0 && col < cols());
495 derived().coeffRef(row, col) = other.derived().coeff(row, col);
506 template<
typename OtherDerived>
510 derived().coeffRef(index) = other.derived().coeff(index);
514 template<
typename OtherDerived>
515 EIGEN_STRONG_INLINE void copyCoeffByOuterInner(Index outer, Index inner,
const DenseBase<OtherDerived>& other)
517 const Index row = rowIndexByOuterInner(outer,inner);
518 const Index col = colIndexByOuterInner(outer,inner);
520 derived().copyCoeff(row, col, other);
531 template<
typename OtherDerived,
int StoreMode,
int LoadMode>
532 EIGEN_STRONG_INLINE void copyPacket(Index row, Index col,
const DenseBase<OtherDerived>& other)
535 && col >= 0 && col < cols());
536 derived().template writePacket<StoreMode>(
row,
col,
537 other.derived().template packet<LoadMode>(
row,
col));
548 template<
typename OtherDerived,
int StoreMode,
int LoadMode>
552 derived().template writePacket<StoreMode>(index,
553 other.derived().template packet<LoadMode>(index));
557 template<
typename OtherDerived,
int StoreMode,
int LoadMode>
558 EIGEN_STRONG_INLINE void copyPacketByOuterInner(Index outer, Index inner,
const DenseBase<OtherDerived>& other)
560 const Index row = rowIndexByOuterInner(outer,inner);
561 const Index col = colIndexByOuterInner(outer,inner);
563 derived().template copyPacket< OtherDerived, StoreMode, LoadMode>(
row,
col, other);
580 template<
typename Derived>
586 typedef typename internal::traits<Derived>::Index
Index;
587 typedef typename internal::traits<Derived>::Scalar
Scalar;
601 return derived().innerStride();
611 return derived().outerStride();
617 return Derived::IsVectorAtCompileTime ? innerStride() : outerStride();
626 return Derived::IsRowMajor ? outerStride() : innerStride();
635 return Derived::IsRowMajor ? innerStride() : outerStride();
650 template<
typename Derived>
657 typedef typename internal::traits<Derived>::Index
Index;
658 typedef typename internal::traits<Derived>::Scalar
Scalar;
672 return derived().innerStride();
682 return derived().outerStride();
688 return Derived::IsVectorAtCompileTime ? innerStride() : outerStride();
697 return Derived::IsRowMajor ? outerStride() : innerStride();
706 return Derived::IsRowMajor ? innerStride() : outerStride();
712 template<
typename Derived,
bool JustReturnZero>
713 struct first_aligned_impl
715 static inline typename Derived::Index run(
const Derived&)
719 template<
typename Derived>
720 struct first_aligned_impl<Derived, false>
722 static inline typename Derived::Index run(
const Derived& m)
724 return internal::first_aligned(&m.const_cast_derived().coeffRef(0,0), m.size());
733 template<
typename Derived>
734 static inline typename Derived::Index first_aligned(
const Derived& m)
736 return first_aligned_impl
741 template<typename Derived, bool HasDirectAccess = has_direct_access<Derived>::ret>
742 struct inner_stride_at_compile_time
747 template<
typename Derived>
748 struct inner_stride_at_compile_time<Derived, false>
753 template<typename Derived, bool HasDirectAccess = has_direct_access<Derived>::ret>
754 struct outer_stride_at_compile_time
759 template<
typename Derived>
760 struct outer_stride_at_compile_time<Derived, false>
769 #endif // EIGEN_DENSECOEFFSBASE_H