NDDEM
DenseCoeffsBase.h
Go to the documentation of this file.
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com>
5 //
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 
10 #ifndef EIGEN_DENSECOEFFSBASE_H
11 #define EIGEN_DENSECOEFFSBASE_H
12 
13 namespace Eigen {
14 
15 namespace internal {
16 template<typename T> struct add_const_on_value_type_if_arithmetic
17 {
19 };
20 }
21 
34 template<typename Derived>
35 class DenseCoeffsBase<Derived,ReadOnlyAccessors> : public EigenBase<Derived>
36 {
37  public:
41 
42  // Explanation for this CoeffReturnType typedef.
43  // - This is the return type of the coeff() method.
44  // - The LvalueBit means exactly that we can offer a coeffRef() method, which means exactly that we can get references
45  // to coeffs, which means exactly that we can have coeff() return a const reference (as opposed to returning a value).
46  // - The is_artihmetic check is required since "const int", "const double", etc. will cause warnings on some systems
47  // while the declaration of "const T", where T is a non arithmetic type does not. Always returning "const Scalar&" is
48  // not possible, since the underlying expressions might not offer a valid address the reference could be referring to.
50  const Scalar&,
53 
57 
59  using Base::rows;
60  using Base::cols;
61  using Base::size;
62  using Base::derived;
63 
66  {
67  return int(Derived::RowsAtCompileTime) == 1 ? 0
68  : int(Derived::ColsAtCompileTime) == 1 ? inner
69  : int(Derived::Flags)&RowMajorBit ? outer
70  : inner;
71  }
72 
75  {
76  return int(Derived::ColsAtCompileTime) == 1 ? 0
77  : int(Derived::RowsAtCompileTime) == 1 ? inner
78  : int(Derived::Flags)&RowMajorBit ? inner
79  : outer;
80  }
81 
98  {
99  eigen_internal_assert(row >= 0 && row < rows()
100  && col >= 0 && col < cols());
101  return internal::evaluator<Derived>(derived()).coeff(row,col);
102  }
103 
106  {
107  return coeff(rowIndexByOuterInner(outer, inner),
108  colIndexByOuterInner(outer, inner));
109  }
110 
117  {
118  eigen_assert(row >= 0 && row < rows()
119  && col >= 0 && col < cols());
120  return coeff(row, col);
121  }
122 
139  EIGEN_STRONG_INLINE CoeffReturnType
140  coeff(Index index) const
141  {
143  THIS_COEFFICIENT_ACCESSOR_TAKING_ONE_ACCESS_IS_ONLY_FOR_EXPRESSIONS_ALLOWING_LINEAR_ACCESS)
144  eigen_internal_assert(index >= 0 && index < size());
145  return internal::evaluator<Derived>(derived()).coeff(index);
146  }
147 
148 
158  EIGEN_STRONG_INLINE CoeffReturnType
159  operator[](Index index) const
160  {
161  EIGEN_STATIC_ASSERT(Derived::IsVectorAtCompileTime,
162  THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD)
163  eigen_assert(index >= 0 && index < size());
164  return coeff(index);
165  }
166 
178  EIGEN_STRONG_INLINE CoeffReturnType
179  operator()(Index index) const
180  {
181  eigen_assert(index >= 0 && index < size());
182  return coeff(index);
183  }
184 
188  EIGEN_STRONG_INLINE CoeffReturnType
189  x() const { return (*this)[0]; }
190 
194  EIGEN_STRONG_INLINE CoeffReturnType
195  y() const
196  {
197  EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=2, OUT_OF_RANGE_ACCESS);
198  return (*this)[1];
199  }
200 
204  EIGEN_STRONG_INLINE CoeffReturnType
205  z() const
206  {
207  EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=3, OUT_OF_RANGE_ACCESS);
208  return (*this)[2];
209  }
210 
214  EIGEN_STRONG_INLINE CoeffReturnType
215  w() const
216  {
217  EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=4, OUT_OF_RANGE_ACCESS);
218  return (*this)[3];
219  }
220 
231  template<int LoadMode>
233  {
234  typedef typename internal::packet_traits<Scalar>::type DefaultPacketType;
235  eigen_internal_assert(row >= 0 && row < rows() && col >= 0 && col < cols());
236  return internal::evaluator<Derived>(derived()).template packet<LoadMode,DefaultPacketType>(row,col);
237  }
238 
239 
241  template<int LoadMode>
243  {
244  return packet<LoadMode>(rowIndexByOuterInner(outer, inner),
245  colIndexByOuterInner(outer, inner));
246  }
247 
258  template<int LoadMode>
260  {
262  THIS_COEFFICIENT_ACCESSOR_TAKING_ONE_ACCESS_IS_ONLY_FOR_EXPRESSIONS_ALLOWING_LINEAR_ACCESS)
263  typedef typename internal::packet_traits<Scalar>::type DefaultPacketType;
264  eigen_internal_assert(index >= 0 && index < size());
265  return internal::evaluator<Derived>(derived()).template packet<LoadMode,DefaultPacketType>(index);
266  }
267 
268  protected:
269  // explanation: DenseBase is doing "using ..." on the methods from DenseCoeffsBase.
270  // But some methods are only available in the DirectAccess case.
271  // So we add dummy methods here with these names, so that "using... " doesn't fail.
272  // It's not private so that the child class DenseBase can access them, and it's not public
273  // either since it's an implementation detail, so has to be protected.
274  void coeffRef();
276  void writePacket();
278  void copyCoeff();
280  void copyPacket();
282  void stride();
283  void innerStride();
284  void outerStride();
285  void rowStride();
286  void colStride();
287 };
288 
301 template<typename Derived>
302 class DenseCoeffsBase<Derived, WriteAccessors> : public DenseCoeffsBase<Derived, ReadOnlyAccessors>
303 {
304  public:
305 
307 
312 
313  using Base::coeff;
314  using Base::rows;
315  using Base::cols;
316  using Base::size;
317  using Base::derived;
318  using Base::rowIndexByOuterInner;
319  using Base::colIndexByOuterInner;
320  using Base::operator[];
321  using Base::operator();
322  using Base::x;
323  using Base::y;
324  using Base::z;
325  using Base::w;
326 
343  {
344  eigen_internal_assert(row >= 0 && row < rows()
345  && col >= 0 && col < cols());
346  return internal::evaluator<Derived>(derived()).coeffRef(row,col);
347  }
348 
350  EIGEN_STRONG_INLINE Scalar&
352  {
353  return coeffRef(rowIndexByOuterInner(outer, inner),
354  colIndexByOuterInner(outer, inner));
355  }
356 
363  EIGEN_STRONG_INLINE Scalar&
365  {
366  eigen_assert(row >= 0 && row < rows()
367  && col >= 0 && col < cols());
368  return coeffRef(row, col);
369  }
370 
371 
388  EIGEN_STRONG_INLINE Scalar&
390  {
392  THIS_COEFFICIENT_ACCESSOR_TAKING_ONE_ACCESS_IS_ONLY_FOR_EXPRESSIONS_ALLOWING_LINEAR_ACCESS)
393  eigen_internal_assert(index >= 0 && index < size());
394  return internal::evaluator<Derived>(derived()).coeffRef(index);
395  }
396 
405  EIGEN_STRONG_INLINE Scalar&
407  {
408  EIGEN_STATIC_ASSERT(Derived::IsVectorAtCompileTime,
409  THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD)
410  eigen_assert(index >= 0 && index < size());
411  return coeffRef(index);
412  }
413 
424  EIGEN_STRONG_INLINE Scalar&
426  {
427  eigen_assert(index >= 0 && index < size());
428  return coeffRef(index);
429  }
430 
434  EIGEN_STRONG_INLINE Scalar&
435  x() { return (*this)[0]; }
436 
440  EIGEN_STRONG_INLINE Scalar&
441  y()
442  {
443  EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=2, OUT_OF_RANGE_ACCESS);
444  return (*this)[1];
445  }
446 
450  EIGEN_STRONG_INLINE Scalar&
451  z()
452  {
453  EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=3, OUT_OF_RANGE_ACCESS);
454  return (*this)[2];
455  }
456 
460  EIGEN_STRONG_INLINE Scalar&
461  w()
462  {
463  EIGEN_STATIC_ASSERT(Derived::SizeAtCompileTime==-1 || Derived::SizeAtCompileTime>=4, OUT_OF_RANGE_ACCESS);
464  return (*this)[3];
465  }
466 };
467 
480 template<typename Derived>
481 class DenseCoeffsBase<Derived, DirectAccessors> : public DenseCoeffsBase<Derived, ReadOnlyAccessors>
482 {
483  public:
484 
488 
489  using Base::rows;
490  using Base::cols;
491  using Base::size;
492  using Base::derived;
493 
499  inline Index innerStride() const
500  {
501  return derived().innerStride();
502  }
503 
510  inline Index outerStride() const
511  {
512  return derived().outerStride();
513  }
514 
515  // FIXME shall we remove it ?
516  EIGEN_CONSTEXPR inline Index stride() const
517  {
518  return Derived::IsVectorAtCompileTime ? innerStride() : outerStride();
519  }
520 
526  inline Index rowStride() const
527  {
528  return Derived::IsRowMajor ? outerStride() : innerStride();
529  }
530 
536  inline Index colStride() const
537  {
538  return Derived::IsRowMajor ? innerStride() : outerStride();
539  }
540 };
541 
554 template<typename Derived>
556  : public DenseCoeffsBase<Derived, WriteAccessors>
557 {
558  public:
559 
563 
564  using Base::rows;
565  using Base::cols;
566  using Base::size;
567  using Base::derived;
568 
575  {
576  return derived().innerStride();
577  }
578 
586  {
587  return derived().outerStride();
588  }
589 
590  // FIXME shall we remove it ?
592  {
593  return Derived::IsVectorAtCompileTime ? innerStride() : outerStride();
594  }
595 
602  {
603  return Derived::IsRowMajor ? outerStride() : innerStride();
604  }
605 
612  {
613  return Derived::IsRowMajor ? innerStride() : outerStride();
614  }
615 };
616 
617 namespace internal {
618 
619 template<int Alignment, typename Derived, bool JustReturnZero>
621 {
622  static EIGEN_CONSTEXPR inline Index run(const Derived&) EIGEN_NOEXCEPT
623  { return 0; }
624 };
625 
626 template<int Alignment, typename Derived>
627 struct first_aligned_impl<Alignment, Derived, false>
628 {
629  static inline Index run(const Derived& m)
630  {
631  return internal::first_aligned<Alignment>(m.data(), m.size());
632  }
633 };
634 
642 template<int Alignment, typename Derived>
643 static inline Index first_aligned(const DenseBase<Derived>& m)
644 {
645  enum { ReturnZero = (int(evaluator<Derived>::Alignment) >= Alignment) || !(Derived::Flags & DirectAccessBit) };
647 }
648 
649 template<typename Derived>
651 {
652  typedef typename Derived::Scalar Scalar;
653  typedef typename packet_traits<Scalar>::type DefaultPacketType;
655 }
656 
657 template<typename Derived, bool HasDirectAccess = has_direct_access<Derived>::ret>
659 {
661 };
662 
663 template<typename Derived>
664 struct inner_stride_at_compile_time<Derived, false>
665 {
666  enum { ret = 0 };
667 };
668 
669 template<typename Derived, bool HasDirectAccess = has_direct_access<Derived>::ret>
671 {
673 };
674 
675 template<typename Derived>
676 struct outer_stride_at_compile_time<Derived, false>
677 {
678  enum { ret = 0 };
679 };
680 
681 } // end namespace internal
682 
683 } // end namespace Eigen
684 
685 #endif // EIGEN_DENSECOEFFSBASE_H
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE ColXpr col(Index i)
This is the const version of col().
Definition: BlockMethods.h:1097
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE RowXpr row(Index i)
This is the const version of row(). *‍/.
Definition: BlockMethods.h:1118
#define eigen_internal_assert(x)
Definition: Macros.h:1043
#define EIGEN_NOEXCEPT
Definition: Macros.h:1418
#define EIGEN_CONSTEXPR
Definition: Macros.h:787
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:976
#define eigen_assert(x)
Definition: Macros.h:1037
#define EIGEN_STRONG_INLINE
Definition: Macros.h:917
#define EIGEN_STATIC_ASSERT(CONDITION, MSG)
Definition: StaticAssert.h:127
Base class for all dense matrices, vectors, and arrays.
Definition: DenseBase.h:47
EIGEN_CONSTEXPR Index stride() const
Definition: DenseCoeffsBase.h:516
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index colStride() const
Definition: DenseCoeffsBase.h:536
DenseCoeffsBase< Derived, ReadOnlyAccessors > Base
Definition: DenseCoeffsBase.h:485
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index outerStride() const
Definition: DenseCoeffsBase.h:510
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rowStride() const
Definition: DenseCoeffsBase.h:526
NumTraits< Scalar >::Real RealScalar
Definition: DenseCoeffsBase.h:487
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index innerStride() const
Definition: DenseCoeffsBase.h:499
internal::traits< Derived >::Scalar Scalar
Definition: DenseCoeffsBase.h:486
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index innerStride() const EIGEN_NOEXCEPT
Definition: DenseCoeffsBase.h:574
NumTraits< Scalar >::Real RealScalar
Definition: DenseCoeffsBase.h:562
DenseCoeffsBase< Derived, WriteAccessors > Base
Definition: DenseCoeffsBase.h:560
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index rowStride() const EIGEN_NOEXCEPT
Definition: DenseCoeffsBase.h:601
internal::traits< Derived >::Scalar Scalar
Definition: DenseCoeffsBase.h:561
EIGEN_CONSTEXPR Index stride() const EIGEN_NOEXCEPT
Definition: DenseCoeffsBase.h:591
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index outerStride() const EIGEN_NOEXCEPT
Definition: DenseCoeffsBase.h:585
EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR Index colStride() const EIGEN_NOEXCEPT
Definition: DenseCoeffsBase.h:611
Base class providing read-only coefficient access to matrices and arrays.
Definition: DenseCoeffsBase.h:36
internal::packet_traits< Scalar >::type PacketScalar
Definition: DenseCoeffsBase.h:40
internal::traits< Derived >::StorageKind StorageKind
Definition: DenseCoeffsBase.h:38
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType operator()(Index row, Index col) const
Definition: DenseCoeffsBase.h:116
internal::conditional< bool(internal::traits< Derived >::Flags &LvalueBit), const Scalar &, typename internal::conditional< internal::is_arithmetic< Scalar >::value, Scalar, const Scalar >::type >::type CoeffReturnType
Definition: DenseCoeffsBase.h:52
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType x() const
Definition: DenseCoeffsBase.h:189
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType w() const
Definition: DenseCoeffsBase.h:215
EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
Definition: DenseCoeffsBase.h:259
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType operator()(Index index) const
Definition: DenseCoeffsBase.h:179
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index colIndexByOuterInner(Index outer, Index inner) const
Definition: DenseCoeffsBase.h:74
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeffByOuterInner(Index outer, Index inner) const
Definition: DenseCoeffsBase.h:105
internal::add_const_on_value_type_if_arithmetic< typename internal::packet_traits< Scalar >::type >::type PacketReturnType
Definition: DenseCoeffsBase.h:56
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType z() const
Definition: DenseCoeffsBase.h:205
EIGEN_STRONG_INLINE PacketReturnType packetByOuterInner(Index outer, Index inner) const
Definition: DenseCoeffsBase.h:242
EIGEN_STRONG_INLINE PacketReturnType packet(Index row, Index col) const
Definition: DenseCoeffsBase.h:232
internal::traits< Derived >::Scalar Scalar
Definition: DenseCoeffsBase.h:39
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Index rowIndexByOuterInner(Index outer, Index inner) const
Definition: DenseCoeffsBase.h:65
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType operator[](Index index) const
Definition: DenseCoeffsBase.h:159
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const
Definition: DenseCoeffsBase.h:97
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
Definition: DenseCoeffsBase.h:140
EigenBase< Derived > Base
Definition: DenseCoeffsBase.h:58
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType y() const
Definition: DenseCoeffsBase.h:195
Base class providing read/write coefficient access to matrices and arrays.
Definition: DenseCoeffsBase.h:303
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar & coeffRefByOuterInner(Index outer, Index inner)
Definition: DenseCoeffsBase.h:351
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar & w()
Definition: DenseCoeffsBase.h:461
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar & x()
Definition: DenseCoeffsBase.h:435
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar & coeffRef(Index index)
Definition: DenseCoeffsBase.h:389
NumTraits< Scalar >::Real RealScalar
Definition: DenseCoeffsBase.h:311
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar & operator[](Index index)
Definition: DenseCoeffsBase.h:406
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar & operator()(Index index)
Definition: DenseCoeffsBase.h:425
DenseCoeffsBase< Derived, ReadOnlyAccessors > Base
Definition: DenseCoeffsBase.h:306
internal::packet_traits< Scalar >::type PacketScalar
Definition: DenseCoeffsBase.h:310
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar & operator()(Index row, Index col)
Definition: DenseCoeffsBase.h:364
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar & y()
Definition: DenseCoeffsBase.h:441
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar & z()
Definition: DenseCoeffsBase.h:451
internal::traits< Derived >::Scalar Scalar
Definition: DenseCoeffsBase.h:309
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar & coeffRef(Index row, Index col)
Definition: DenseCoeffsBase.h:342
internal::traits< Derived >::StorageKind StorageKind
Definition: DenseCoeffsBase.h:308
Definition: ForwardDeclarations.h:50
@ DirectAccessors
Definition: Constants.h:380
@ ReadOnlyAccessors
Definition: Constants.h:376
@ WriteAccessors
Definition: Constants.h:378
@ DirectWriteAccessors
Definition: Constants.h:382
const unsigned int LinearAccessBit
Definition: Constants.h:130
const unsigned int DirectAccessBit
Definition: Constants.h:155
const unsigned int LvalueBit
Definition: Constants.h:144
const unsigned int RowMajorBit
Definition: Constants.h:66
const Scalar & y
Definition: MathFunctions.h:821
static Index first_default_aligned(const DenseBase< Derived > &m)
Definition: DenseCoeffsBase.h:650
EIGEN_CONSTEXPR Index size(const T &x)
Definition: Meta.h:479
static Index first_aligned(const DenseBase< Derived > &m)
Definition: DenseCoeffsBase.h:643
Namespace containing all symbols from the Eigen library.
Definition: LDLT.h:16
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74
type
The type the bitset is encoded with.
Definition: bitset.hpp:44
Flags
Special flags for archives.
Definition: cereal.hpp:185
Definition: document.h:416
Definition: EigenBase.h:30
Eigen::Index Index
The interface type of indices.
Definition: EigenBase.h:39
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:233
conditional< is_arithmetic< T >::value, T, typename add_const_on_value_type< T >::type >::type type
Definition: DenseCoeffsBase.h:18
const T type
Definition: Meta.h:214
Definition: Meta.h:109
Definition: CoreEvaluators.h:91
static Index run(const Derived &m)
Definition: DenseCoeffsBase.h:629
Definition: DenseCoeffsBase.h:621
static EIGEN_CONSTEXPR Index run(const Derived &) EIGEN_NOEXCEPT
Definition: DenseCoeffsBase.h:622
Definition: DenseCoeffsBase.h:659
@ ret
Definition: DenseCoeffsBase.h:660
Definition: DenseCoeffsBase.h:671
@ ret
Definition: DenseCoeffsBase.h:672
T type
Definition: GenericPacketMath.h:108
Definition: ForwardDeclarations.h:17
Definition: Meta.h:96
Definition: GenericPacketMath.h:133
#define const
Definition: zconf.h:233