VectorBlock.h
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
5 // Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>
6 //
7 // This Source Code Form is subject to the terms of the Mozilla
8 // Public License v. 2.0. If a copy of the MPL was not distributed
9 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10 
11 #ifndef EIGEN_VECTORBLOCK_H
12 #define EIGEN_VECTORBLOCK_H
13 
14 namespace Eigen {
15 
47 namespace internal {
48 template<typename VectorType, int Size>
49 struct traits<VectorBlock<VectorType, Size> >
50  : public traits<Block<VectorType,
51  traits<VectorType>::Flags & RowMajorBit ? 1 : Size,
52  traits<VectorType>::Flags & RowMajorBit ? Size : 1> >
53 {
54 };
55 }
56 
57 template<typename VectorType, int Size> class VectorBlock
58  : public Block<VectorType,
59  internal::traits<VectorType>::Flags & RowMajorBit ? 1 : Size,
60  internal::traits<VectorType>::Flags & RowMajorBit ? Size : 1>
61 {
62  typedef Block<VectorType,
63  internal::traits<VectorType>::Flags & RowMajorBit ? 1 : Size,
64  internal::traits<VectorType>::Flags & RowMajorBit ? Size : 1> Base;
65  enum {
66  IsColVector = !(internal::traits<VectorType>::Flags & RowMajorBit)
67  };
68  public:
69  EIGEN_DENSE_PUBLIC_INTERFACE(VectorBlock)
70 
71  using Base::operator=;
72 
75  inline VectorBlock(VectorType& vector, Index start, Index size)
76  : Base(vector,
77  IsColVector ? start : 0, IsColVector ? 0 : start,
78  IsColVector ? size : 1, IsColVector ? 1 : size)
79  {
80  EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorBlock);
81  }
82 
85  inline VectorBlock(VectorType& vector, Index start)
86  : Base(vector, IsColVector ? start : 0, IsColVector ? 0 : start)
87  {
88  EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorBlock);
89  }
90 };
91 
92 
109 template<typename Derived>
110 inline typename DenseBase<Derived>::SegmentReturnType
112 {
113  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
114  return SegmentReturnType(derived(), start, size);
115 }
116 
118 template<typename Derived>
121 {
122  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
123  return ConstSegmentReturnType(derived(), start, size);
124 }
125 
141 template<typename Derived>
144 {
145  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
146  return SegmentReturnType(derived(), 0, size);
147 }
148 
150 template<typename Derived>
153 {
154  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
155  return ConstSegmentReturnType(derived(), 0, size);
156 }
157 
173 template<typename Derived>
176 {
177  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
178  return SegmentReturnType(derived(), this->size() - size, size);
179 }
180 
182 template<typename Derived>
185 {
186  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
187  return ConstSegmentReturnType(derived(), this->size() - size, size);
188 }
189 
203 template<typename Derived>
204 template<int Size>
205 inline typename DenseBase<Derived>::template FixedSegmentReturnType<Size>::Type
207 {
208  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
209  return typename FixedSegmentReturnType<Size>::Type(derived(), start);
210 }
211 
213 template<typename Derived>
214 template<int Size>
215 inline typename DenseBase<Derived>::template ConstFixedSegmentReturnType<Size>::Type
217 {
218  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
219  return typename ConstFixedSegmentReturnType<Size>::Type(derived(), start);
220 }
221 
233 template<typename Derived>
234 template<int Size>
235 inline typename DenseBase<Derived>::template FixedSegmentReturnType<Size>::Type
237 {
238  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
239  return typename FixedSegmentReturnType<Size>::Type(derived(), 0);
240 }
241 
243 template<typename Derived>
244 template<int Size>
245 inline typename DenseBase<Derived>::template ConstFixedSegmentReturnType<Size>::Type
247 {
248  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
249  return typename ConstFixedSegmentReturnType<Size>::Type(derived(), 0);
250 }
251 
263 template<typename Derived>
264 template<int Size>
265 inline typename DenseBase<Derived>::template FixedSegmentReturnType<Size>::Type
267 {
268  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
269  return typename FixedSegmentReturnType<Size>::Type(derived(), size() - Size);
270 }
271 
273 template<typename Derived>
274 template<int Size>
275 inline typename DenseBase<Derived>::template ConstFixedSegmentReturnType<Size>::Type
277 {
278  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
279  return typename ConstFixedSegmentReturnType<Size>::Type(derived(), size() - Size);
280 }
281 
282 } // end namespace Eigen
283 
284 #endif // EIGEN_VECTORBLOCK_H