|  | // This file is part of Eigen, a lightweight C++ template library | 
|  | // for linear algebra. | 
|  | // | 
|  | // Copyright (C) 2018 Gael Guennebaud <gael.guennebaud@inria.fr> | 
|  | // | 
|  | // 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/. | 
|  |  | 
|  | #include "main.h" | 
|  | #include <Eigen/SparseCore> | 
|  |  | 
|  | template<int ExpectedDim,typename Xpr> | 
|  | void check_dim(const Xpr& ) { | 
|  | STATIC_CHECK( Xpr::NumDimensions == ExpectedDim ); | 
|  | } | 
|  |  | 
|  | #if EIGEN_HAS_CXX11 | 
|  | template<template <typename,int,int> class Object> | 
|  | void map_num_dimensions() | 
|  | { | 
|  | typedef Object<double, 1, 1> ArrayScalarType; | 
|  | typedef Object<double, 2, 1> ArrayVectorType; | 
|  | typedef Object<double, 1, 2> TransposeArrayVectorType; | 
|  | typedef Object<double, 2, 2> ArrayType; | 
|  | typedef Object<double, Eigen::Dynamic, 1> DynamicArrayVectorType; | 
|  | typedef Object<double, 1, Eigen::Dynamic> DynamicTransposeArrayVectorType; | 
|  | typedef Object<double, Eigen::Dynamic, Eigen::Dynamic> DynamicArrayType; | 
|  |  | 
|  | STATIC_CHECK(ArrayScalarType::NumDimensions == 0); | 
|  | STATIC_CHECK(ArrayVectorType::NumDimensions == 1); | 
|  | STATIC_CHECK(TransposeArrayVectorType::NumDimensions == 1); | 
|  | STATIC_CHECK(ArrayType::NumDimensions == 2); | 
|  | STATIC_CHECK(DynamicArrayVectorType::NumDimensions == 1); | 
|  | STATIC_CHECK(DynamicTransposeArrayVectorType::NumDimensions == 1); | 
|  | STATIC_CHECK(DynamicArrayType::NumDimensions == 2); | 
|  |  | 
|  | typedef Eigen::Map<ArrayScalarType> ArrayScalarMap; | 
|  | typedef Eigen::Map<ArrayVectorType> ArrayVectorMap; | 
|  | typedef Eigen::Map<TransposeArrayVectorType> TransposeArrayVectorMap; | 
|  | typedef Eigen::Map<ArrayType> ArrayMap; | 
|  | typedef Eigen::Map<DynamicArrayVectorType> DynamicArrayVectorMap; | 
|  | typedef Eigen::Map<DynamicTransposeArrayVectorType> DynamicTransposeArrayVectorMap; | 
|  | typedef Eigen::Map<DynamicArrayType> DynamicArrayMap; | 
|  |  | 
|  | STATIC_CHECK(ArrayScalarMap::NumDimensions == 0); | 
|  | STATIC_CHECK(ArrayVectorMap::NumDimensions == 1); | 
|  | STATIC_CHECK(TransposeArrayVectorMap::NumDimensions == 1); | 
|  | STATIC_CHECK(ArrayMap::NumDimensions == 2); | 
|  | STATIC_CHECK(DynamicArrayVectorMap::NumDimensions == 1); | 
|  | STATIC_CHECK(DynamicTransposeArrayVectorMap::NumDimensions == 1); | 
|  | STATIC_CHECK(DynamicArrayMap::NumDimensions == 2); | 
|  | } | 
|  |  | 
|  | template<typename Scalar, int Rows, int Cols> | 
|  | using TArray = Array<Scalar,Rows,Cols>; | 
|  |  | 
|  | template<typename Scalar, int Rows, int Cols> | 
|  | using TMatrix = Matrix<Scalar,Rows,Cols>; | 
|  |  | 
|  | #endif | 
|  |  | 
|  | EIGEN_DECLARE_TEST(num_dimensions) | 
|  | { | 
|  | int n = 10; | 
|  | ArrayXXd A(n,n); | 
|  | CALL_SUBTEST( check_dim<2>(A) ); | 
|  | CALL_SUBTEST( check_dim<2>(A.block(1,1,2,2)) ); | 
|  | CALL_SUBTEST( check_dim<1>(A.col(1)) ); | 
|  | CALL_SUBTEST( check_dim<1>(A.row(1)) ); | 
|  |  | 
|  | MatrixXd M(n,n); | 
|  | CALL_SUBTEST( check_dim<0>(M.row(1)*M.col(1)) ); | 
|  |  | 
|  | SparseMatrix<double> S(n,n); | 
|  | CALL_SUBTEST( check_dim<2>(S) ); | 
|  | CALL_SUBTEST( check_dim<2>(S.block(1,1,2,2)) ); | 
|  | CALL_SUBTEST( check_dim<1>(S.col(1)) ); | 
|  | CALL_SUBTEST( check_dim<1>(S.row(1)) ); | 
|  |  | 
|  | SparseVector<double> s(n); | 
|  | CALL_SUBTEST( check_dim<1>(s) ); | 
|  | CALL_SUBTEST( check_dim<1>(s.head(2)) ); | 
|  |  | 
|  |  | 
|  | #if EIGEN_HAS_CXX11 | 
|  | CALL_SUBTEST( map_num_dimensions<TArray>() ); | 
|  | CALL_SUBTEST( map_num_dimensions<TMatrix>() ); | 
|  | #endif | 
|  | } |