VectorBlock.h revision c981c48f5bc9aefeffc0bcb0cc3934c2fae179dd
1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com> 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_VECTORBLOCK_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_VECTORBLOCK_H 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class VectorBlock 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \ingroup Core_Module 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Expression of a fixed-size or dynamic-size sub-vector 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param VectorType the type of the object in which we are taking a sub-vector 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param Size size of the sub-vector we are taking at compile time (optional) 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This class represents an expression of either a fixed-size or dynamic-size sub-vector. 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * It is the return type of DenseBase::segment(Index,Index) and DenseBase::segment<int>(Index) and 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * most of the time this is the only way it is used. 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * However, if you want to directly maniputate sub-vector expressions, 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * for instance if you want to write a function returning such an expression, you 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * will need to use this class. 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Here is an example illustrating the dynamic case: 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \include class_VectorBlock.cpp 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Output: \verbinclude class_VectorBlock.out 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \note Even though this expression has dynamic size, in the case where \a VectorType 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * has fixed size, this expression inherits a fixed maximal size which means that evaluating 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * it does not cause a dynamic memory allocation. 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Here is an example illustrating the fixed-size case: 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \include class_FixedVectorBlock.cpp 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Output: \verbinclude class_FixedVectorBlock.out 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class Block, DenseBase::segment(Index,Index,Index,Index), DenseBase::segment(Index,Index) 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename VectorType, int Size> 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct traits<VectorBlock<VectorType, Size> > 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : public traits<Block<VectorType, 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath traits<VectorType>::Flags & RowMajorBit ? 1 : Size, 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath traits<VectorType>::Flags & RowMajorBit ? Size : 1> > 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename VectorType, int Size> class VectorBlock 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : public Block<VectorType, 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::traits<VectorType>::Flags & RowMajorBit ? 1 : Size, 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::traits<VectorType>::Flags & RowMajorBit ? Size : 1> 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Block<VectorType, 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::traits<VectorType>::Flags & RowMajorBit ? 1 : Size, 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::traits<VectorType>::Flags & RowMajorBit ? Size : 1> Base; 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IsColVector = !(internal::traits<VectorType>::Flags & RowMajorBit) 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_DENSE_PUBLIC_INTERFACE(VectorBlock) 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::operator=; 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Dynamic-size constructor 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline VectorBlock(VectorType& vector, Index start, Index size) 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : Base(vector, 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IsColVector ? start : 0, IsColVector ? 0 : start, 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath IsColVector ? size : 1, IsColVector ? 1 : size) 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorBlock); 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Fixed-size constructor 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline VectorBlock(VectorType& vector, Index start) 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : Base(vector, IsColVector ? start : 0, IsColVector ? 0 : start) 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorBlock); 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a dynamic-size expression of a segment (i.e. a vector block) in *this. 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \only_for_vectors 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param start the first coefficient in the segment 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param size the number of coefficients in the segment 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Example: \include MatrixBase_segment_int_int.cpp 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Output: \verbinclude MatrixBase_segment_int_int.out 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \note Even though the returned expression has dynamic size, in the case 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * when it is applied to a fixed-size vector, it inherits a fixed maximal size, 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * which means that evaluating it does not cause a dynamic memory allocation. 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class Block, segment(Index) 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename DenseBase<Derived>::SegmentReturnType 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::segment(Index start, Index size) 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return SegmentReturnType(derived(), start, size); 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** This is the const version of segment(Index,Index).*/ 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename DenseBase<Derived>::ConstSegmentReturnType 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::segment(Index start, Index size) const 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return ConstSegmentReturnType(derived(), start, size); 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a dynamic-size expression of the first coefficients of *this. 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \only_for_vectors 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param size the number of coefficients in the block 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Example: \include MatrixBase_start_int.cpp 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Output: \verbinclude MatrixBase_start_int.out 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \note Even though the returned expression has dynamic size, in the case 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * when it is applied to a fixed-size vector, it inherits a fixed maximal size, 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * which means that evaluating it does not cause a dynamic memory allocation. 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class Block, block(Index,Index) 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename DenseBase<Derived>::SegmentReturnType 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::head(Index size) 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return SegmentReturnType(derived(), 0, size); 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** This is the const version of head(Index).*/ 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename DenseBase<Derived>::ConstSegmentReturnType 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::head(Index size) const 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return ConstSegmentReturnType(derived(), 0, size); 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a dynamic-size expression of the last coefficients of *this. 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \only_for_vectors 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param size the number of coefficients in the block 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Example: \include MatrixBase_end_int.cpp 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Output: \verbinclude MatrixBase_end_int.out 166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \note Even though the returned expression has dynamic size, in the case 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * when it is applied to a fixed-size vector, it inherits a fixed maximal size, 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * which means that evaluating it does not cause a dynamic memory allocation. 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class Block, block(Index,Index) 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename DenseBase<Derived>::SegmentReturnType 175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::tail(Index size) 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return SegmentReturnType(derived(), this->size() - size, size); 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** This is the const version of tail(Index).*/ 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename DenseBase<Derived>::ConstSegmentReturnType 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::tail(Index size) const 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return ConstSegmentReturnType(derived(), this->size() - size, size); 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a fixed-size expression of a segment (i.e. a vector block) in \c *this 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \only_for_vectors 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * The template parameter \a Size is the number of coefficients in the block 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param start the index of the first element of the sub-vector 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Example: \include MatrixBase_template_int_segment.cpp 199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Output: \verbinclude MatrixBase_template_int_segment.out 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class Block 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int Size> 205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename DenseBase<Derived>::template FixedSegmentReturnType<Size>::Type 206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::segment(Index start) 207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) 209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return typename FixedSegmentReturnType<Size>::Type(derived(), start); 210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** This is the const version of segment<int>(Index).*/ 213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int Size> 215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename DenseBase<Derived>::template ConstFixedSegmentReturnType<Size>::Type 216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::segment(Index start) const 217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) 219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return typename ConstFixedSegmentReturnType<Size>::Type(derived(), start); 220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a fixed-size expression of the first coefficients of *this. 223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \only_for_vectors 225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * The template parameter \a Size is the number of coefficients in the block 227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Example: \include MatrixBase_template_int_start.cpp 229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Output: \verbinclude MatrixBase_template_int_start.out 230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class Block 232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int Size> 235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename DenseBase<Derived>::template FixedSegmentReturnType<Size>::Type 236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::head() 237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) 239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return typename FixedSegmentReturnType<Size>::Type(derived(), 0); 240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** This is the const version of head<int>().*/ 243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int Size> 245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename DenseBase<Derived>::template ConstFixedSegmentReturnType<Size>::Type 246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::head() const 247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) 249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return typename ConstFixedSegmentReturnType<Size>::Type(derived(), 0); 250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a fixed-size expression of the last coefficients of *this. 253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \only_for_vectors 255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * The template parameter \a Size is the number of coefficients in the block 257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Example: \include MatrixBase_template_int_end.cpp 259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Output: \verbinclude MatrixBase_template_int_end.out 260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class Block 262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int Size> 265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename DenseBase<Derived>::template FixedSegmentReturnType<Size>::Type 266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::tail() 267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) 269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return typename FixedSegmentReturnType<Size>::Type(derived(), size() - Size); 270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** This is the const version of tail<int>.*/ 273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> 274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int Size> 275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename DenseBase<Derived>::template ConstFixedSegmentReturnType<Size>::Type 276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::tail() const 277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) 279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return typename ConstFixedSegmentReturnType<Size>::Type(derived(), size() - Size); 280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 281c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_VECTORBLOCK_H 285