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-2009 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_BLOCK2_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_BLOCK2_H
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a dynamic-size expression of a corner of *this.
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \param type the type of corner. Can be \a Eigen::TopLeft, \a Eigen::TopRight,
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \a Eigen::BottomLeft, \a Eigen::BottomRight.
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \param cRows the number of rows in the corner
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \param cCols the number of columns in the corner
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include MatrixBase_corner_enum_int_int.cpp
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude MatrixBase_corner_enum_int_int.out
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \note Even though the returned expression has dynamic size, in the case
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * when it is applied to a fixed-size matrix, it inherits a fixed maximal size,
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * which means that evaluating it does not cause a dynamic memory allocation.
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa class Block, block(Index,Index,Index,Index)
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline Block<Derived> DenseBase<Derived>
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  ::corner(CornerType type, Index cRows, Index cCols)
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  switch(type)
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    default:
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      eigen_assert(false && "Bad corner type.");
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    case TopLeft:
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return Block<Derived>(derived(), 0, 0, cRows, cCols);
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    case TopRight:
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return Block<Derived>(derived(), 0, cols() - cCols, cRows, cCols);
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    case BottomLeft:
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return Block<Derived>(derived(), rows() - cRows, 0, cRows, cCols);
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    case BottomRight:
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return Block<Derived>(derived(), rows() - cRows, cols() - cCols, cRows, cCols);
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** This is the const version of corner(CornerType, Index, Index).*/
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const Block<Derived>
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::corner(CornerType type, Index cRows, Index cCols) const
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  switch(type)
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    default:
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      eigen_assert(false && "Bad corner type.");
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    case TopLeft:
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return Block<Derived>(derived(), 0, 0, cRows, cCols);
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    case TopRight:
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return Block<Derived>(derived(), 0, cols() - cCols, cRows, cCols);
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    case BottomLeft:
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return Block<Derived>(derived(), rows() - cRows, 0, cRows, cCols);
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    case BottomRight:
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return Block<Derived>(derived(), rows() - cRows, cols() - cCols, cRows, cCols);
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a fixed-size expression of a corner of *this.
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \param type the type of corner. Can be \a Eigen::TopLeft, \a Eigen::TopRight,
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \a Eigen::BottomLeft, \a Eigen::BottomRight.
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * The template parameters CRows and CCols arethe number of rows and columns in the corner.
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include MatrixBase_template_int_int_corner_enum.cpp
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude MatrixBase_template_int_int_corner_enum.out
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa class Block, block(Index,Index,Index,Index)
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int CRows, int CCols>
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline Block<Derived, CRows, CCols>
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::corner(CornerType type)
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  switch(type)
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    default:
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      eigen_assert(false && "Bad corner type.");
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    case TopLeft:
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return Block<Derived, CRows, CCols>(derived(), 0, 0);
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    case TopRight:
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return Block<Derived, CRows, CCols>(derived(), 0, cols() - CCols);
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    case BottomLeft:
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return Block<Derived, CRows, CCols>(derived(), rows() - CRows, 0);
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    case BottomRight:
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return Block<Derived, CRows, CCols>(derived(), rows() - CRows, cols() - CCols);
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** This is the const version of corner<int, int>(CornerType).*/
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int CRows, int CCols>
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const Block<Derived, CRows, CCols>
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::corner(CornerType type) const
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  switch(type)
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    default:
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      eigen_assert(false && "Bad corner type.");
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    case TopLeft:
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return Block<Derived, CRows, CCols>(derived(), 0, 0);
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    case TopRight:
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return Block<Derived, CRows, CCols>(derived(), 0, cols() - CCols);
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    case BottomLeft:
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return Block<Derived, CRows, CCols>(derived(), rows() - CRows, 0);
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    case BottomRight:
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return Block<Derived, CRows, CCols>(derived(), rows() - CRows, cols() - CCols);
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_BLOCK2_H
127