Eigen libary for mbed
src/Core/VectorBlock.h@1:3b8049da21b8, 2019-09-24 (annotated)
- 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?
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) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr> |
ykuroda | 0:13a5d365ba16 | 5 | // Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com> |
ykuroda | 0:13a5d365ba16 | 6 | // |
ykuroda | 0:13a5d365ba16 | 7 | // This Source Code Form is subject to the terms of the Mozilla |
ykuroda | 0:13a5d365ba16 | 8 | // Public License v. 2.0. If a copy of the MPL was not distributed |
ykuroda | 0:13a5d365ba16 | 9 | // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. |
ykuroda | 0:13a5d365ba16 | 10 | |
ykuroda | 0:13a5d365ba16 | 11 | #ifndef EIGEN_VECTORBLOCK_H |
ykuroda | 0:13a5d365ba16 | 12 | #define EIGEN_VECTORBLOCK_H |
ykuroda | 0:13a5d365ba16 | 13 | |
ykuroda | 0:13a5d365ba16 | 14 | namespace Eigen { |
ykuroda | 0:13a5d365ba16 | 15 | |
ykuroda | 0:13a5d365ba16 | 16 | /** \class VectorBlock |
ykuroda | 0:13a5d365ba16 | 17 | * \ingroup Core_Module |
ykuroda | 0:13a5d365ba16 | 18 | * |
ykuroda | 0:13a5d365ba16 | 19 | * \brief Expression of a fixed-size or dynamic-size sub-vector |
ykuroda | 0:13a5d365ba16 | 20 | * |
ykuroda | 0:13a5d365ba16 | 21 | * \param VectorType the type of the object in which we are taking a sub-vector |
ykuroda | 0:13a5d365ba16 | 22 | * \param Size size of the sub-vector we are taking at compile time (optional) |
ykuroda | 0:13a5d365ba16 | 23 | * |
ykuroda | 0:13a5d365ba16 | 24 | * This class represents an expression of either a fixed-size or dynamic-size sub-vector. |
ykuroda | 0:13a5d365ba16 | 25 | * It is the return type of DenseBase::segment(Index,Index) and DenseBase::segment<int>(Index) and |
ykuroda | 0:13a5d365ba16 | 26 | * most of the time this is the only way it is used. |
ykuroda | 0:13a5d365ba16 | 27 | * |
ykuroda | 0:13a5d365ba16 | 28 | * However, if you want to directly maniputate sub-vector expressions, |
ykuroda | 0:13a5d365ba16 | 29 | * for instance if you want to write a function returning such an expression, you |
ykuroda | 0:13a5d365ba16 | 30 | * will need to use this class. |
ykuroda | 0:13a5d365ba16 | 31 | * |
ykuroda | 0:13a5d365ba16 | 32 | * Here is an example illustrating the dynamic case: |
ykuroda | 0:13a5d365ba16 | 33 | * \include class_VectorBlock.cpp |
ykuroda | 0:13a5d365ba16 | 34 | * Output: \verbinclude class_VectorBlock.out |
ykuroda | 0:13a5d365ba16 | 35 | * |
ykuroda | 0:13a5d365ba16 | 36 | * \note Even though this expression has dynamic size, in the case where \a VectorType |
ykuroda | 0:13a5d365ba16 | 37 | * has fixed size, this expression inherits a fixed maximal size which means that evaluating |
ykuroda | 0:13a5d365ba16 | 38 | * it does not cause a dynamic memory allocation. |
ykuroda | 0:13a5d365ba16 | 39 | * |
ykuroda | 0:13a5d365ba16 | 40 | * Here is an example illustrating the fixed-size case: |
ykuroda | 0:13a5d365ba16 | 41 | * \include class_FixedVectorBlock.cpp |
ykuroda | 0:13a5d365ba16 | 42 | * Output: \verbinclude class_FixedVectorBlock.out |
ykuroda | 0:13a5d365ba16 | 43 | * |
ykuroda | 0:13a5d365ba16 | 44 | * \sa class Block, DenseBase::segment(Index,Index,Index,Index), DenseBase::segment(Index,Index) |
ykuroda | 0:13a5d365ba16 | 45 | */ |
ykuroda | 0:13a5d365ba16 | 46 | |
ykuroda | 0:13a5d365ba16 | 47 | namespace internal { |
ykuroda | 0:13a5d365ba16 | 48 | template<typename VectorType, int Size> |
ykuroda | 0:13a5d365ba16 | 49 | struct traits<VectorBlock<VectorType, Size> > |
ykuroda | 0:13a5d365ba16 | 50 | : public traits<Block<VectorType, |
ykuroda | 0:13a5d365ba16 | 51 | traits<VectorType>::Flags & RowMajorBit ? 1 : Size, |
ykuroda | 0:13a5d365ba16 | 52 | traits<VectorType>::Flags & RowMajorBit ? Size : 1> > |
ykuroda | 0:13a5d365ba16 | 53 | { |
ykuroda | 0:13a5d365ba16 | 54 | }; |
ykuroda | 0:13a5d365ba16 | 55 | } |
ykuroda | 0:13a5d365ba16 | 56 | |
ykuroda | 0:13a5d365ba16 | 57 | template<typename VectorType, int Size> class VectorBlock |
ykuroda | 0:13a5d365ba16 | 58 | : public Block<VectorType, |
ykuroda | 0:13a5d365ba16 | 59 | internal::traits<VectorType>::Flags & RowMajorBit ? 1 : Size, |
ykuroda | 0:13a5d365ba16 | 60 | internal::traits<VectorType>::Flags & RowMajorBit ? Size : 1> |
ykuroda | 0:13a5d365ba16 | 61 | { |
ykuroda | 0:13a5d365ba16 | 62 | typedef Block<VectorType, |
ykuroda | 0:13a5d365ba16 | 63 | internal::traits<VectorType>::Flags & RowMajorBit ? 1 : Size, |
ykuroda | 0:13a5d365ba16 | 64 | internal::traits<VectorType>::Flags & RowMajorBit ? Size : 1> Base; |
ykuroda | 0:13a5d365ba16 | 65 | enum { |
ykuroda | 0:13a5d365ba16 | 66 | IsColVector = !(internal::traits<VectorType>::Flags & RowMajorBit) |
ykuroda | 0:13a5d365ba16 | 67 | }; |
ykuroda | 0:13a5d365ba16 | 68 | public: |
ykuroda | 0:13a5d365ba16 | 69 | EIGEN_DENSE_PUBLIC_INTERFACE(VectorBlock) |
ykuroda | 0:13a5d365ba16 | 70 | |
ykuroda | 0:13a5d365ba16 | 71 | using Base::operator=; |
ykuroda | 0:13a5d365ba16 | 72 | |
ykuroda | 0:13a5d365ba16 | 73 | /** Dynamic-size constructor |
ykuroda | 0:13a5d365ba16 | 74 | */ |
ykuroda | 0:13a5d365ba16 | 75 | inline VectorBlock(VectorType& vector, Index start, Index size) |
ykuroda | 0:13a5d365ba16 | 76 | : Base(vector, |
ykuroda | 0:13a5d365ba16 | 77 | IsColVector ? start : 0, IsColVector ? 0 : start, |
ykuroda | 0:13a5d365ba16 | 78 | IsColVector ? size : 1, IsColVector ? 1 : size) |
ykuroda | 0:13a5d365ba16 | 79 | { |
ykuroda | 0:13a5d365ba16 | 80 | EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorBlock); |
ykuroda | 0:13a5d365ba16 | 81 | } |
ykuroda | 0:13a5d365ba16 | 82 | |
ykuroda | 0:13a5d365ba16 | 83 | /** Fixed-size constructor |
ykuroda | 0:13a5d365ba16 | 84 | */ |
ykuroda | 0:13a5d365ba16 | 85 | inline VectorBlock(VectorType& vector, Index start) |
ykuroda | 0:13a5d365ba16 | 86 | : Base(vector, IsColVector ? start : 0, IsColVector ? 0 : start) |
ykuroda | 0:13a5d365ba16 | 87 | { |
ykuroda | 0:13a5d365ba16 | 88 | EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorBlock); |
ykuroda | 0:13a5d365ba16 | 89 | } |
ykuroda | 0:13a5d365ba16 | 90 | }; |
ykuroda | 0:13a5d365ba16 | 91 | |
ykuroda | 0:13a5d365ba16 | 92 | |
ykuroda | 0:13a5d365ba16 | 93 | } // end namespace Eigen |
ykuroda | 0:13a5d365ba16 | 94 | |
ykuroda | 0:13a5d365ba16 | 95 | #endif // EIGEN_VECTORBLOCK_H |