// This file is part of Eigen, a lightweight C++ template library // for linear algebra. // // Copyright (C) 2017 Gael Guennebaud // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. #ifndef EIGEN_PARSED_BY_DOXYGEN // This file is automatically included twice to generate const and non-const versions #ifndef EIGEN_INDEXED_VIEW_METHOD_2ND_PASS #define EIGEN_INDEXED_VIEW_METHOD_CONST const #define EIGEN_INDEXED_VIEW_METHOD_TYPE ConstIndexedViewType #else #define EIGEN_INDEXED_VIEW_METHOD_CONST #define EIGEN_INDEXED_VIEW_METHOD_TYPE IndexedViewType #endif template struct EIGEN_INDEXED_VIEW_METHOD_TYPE { typedef IndexedView::type, typename internal::MakeIndexing::type> type; }; // This is the generic version template typename internal::enable_if< ! (internal::traits::type>::IsBlockAlike || (internal::is_integral::value && internal::is_integral::value)), typename EIGEN_INDEXED_VIEW_METHOD_TYPE::type >::type operator()(const RowIndices& rowIndices, const ColIndices& colIndices) EIGEN_INDEXED_VIEW_METHOD_CONST { return typename EIGEN_INDEXED_VIEW_METHOD_TYPE::type (derived(), internal::make_indexing(rowIndices,derived().rows()), internal::make_indexing(colIndices,derived().cols())); } // The folowing overload returns a Block<> object template typename internal::enable_if< internal::traits::type>::IsBlockAlike && !(internal::is_integral::value && internal::is_integral::value), typename internal::traits::type>::BlockType>::type operator()(const RowIndices& rowIndices, const ColIndices& colIndices) EIGEN_INDEXED_VIEW_METHOD_CONST { typedef typename internal::traits::type>::BlockType BlockType; typename internal::MakeIndexing::type actualRowIndices = internal::make_indexing(rowIndices,derived().rows()); typename internal::MakeIndexing::type actualColIndices = internal::make_indexing(colIndices,derived().cols()); return BlockType(derived(), internal::first(actualRowIndices), internal::first(actualColIndices), internal::size(actualRowIndices), internal::size(actualColIndices)); } // The folowing three overloads are needed to handle raw Index[N] arrays. template IndexedView::type> operator()(const RowIndicesT (&rowIndices)[RowIndicesN], const ColIndices& colIndices) EIGEN_INDEXED_VIEW_METHOD_CONST { return IndexedView::type> (derived(), rowIndices, internal::make_indexing(colIndices,derived().cols())); } template IndexedView::type, const ColIndicesT (&)[ColIndicesN]> operator()(const RowIndices& rowIndices, const ColIndicesT (&colIndices)[ColIndicesN]) EIGEN_INDEXED_VIEW_METHOD_CONST { return IndexedView::type,const ColIndicesT (&)[ColIndicesN]> (derived(), internal::make_indexing(rowIndices,derived().rows()), colIndices); } template IndexedView operator()(const RowIndicesT (&rowIndices)[RowIndicesN], const ColIndicesT (&colIndices)[ColIndicesN]) EIGEN_INDEXED_VIEW_METHOD_CONST { return IndexedView (derived(), rowIndices, colIndices); } #undef EIGEN_INDEXED_VIEW_METHOD_CONST #undef EIGEN_INDEXED_VIEW_METHOD_TYPE #ifndef EIGEN_INDEXED_VIEW_METHOD_2ND_PASS #define EIGEN_INDEXED_VIEW_METHOD_2ND_PASS #include "IndexedViewMethods.h" #undef EIGEN_INDEXED_VIEW_METHOD_2ND_PASS #endif #else // EIGEN_PARSED_BY_DOXYGEN /** * \returns a generic submatrix view defined by the rows and columns indexed \a rowIndices and \a colIndices respectively. * * Each parameter must either be: * - An integer indexing a single row or column * - Eigen::all indexing the full set of respective rows or columns in increasing order * - An ArithemeticSequence as returned by the seq and seqN functions * - Any %Eigen's vector/array of integers or expressions * - Plain C arrays: \c int[N] * - And more generally any type exposing the following two member functions: * \code * operator[]() const; * size() const; * \endcode * where \c stands for any integer type compatible with Eigen::Index (i.e. \c std::ptrdiff_t). * * The last statement implies compatibility with \c std::vector, \c std::valarray, \c std::array, many of the Range-v3's ranges, etc. * * If the submatrix can be represented using a starting position \c (i,j) and positive sizes \c (rows,columns), then this * method will returns a Block object after extraction of the relevant information from the passed arguments. This is the case * when all arguments are either: * - An integer * - Eigen::all * - An ArithemeticSequence with compile-time increment strictly equal to 1, as returned by seq(a,b), and seqN(a,N). * * Otherwise a more general IndexedView object will be returned, after conversion of the inputs * to more suitable types \c RowIndices' and \c ColIndices'. * * \sa class Block, class IndexedView, DenseBase::block(Index,Index,Index,Index) */ template IndexedView_or_Block operator()(const RowIndices& rowIndices, const ColIndices& colIndices); #endif // EIGEN_PARSED_BY_DOXYGEN