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} // end namespace Eigen 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_VECTORBLOCK_H 96