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