83 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // 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);
 | |
| }
 | |
| 
 | |
| 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>;
 | |
| 
 | |
| 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)));
 | |
| 
 | |
|   CALL_SUBTEST(map_num_dimensions<TArray>());
 | |
|   CALL_SUBTEST(map_num_dimensions<TMatrix>());
 | |
| }
 | 
