Eigen libary for mbed

Committer:
jsoh91
Date:
Tue Sep 24 00:18:23 2019 +0000
Revision:
1:3b8049da21b8
Parent:
0:13a5d365ba16
ignore and revise some of error parts

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_CWISE_UNARY_VIEW_H
ykuroda 0:13a5d365ba16 11 #define EIGEN_CWISE_UNARY_VIEW_H
ykuroda 0:13a5d365ba16 12
ykuroda 0:13a5d365ba16 13 namespace Eigen {
ykuroda 0:13a5d365ba16 14
ykuroda 0:13a5d365ba16 15 /** \class CwiseUnaryView
ykuroda 0:13a5d365ba16 16 * \ingroup Core_Module
ykuroda 0:13a5d365ba16 17 *
ykuroda 0:13a5d365ba16 18 * \brief Generic lvalue expression of a coefficient-wise unary operator of a matrix or a vector
ykuroda 0:13a5d365ba16 19 *
ykuroda 0:13a5d365ba16 20 * \param ViewOp template functor implementing the view
ykuroda 0:13a5d365ba16 21 * \param MatrixType the type of the matrix we are applying the unary operator
ykuroda 0:13a5d365ba16 22 *
ykuroda 0:13a5d365ba16 23 * This class represents a lvalue expression of a generic unary view operator of a matrix or a vector.
ykuroda 0:13a5d365ba16 24 * It is the return type of real() and imag(), and most of the time this is the only way it is used.
ykuroda 0:13a5d365ba16 25 *
ykuroda 0:13a5d365ba16 26 * \sa MatrixBase::unaryViewExpr(const CustomUnaryOp &) const, class CwiseUnaryOp
ykuroda 0:13a5d365ba16 27 */
ykuroda 0:13a5d365ba16 28
ykuroda 0:13a5d365ba16 29 namespace internal {
ykuroda 0:13a5d365ba16 30 template<typename ViewOp, typename MatrixType>
ykuroda 0:13a5d365ba16 31 struct traits<CwiseUnaryView<ViewOp, MatrixType> >
ykuroda 0:13a5d365ba16 32 : traits<MatrixType>
ykuroda 0:13a5d365ba16 33 {
ykuroda 0:13a5d365ba16 34 typedef typename result_of<
ykuroda 0:13a5d365ba16 35 ViewOp(typename traits<MatrixType>::Scalar)
ykuroda 0:13a5d365ba16 36 >::type Scalar;
ykuroda 0:13a5d365ba16 37 typedef typename MatrixType::Nested MatrixTypeNested;
ykuroda 0:13a5d365ba16 38 typedef typename remove_all<MatrixTypeNested>::type _MatrixTypeNested;
ykuroda 0:13a5d365ba16 39 enum {
ykuroda 0:13a5d365ba16 40 Flags = (traits<_MatrixTypeNested>::Flags & (HereditaryBits | LvalueBit | LinearAccessBit | DirectAccessBit)),
ykuroda 0:13a5d365ba16 41 CoeffReadCost = EIGEN_ADD_COST(traits<_MatrixTypeNested>::CoeffReadCost, functor_traits<ViewOp>::Cost),
ykuroda 0:13a5d365ba16 42 MatrixTypeInnerStride = inner_stride_at_compile_time<MatrixType>::ret,
ykuroda 0:13a5d365ba16 43 // need to cast the sizeof's from size_t to int explicitly, otherwise:
ykuroda 0:13a5d365ba16 44 // "error: no integral type can represent all of the enumerator values
ykuroda 0:13a5d365ba16 45 InnerStrideAtCompileTime = MatrixTypeInnerStride == Dynamic
ykuroda 0:13a5d365ba16 46 ? int(Dynamic)
ykuroda 0:13a5d365ba16 47 : int(MatrixTypeInnerStride) * int(sizeof(typename traits<MatrixType>::Scalar) / sizeof(Scalar)),
ykuroda 0:13a5d365ba16 48 OuterStrideAtCompileTime = outer_stride_at_compile_time<MatrixType>::ret == Dynamic
ykuroda 0:13a5d365ba16 49 ? int(Dynamic)
ykuroda 0:13a5d365ba16 50 : outer_stride_at_compile_time<MatrixType>::ret * int(sizeof(typename traits<MatrixType>::Scalar) / sizeof(Scalar))
ykuroda 0:13a5d365ba16 51 };
ykuroda 0:13a5d365ba16 52 };
ykuroda 0:13a5d365ba16 53 }
ykuroda 0:13a5d365ba16 54
ykuroda 0:13a5d365ba16 55 template<typename ViewOp, typename MatrixType, typename StorageKind>
ykuroda 0:13a5d365ba16 56 class CwiseUnaryViewImpl;
ykuroda 0:13a5d365ba16 57
ykuroda 0:13a5d365ba16 58 template<typename ViewOp, typename MatrixType>
ykuroda 0:13a5d365ba16 59 class CwiseUnaryView : public CwiseUnaryViewImpl<ViewOp, MatrixType, typename internal::traits<MatrixType>::StorageKind>
ykuroda 0:13a5d365ba16 60 {
ykuroda 0:13a5d365ba16 61 public:
ykuroda 0:13a5d365ba16 62
ykuroda 0:13a5d365ba16 63 typedef typename CwiseUnaryViewImpl<ViewOp, MatrixType,typename internal::traits<MatrixType>::StorageKind>::Base Base;
ykuroda 0:13a5d365ba16 64 EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseUnaryView)
ykuroda 0:13a5d365ba16 65
ykuroda 0:13a5d365ba16 66 inline CwiseUnaryView(const MatrixType& mat, const ViewOp& func = ViewOp())
ykuroda 0:13a5d365ba16 67 : m_matrix(mat), m_functor(func) {}
ykuroda 0:13a5d365ba16 68
ykuroda 0:13a5d365ba16 69 EIGEN_INHERIT_ASSIGNMENT_OPERATORS(CwiseUnaryView)
ykuroda 0:13a5d365ba16 70
ykuroda 0:13a5d365ba16 71 EIGEN_STRONG_INLINE Index rows() const { return m_matrix.rows(); }
ykuroda 0:13a5d365ba16 72 EIGEN_STRONG_INLINE Index cols() const { return m_matrix.cols(); }
ykuroda 0:13a5d365ba16 73
ykuroda 0:13a5d365ba16 74 /** \returns the functor representing unary operation */
ykuroda 0:13a5d365ba16 75 const ViewOp& functor() const { return m_functor; }
ykuroda 0:13a5d365ba16 76
ykuroda 0:13a5d365ba16 77 /** \returns the nested expression */
ykuroda 0:13a5d365ba16 78 const typename internal::remove_all<typename MatrixType::Nested>::type&
ykuroda 0:13a5d365ba16 79 nestedExpression() const { return m_matrix; }
ykuroda 0:13a5d365ba16 80
ykuroda 0:13a5d365ba16 81 /** \returns the nested expression */
ykuroda 0:13a5d365ba16 82 typename internal::remove_all<typename MatrixType::Nested>::type&
ykuroda 0:13a5d365ba16 83 nestedExpression() { return m_matrix.const_cast_derived(); }
ykuroda 0:13a5d365ba16 84
ykuroda 0:13a5d365ba16 85 protected:
ykuroda 0:13a5d365ba16 86 // FIXME changed from MatrixType::Nested because of a weird compilation error with sun CC
ykuroda 0:13a5d365ba16 87 typename internal::nested<MatrixType>::type m_matrix;
ykuroda 0:13a5d365ba16 88 ViewOp m_functor;
ykuroda 0:13a5d365ba16 89 };
ykuroda 0:13a5d365ba16 90
ykuroda 0:13a5d365ba16 91 template<typename ViewOp, typename MatrixType>
ykuroda 0:13a5d365ba16 92 class CwiseUnaryViewImpl<ViewOp,MatrixType,Dense>
ykuroda 0:13a5d365ba16 93 : public internal::dense_xpr_base< CwiseUnaryView<ViewOp, MatrixType> >::type
ykuroda 0:13a5d365ba16 94 {
ykuroda 0:13a5d365ba16 95 public:
ykuroda 0:13a5d365ba16 96
ykuroda 0:13a5d365ba16 97 typedef CwiseUnaryView<ViewOp, MatrixType> Derived;
ykuroda 0:13a5d365ba16 98 typedef typename internal::dense_xpr_base< CwiseUnaryView<ViewOp, MatrixType> >::type Base;
ykuroda 0:13a5d365ba16 99
ykuroda 0:13a5d365ba16 100 EIGEN_DENSE_PUBLIC_INTERFACE(Derived)
ykuroda 0:13a5d365ba16 101 EIGEN_INHERIT_ASSIGNMENT_OPERATORS(CwiseUnaryViewImpl)
ykuroda 0:13a5d365ba16 102
ykuroda 0:13a5d365ba16 103 inline Scalar* data() { return &coeffRef(0); }
ykuroda 0:13a5d365ba16 104 inline const Scalar* data() const { return &coeff(0); }
ykuroda 0:13a5d365ba16 105
ykuroda 0:13a5d365ba16 106 inline Index innerStride() const
ykuroda 0:13a5d365ba16 107 {
ykuroda 0:13a5d365ba16 108 return derived().nestedExpression().innerStride() * sizeof(typename internal::traits<MatrixType>::Scalar) / sizeof(Scalar);
ykuroda 0:13a5d365ba16 109 }
ykuroda 0:13a5d365ba16 110
ykuroda 0:13a5d365ba16 111 inline Index outerStride() const
ykuroda 0:13a5d365ba16 112 {
ykuroda 0:13a5d365ba16 113 return derived().nestedExpression().outerStride() * sizeof(typename internal::traits<MatrixType>::Scalar) / sizeof(Scalar);
ykuroda 0:13a5d365ba16 114 }
ykuroda 0:13a5d365ba16 115
ykuroda 0:13a5d365ba16 116 EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const
ykuroda 0:13a5d365ba16 117 {
ykuroda 0:13a5d365ba16 118 return derived().functor()(derived().nestedExpression().coeff(row, col));
ykuroda 0:13a5d365ba16 119 }
ykuroda 0:13a5d365ba16 120
ykuroda 0:13a5d365ba16 121 EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
ykuroda 0:13a5d365ba16 122 {
ykuroda 0:13a5d365ba16 123 return derived().functor()(derived().nestedExpression().coeff(index));
ykuroda 0:13a5d365ba16 124 }
ykuroda 0:13a5d365ba16 125
ykuroda 0:13a5d365ba16 126 EIGEN_STRONG_INLINE Scalar& coeffRef(Index row, Index col)
ykuroda 0:13a5d365ba16 127 {
ykuroda 0:13a5d365ba16 128 return derived().functor()(const_cast_derived().nestedExpression().coeffRef(row, col));
ykuroda 0:13a5d365ba16 129 }
ykuroda 0:13a5d365ba16 130
ykuroda 0:13a5d365ba16 131 EIGEN_STRONG_INLINE Scalar& coeffRef(Index index)
ykuroda 0:13a5d365ba16 132 {
ykuroda 0:13a5d365ba16 133 return derived().functor()(const_cast_derived().nestedExpression().coeffRef(index));
ykuroda 0:13a5d365ba16 134 }
ykuroda 0:13a5d365ba16 135 };
ykuroda 0:13a5d365ba16 136
ykuroda 0:13a5d365ba16 137 } // end namespace Eigen
ykuroda 0:13a5d365ba16 138
ykuroda 0:13a5d365ba16 139 #endif // EIGEN_CWISE_UNARY_VIEW_H