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!!!

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?

UserRevisionLine numberNew 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