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