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/Swap.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) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com> |
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_SWAP_H |
ykuroda | 0:13a5d365ba16 | 11 | #define EIGEN_SWAP_H |
ykuroda | 0:13a5d365ba16 | 12 | |
ykuroda | 0:13a5d365ba16 | 13 | namespace Eigen { |
ykuroda | 0:13a5d365ba16 | 14 | |
ykuroda | 0:13a5d365ba16 | 15 | /** \class SwapWrapper |
ykuroda | 0:13a5d365ba16 | 16 | * \ingroup Core_Module |
ykuroda | 0:13a5d365ba16 | 17 | * |
ykuroda | 0:13a5d365ba16 | 18 | * \internal |
ykuroda | 0:13a5d365ba16 | 19 | * |
ykuroda | 0:13a5d365ba16 | 20 | * \brief Internal helper class for swapping two expressions |
ykuroda | 0:13a5d365ba16 | 21 | */ |
ykuroda | 0:13a5d365ba16 | 22 | namespace internal { |
ykuroda | 0:13a5d365ba16 | 23 | template<typename ExpressionType> |
ykuroda | 0:13a5d365ba16 | 24 | struct traits<SwapWrapper<ExpressionType> > : traits<ExpressionType> {}; |
ykuroda | 0:13a5d365ba16 | 25 | } |
ykuroda | 0:13a5d365ba16 | 26 | |
ykuroda | 0:13a5d365ba16 | 27 | template<typename ExpressionType> class SwapWrapper |
ykuroda | 0:13a5d365ba16 | 28 | : public internal::dense_xpr_base<SwapWrapper<ExpressionType> >::type |
ykuroda | 0:13a5d365ba16 | 29 | { |
ykuroda | 0:13a5d365ba16 | 30 | public: |
ykuroda | 0:13a5d365ba16 | 31 | |
ykuroda | 0:13a5d365ba16 | 32 | typedef typename internal::dense_xpr_base<SwapWrapper>::type Base; |
ykuroda | 0:13a5d365ba16 | 33 | EIGEN_DENSE_PUBLIC_INTERFACE(SwapWrapper) |
ykuroda | 0:13a5d365ba16 | 34 | typedef typename internal::packet_traits<Scalar>::type Packet; |
ykuroda | 0:13a5d365ba16 | 35 | |
ykuroda | 0:13a5d365ba16 | 36 | inline SwapWrapper(ExpressionType& xpr) : m_expression(xpr) {} |
ykuroda | 0:13a5d365ba16 | 37 | |
ykuroda | 0:13a5d365ba16 | 38 | inline Index rows() const { return m_expression.rows(); } |
ykuroda | 0:13a5d365ba16 | 39 | inline Index cols() const { return m_expression.cols(); } |
ykuroda | 0:13a5d365ba16 | 40 | inline Index outerStride() const { return m_expression.outerStride(); } |
ykuroda | 0:13a5d365ba16 | 41 | inline Index innerStride() const { return m_expression.innerStride(); } |
ykuroda | 0:13a5d365ba16 | 42 | |
ykuroda | 0:13a5d365ba16 | 43 | typedef typename internal::conditional< |
ykuroda | 0:13a5d365ba16 | 44 | internal::is_lvalue<ExpressionType>::value, |
ykuroda | 0:13a5d365ba16 | 45 | Scalar, |
ykuroda | 0:13a5d365ba16 | 46 | const Scalar |
ykuroda | 0:13a5d365ba16 | 47 | >::type ScalarWithConstIfNotLvalue; |
ykuroda | 0:13a5d365ba16 | 48 | |
ykuroda | 0:13a5d365ba16 | 49 | inline ScalarWithConstIfNotLvalue* data() { return m_expression.data(); } |
ykuroda | 0:13a5d365ba16 | 50 | inline const Scalar* data() const { return m_expression.data(); } |
ykuroda | 0:13a5d365ba16 | 51 | |
ykuroda | 0:13a5d365ba16 | 52 | inline Scalar& coeffRef(Index rowId, Index colId) |
ykuroda | 0:13a5d365ba16 | 53 | { |
ykuroda | 0:13a5d365ba16 | 54 | return m_expression.const_cast_derived().coeffRef(rowId, colId); |
ykuroda | 0:13a5d365ba16 | 55 | } |
ykuroda | 0:13a5d365ba16 | 56 | |
ykuroda | 0:13a5d365ba16 | 57 | inline Scalar& coeffRef(Index index) |
ykuroda | 0:13a5d365ba16 | 58 | { |
ykuroda | 0:13a5d365ba16 | 59 | return m_expression.const_cast_derived().coeffRef(index); |
ykuroda | 0:13a5d365ba16 | 60 | } |
ykuroda | 0:13a5d365ba16 | 61 | |
ykuroda | 0:13a5d365ba16 | 62 | inline Scalar& coeffRef(Index rowId, Index colId) const |
ykuroda | 0:13a5d365ba16 | 63 | { |
ykuroda | 0:13a5d365ba16 | 64 | return m_expression.coeffRef(rowId, colId); |
ykuroda | 0:13a5d365ba16 | 65 | } |
ykuroda | 0:13a5d365ba16 | 66 | |
ykuroda | 0:13a5d365ba16 | 67 | inline Scalar& coeffRef(Index index) const |
ykuroda | 0:13a5d365ba16 | 68 | { |
ykuroda | 0:13a5d365ba16 | 69 | return m_expression.coeffRef(index); |
ykuroda | 0:13a5d365ba16 | 70 | } |
ykuroda | 0:13a5d365ba16 | 71 | |
ykuroda | 0:13a5d365ba16 | 72 | template<typename OtherDerived> |
ykuroda | 0:13a5d365ba16 | 73 | void copyCoeff(Index rowId, Index colId, const DenseBase<OtherDerived>& other) |
ykuroda | 0:13a5d365ba16 | 74 | { |
ykuroda | 0:13a5d365ba16 | 75 | OtherDerived& _other = other.const_cast_derived(); |
ykuroda | 0:13a5d365ba16 | 76 | eigen_internal_assert(rowId >= 0 && rowId < rows() |
ykuroda | 0:13a5d365ba16 | 77 | && colId >= 0 && colId < cols()); |
ykuroda | 0:13a5d365ba16 | 78 | Scalar tmp = m_expression.coeff(rowId, colId); |
ykuroda | 0:13a5d365ba16 | 79 | m_expression.coeffRef(rowId, colId) = _other.coeff(rowId, colId); |
ykuroda | 0:13a5d365ba16 | 80 | _other.coeffRef(rowId, colId) = tmp; |
ykuroda | 0:13a5d365ba16 | 81 | } |
ykuroda | 0:13a5d365ba16 | 82 | |
ykuroda | 0:13a5d365ba16 | 83 | template<typename OtherDerived> |
ykuroda | 0:13a5d365ba16 | 84 | void copyCoeff(Index index, const DenseBase<OtherDerived>& other) |
ykuroda | 0:13a5d365ba16 | 85 | { |
ykuroda | 0:13a5d365ba16 | 86 | OtherDerived& _other = other.const_cast_derived(); |
ykuroda | 0:13a5d365ba16 | 87 | eigen_internal_assert(index >= 0 && index < m_expression.size()); |
ykuroda | 0:13a5d365ba16 | 88 | Scalar tmp = m_expression.coeff(index); |
ykuroda | 0:13a5d365ba16 | 89 | m_expression.coeffRef(index) = _other.coeff(index); |
ykuroda | 0:13a5d365ba16 | 90 | _other.coeffRef(index) = tmp; |
ykuroda | 0:13a5d365ba16 | 91 | } |
ykuroda | 0:13a5d365ba16 | 92 | |
ykuroda | 0:13a5d365ba16 | 93 | template<typename OtherDerived, int StoreMode, int LoadMode> |
ykuroda | 0:13a5d365ba16 | 94 | void copyPacket(Index rowId, Index colId, const DenseBase<OtherDerived>& other) |
ykuroda | 0:13a5d365ba16 | 95 | { |
ykuroda | 0:13a5d365ba16 | 96 | OtherDerived& _other = other.const_cast_derived(); |
ykuroda | 0:13a5d365ba16 | 97 | eigen_internal_assert(rowId >= 0 && rowId < rows() |
ykuroda | 0:13a5d365ba16 | 98 | && colId >= 0 && colId < cols()); |
ykuroda | 0:13a5d365ba16 | 99 | Packet tmp = m_expression.template packet<StoreMode>(rowId, colId); |
ykuroda | 0:13a5d365ba16 | 100 | m_expression.template writePacket<StoreMode>(rowId, colId, |
ykuroda | 0:13a5d365ba16 | 101 | _other.template packet<LoadMode>(rowId, colId) |
ykuroda | 0:13a5d365ba16 | 102 | ); |
ykuroda | 0:13a5d365ba16 | 103 | _other.template writePacket<LoadMode>(rowId, colId, tmp); |
ykuroda | 0:13a5d365ba16 | 104 | } |
ykuroda | 0:13a5d365ba16 | 105 | |
ykuroda | 0:13a5d365ba16 | 106 | template<typename OtherDerived, int StoreMode, int LoadMode> |
ykuroda | 0:13a5d365ba16 | 107 | void copyPacket(Index index, const DenseBase<OtherDerived>& other) |
ykuroda | 0:13a5d365ba16 | 108 | { |
ykuroda | 0:13a5d365ba16 | 109 | OtherDerived& _other = other.const_cast_derived(); |
ykuroda | 0:13a5d365ba16 | 110 | eigen_internal_assert(index >= 0 && index < m_expression.size()); |
ykuroda | 0:13a5d365ba16 | 111 | Packet tmp = m_expression.template packet<StoreMode>(index); |
ykuroda | 0:13a5d365ba16 | 112 | m_expression.template writePacket<StoreMode>(index, |
ykuroda | 0:13a5d365ba16 | 113 | _other.template packet<LoadMode>(index) |
ykuroda | 0:13a5d365ba16 | 114 | ); |
ykuroda | 0:13a5d365ba16 | 115 | _other.template writePacket<LoadMode>(index, tmp); |
ykuroda | 0:13a5d365ba16 | 116 | } |
ykuroda | 0:13a5d365ba16 | 117 | |
ykuroda | 0:13a5d365ba16 | 118 | ExpressionType& expression() const { return m_expression; } |
ykuroda | 0:13a5d365ba16 | 119 | |
ykuroda | 0:13a5d365ba16 | 120 | protected: |
ykuroda | 0:13a5d365ba16 | 121 | ExpressionType& m_expression; |
ykuroda | 0:13a5d365ba16 | 122 | }; |
ykuroda | 0:13a5d365ba16 | 123 | |
ykuroda | 0:13a5d365ba16 | 124 | } // end namespace Eigen |
ykuroda | 0:13a5d365ba16 | 125 | |
ykuroda | 0:13a5d365ba16 | 126 | #endif // EIGEN_SWAP_H |