Eigne Matrix Class Library
Dependents: Eigen_test Odometry_test AttitudeEstimation_usingTicker MPU9250_Quaternion_Binary_Serial ... more
Eigen Matrix Class Library for mbed.
Finally, you can use Eigen on your mbed!!!
src/Core/ForceAlignedAccess.h@0:13a5d365ba16, 2016-10-13 (annotated)
- Committer:
- ykuroda
- Date:
- Thu Oct 13 04:07:23 2016 +0000
- Revision:
- 0:13a5d365ba16
First commint, Eigne Matrix Class Library
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ykuroda | 0:13a5d365ba16 | 1 | // This file is part of Eigen, a lightweight C++ template library |
ykuroda | 0:13a5d365ba16 | 2 | // for linear algebra. |
ykuroda | 0:13a5d365ba16 | 3 | // |
ykuroda | 0:13a5d365ba16 | 4 | // Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud@inria.fr> |
ykuroda | 0:13a5d365ba16 | 5 | // |
ykuroda | 0:13a5d365ba16 | 6 | // This Source Code Form is subject to the terms of the Mozilla |
ykuroda | 0:13a5d365ba16 | 7 | // Public License v. 2.0. If a copy of the MPL was not distributed |
ykuroda | 0:13a5d365ba16 | 8 | // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. |
ykuroda | 0:13a5d365ba16 | 9 | |
ykuroda | 0:13a5d365ba16 | 10 | #ifndef EIGEN_FORCEALIGNEDACCESS_H |
ykuroda | 0:13a5d365ba16 | 11 | #define EIGEN_FORCEALIGNEDACCESS_H |
ykuroda | 0:13a5d365ba16 | 12 | |
ykuroda | 0:13a5d365ba16 | 13 | namespace Eigen { |
ykuroda | 0:13a5d365ba16 | 14 | |
ykuroda | 0:13a5d365ba16 | 15 | /** \class ForceAlignedAccess |
ykuroda | 0:13a5d365ba16 | 16 | * \ingroup Core_Module |
ykuroda | 0:13a5d365ba16 | 17 | * |
ykuroda | 0:13a5d365ba16 | 18 | * \brief Enforce aligned packet loads and stores regardless of what is requested |
ykuroda | 0:13a5d365ba16 | 19 | * |
ykuroda | 0:13a5d365ba16 | 20 | * \param ExpressionType the type of the object of which we are forcing aligned packet access |
ykuroda | 0:13a5d365ba16 | 21 | * |
ykuroda | 0:13a5d365ba16 | 22 | * This class is the return type of MatrixBase::forceAlignedAccess() |
ykuroda | 0:13a5d365ba16 | 23 | * and most of the time this is the only way it is used. |
ykuroda | 0:13a5d365ba16 | 24 | * |
ykuroda | 0:13a5d365ba16 | 25 | * \sa MatrixBase::forceAlignedAccess() |
ykuroda | 0:13a5d365ba16 | 26 | */ |
ykuroda | 0:13a5d365ba16 | 27 | |
ykuroda | 0:13a5d365ba16 | 28 | namespace internal { |
ykuroda | 0:13a5d365ba16 | 29 | template<typename ExpressionType> |
ykuroda | 0:13a5d365ba16 | 30 | struct traits<ForceAlignedAccess<ExpressionType> > : public traits<ExpressionType> |
ykuroda | 0:13a5d365ba16 | 31 | {}; |
ykuroda | 0:13a5d365ba16 | 32 | } |
ykuroda | 0:13a5d365ba16 | 33 | |
ykuroda | 0:13a5d365ba16 | 34 | template<typename ExpressionType> class ForceAlignedAccess |
ykuroda | 0:13a5d365ba16 | 35 | : public internal::dense_xpr_base< ForceAlignedAccess<ExpressionType> >::type |
ykuroda | 0:13a5d365ba16 | 36 | { |
ykuroda | 0:13a5d365ba16 | 37 | public: |
ykuroda | 0:13a5d365ba16 | 38 | |
ykuroda | 0:13a5d365ba16 | 39 | typedef typename internal::dense_xpr_base<ForceAlignedAccess>::type Base; |
ykuroda | 0:13a5d365ba16 | 40 | EIGEN_DENSE_PUBLIC_INTERFACE(ForceAlignedAccess) |
ykuroda | 0:13a5d365ba16 | 41 | |
ykuroda | 0:13a5d365ba16 | 42 | inline ForceAlignedAccess(const ExpressionType& matrix) : m_expression(matrix) {} |
ykuroda | 0:13a5d365ba16 | 43 | |
ykuroda | 0:13a5d365ba16 | 44 | inline Index rows() const { return m_expression.rows(); } |
ykuroda | 0:13a5d365ba16 | 45 | inline Index cols() const { return m_expression.cols(); } |
ykuroda | 0:13a5d365ba16 | 46 | inline Index outerStride() const { return m_expression.outerStride(); } |
ykuroda | 0:13a5d365ba16 | 47 | inline Index innerStride() const { return m_expression.innerStride(); } |
ykuroda | 0:13a5d365ba16 | 48 | |
ykuroda | 0:13a5d365ba16 | 49 | inline const CoeffReturnType coeff(Index row, Index col) const |
ykuroda | 0:13a5d365ba16 | 50 | { |
ykuroda | 0:13a5d365ba16 | 51 | return m_expression.coeff(row, col); |
ykuroda | 0:13a5d365ba16 | 52 | } |
ykuroda | 0:13a5d365ba16 | 53 | |
ykuroda | 0:13a5d365ba16 | 54 | inline Scalar& coeffRef(Index row, Index col) |
ykuroda | 0:13a5d365ba16 | 55 | { |
ykuroda | 0:13a5d365ba16 | 56 | return m_expression.const_cast_derived().coeffRef(row, col); |
ykuroda | 0:13a5d365ba16 | 57 | } |
ykuroda | 0:13a5d365ba16 | 58 | |
ykuroda | 0:13a5d365ba16 | 59 | inline const CoeffReturnType coeff(Index index) const |
ykuroda | 0:13a5d365ba16 | 60 | { |
ykuroda | 0:13a5d365ba16 | 61 | return m_expression.coeff(index); |
ykuroda | 0:13a5d365ba16 | 62 | } |
ykuroda | 0:13a5d365ba16 | 63 | |
ykuroda | 0:13a5d365ba16 | 64 | inline Scalar& coeffRef(Index index) |
ykuroda | 0:13a5d365ba16 | 65 | { |
ykuroda | 0:13a5d365ba16 | 66 | return m_expression.const_cast_derived().coeffRef(index); |
ykuroda | 0:13a5d365ba16 | 67 | } |
ykuroda | 0:13a5d365ba16 | 68 | |
ykuroda | 0:13a5d365ba16 | 69 | template<int LoadMode> |
ykuroda | 0:13a5d365ba16 | 70 | inline const PacketScalar packet(Index row, Index col) const |
ykuroda | 0:13a5d365ba16 | 71 | { |
ykuroda | 0:13a5d365ba16 | 72 | return m_expression.template packet<Aligned>(row, col); |
ykuroda | 0:13a5d365ba16 | 73 | } |
ykuroda | 0:13a5d365ba16 | 74 | |
ykuroda | 0:13a5d365ba16 | 75 | template<int LoadMode> |
ykuroda | 0:13a5d365ba16 | 76 | inline void writePacket(Index row, Index col, const PacketScalar& x) |
ykuroda | 0:13a5d365ba16 | 77 | { |
ykuroda | 0:13a5d365ba16 | 78 | m_expression.const_cast_derived().template writePacket<Aligned>(row, col, x); |
ykuroda | 0:13a5d365ba16 | 79 | } |
ykuroda | 0:13a5d365ba16 | 80 | |
ykuroda | 0:13a5d365ba16 | 81 | template<int LoadMode> |
ykuroda | 0:13a5d365ba16 | 82 | inline const PacketScalar packet(Index index) const |
ykuroda | 0:13a5d365ba16 | 83 | { |
ykuroda | 0:13a5d365ba16 | 84 | return m_expression.template packet<Aligned>(index); |
ykuroda | 0:13a5d365ba16 | 85 | } |
ykuroda | 0:13a5d365ba16 | 86 | |
ykuroda | 0:13a5d365ba16 | 87 | template<int LoadMode> |
ykuroda | 0:13a5d365ba16 | 88 | inline void writePacket(Index index, const PacketScalar& x) |
ykuroda | 0:13a5d365ba16 | 89 | { |
ykuroda | 0:13a5d365ba16 | 90 | m_expression.const_cast_derived().template writePacket<Aligned>(index, x); |
ykuroda | 0:13a5d365ba16 | 91 | } |
ykuroda | 0:13a5d365ba16 | 92 | |
ykuroda | 0:13a5d365ba16 | 93 | operator const ExpressionType&() const { return m_expression; } |
ykuroda | 0:13a5d365ba16 | 94 | |
ykuroda | 0:13a5d365ba16 | 95 | protected: |
ykuroda | 0:13a5d365ba16 | 96 | const ExpressionType& m_expression; |
ykuroda | 0:13a5d365ba16 | 97 | |
ykuroda | 0:13a5d365ba16 | 98 | private: |
ykuroda | 0:13a5d365ba16 | 99 | ForceAlignedAccess& operator=(const ForceAlignedAccess&); |
ykuroda | 0:13a5d365ba16 | 100 | }; |
ykuroda | 0:13a5d365ba16 | 101 | |
ykuroda | 0:13a5d365ba16 | 102 | /** \returns an expression of *this with forced aligned access |
ykuroda | 0:13a5d365ba16 | 103 | * \sa forceAlignedAccessIf(),class ForceAlignedAccess |
ykuroda | 0:13a5d365ba16 | 104 | */ |
ykuroda | 0:13a5d365ba16 | 105 | template<typename Derived> |
ykuroda | 0:13a5d365ba16 | 106 | inline const ForceAlignedAccess<Derived> |
ykuroda | 0:13a5d365ba16 | 107 | MatrixBase<Derived>::forceAlignedAccess() const |
ykuroda | 0:13a5d365ba16 | 108 | { |
ykuroda | 0:13a5d365ba16 | 109 | return ForceAlignedAccess<Derived>(derived()); |
ykuroda | 0:13a5d365ba16 | 110 | } |
ykuroda | 0:13a5d365ba16 | 111 | |
ykuroda | 0:13a5d365ba16 | 112 | /** \returns an expression of *this with forced aligned access |
ykuroda | 0:13a5d365ba16 | 113 | * \sa forceAlignedAccessIf(), class ForceAlignedAccess |
ykuroda | 0:13a5d365ba16 | 114 | */ |
ykuroda | 0:13a5d365ba16 | 115 | template<typename Derived> |
ykuroda | 0:13a5d365ba16 | 116 | inline ForceAlignedAccess<Derived> |
ykuroda | 0:13a5d365ba16 | 117 | MatrixBase<Derived>::forceAlignedAccess() |
ykuroda | 0:13a5d365ba16 | 118 | { |
ykuroda | 0:13a5d365ba16 | 119 | return ForceAlignedAccess<Derived>(derived()); |
ykuroda | 0:13a5d365ba16 | 120 | } |
ykuroda | 0:13a5d365ba16 | 121 | |
ykuroda | 0:13a5d365ba16 | 122 | /** \returns an expression of *this with forced aligned access if \a Enable is true. |
ykuroda | 0:13a5d365ba16 | 123 | * \sa forceAlignedAccess(), class ForceAlignedAccess |
ykuroda | 0:13a5d365ba16 | 124 | */ |
ykuroda | 0:13a5d365ba16 | 125 | template<typename Derived> |
ykuroda | 0:13a5d365ba16 | 126 | template<bool Enable> |
ykuroda | 0:13a5d365ba16 | 127 | inline typename internal::add_const_on_value_type<typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type>::type |
ykuroda | 0:13a5d365ba16 | 128 | MatrixBase<Derived>::forceAlignedAccessIf() const |
ykuroda | 0:13a5d365ba16 | 129 | { |
ykuroda | 0:13a5d365ba16 | 130 | return derived(); |
ykuroda | 0:13a5d365ba16 | 131 | } |
ykuroda | 0:13a5d365ba16 | 132 | |
ykuroda | 0:13a5d365ba16 | 133 | /** \returns an expression of *this with forced aligned access if \a Enable is true. |
ykuroda | 0:13a5d365ba16 | 134 | * \sa forceAlignedAccess(), class ForceAlignedAccess |
ykuroda | 0:13a5d365ba16 | 135 | */ |
ykuroda | 0:13a5d365ba16 | 136 | template<typename Derived> |
ykuroda | 0:13a5d365ba16 | 137 | template<bool Enable> |
ykuroda | 0:13a5d365ba16 | 138 | inline typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type |
ykuroda | 0:13a5d365ba16 | 139 | MatrixBase<Derived>::forceAlignedAccessIf() |
ykuroda | 0:13a5d365ba16 | 140 | { |
ykuroda | 0:13a5d365ba16 | 141 | return derived(); |
ykuroda | 0:13a5d365ba16 | 142 | } |
ykuroda | 0:13a5d365ba16 | 143 | |
ykuroda | 0:13a5d365ba16 | 144 | } // end namespace Eigen |
ykuroda | 0:13a5d365ba16 | 145 | |
ykuroda | 0:13a5d365ba16 | 146 | #endif // EIGEN_FORCEALIGNEDACCESS_H |