xref: /aosp_15_r20/external/eigen/test/zerosized.cpp (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
1*bf2c3715SXin Li // This file is part of Eigen, a lightweight C++ template library
2*bf2c3715SXin Li // for linear algebra.
3*bf2c3715SXin Li //
4*bf2c3715SXin Li // Copyright (C) 2011 Benoit Jacob <[email protected]>
5*bf2c3715SXin Li //
6*bf2c3715SXin Li // This Source Code Form is subject to the terms of the Mozilla
7*bf2c3715SXin Li // Public License v. 2.0. If a copy of the MPL was not distributed
8*bf2c3715SXin Li // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9*bf2c3715SXin Li 
10*bf2c3715SXin Li #include "main.h"
11*bf2c3715SXin Li 
12*bf2c3715SXin Li 
zeroReduction(const MatrixType & m)13*bf2c3715SXin Li template<typename MatrixType> void zeroReduction(const MatrixType& m) {
14*bf2c3715SXin Li   // Reductions that must hold for zero sized objects
15*bf2c3715SXin Li   VERIFY(m.all());
16*bf2c3715SXin Li   VERIFY(!m.any());
17*bf2c3715SXin Li   VERIFY(m.prod()==1);
18*bf2c3715SXin Li   VERIFY(m.sum()==0);
19*bf2c3715SXin Li   VERIFY(m.norm()==0);
20*bf2c3715SXin Li   VERIFY(m.squaredNorm()==0);
21*bf2c3715SXin Li   VERIFY(m.count()==0);
22*bf2c3715SXin Li   VERIFY(m.allFinite());
23*bf2c3715SXin Li   VERIFY(!m.hasNaN());
24*bf2c3715SXin Li   VERIFY_RAISES_ASSERT( m.minCoeff() );
25*bf2c3715SXin Li   VERIFY_RAISES_ASSERT( m.maxCoeff() );
26*bf2c3715SXin Li   Index i,j;
27*bf2c3715SXin Li   VERIFY_RAISES_ASSERT( m.minCoeff(&i,&j) );
28*bf2c3715SXin Li   VERIFY_RAISES_ASSERT( m.maxCoeff(&i,&j) );
29*bf2c3715SXin Li   VERIFY_RAISES_ASSERT( m.reshaped().minCoeff(&i) );
30*bf2c3715SXin Li   VERIFY_RAISES_ASSERT( m.reshaped().maxCoeff(&i) );
31*bf2c3715SXin Li }
32*bf2c3715SXin Li 
33*bf2c3715SXin Li 
zeroSizedMatrix()34*bf2c3715SXin Li template<typename MatrixType> void zeroSizedMatrix()
35*bf2c3715SXin Li {
36*bf2c3715SXin Li   MatrixType t1;
37*bf2c3715SXin Li   typedef typename MatrixType::Scalar Scalar;
38*bf2c3715SXin Li 
39*bf2c3715SXin Li   if (MatrixType::SizeAtCompileTime == Dynamic || MatrixType::SizeAtCompileTime == 0)
40*bf2c3715SXin Li   {
41*bf2c3715SXin Li     zeroReduction(t1);
42*bf2c3715SXin Li     if (MatrixType::RowsAtCompileTime == Dynamic)
43*bf2c3715SXin Li       VERIFY(t1.rows() == 0);
44*bf2c3715SXin Li     if (MatrixType::ColsAtCompileTime == Dynamic)
45*bf2c3715SXin Li       VERIFY(t1.cols() == 0);
46*bf2c3715SXin Li 
47*bf2c3715SXin Li     if (MatrixType::RowsAtCompileTime == Dynamic && MatrixType::ColsAtCompileTime == Dynamic)
48*bf2c3715SXin Li     {
49*bf2c3715SXin Li 
50*bf2c3715SXin Li       MatrixType t2(0, 0), t3(t1);
51*bf2c3715SXin Li       VERIFY(t2.rows() == 0);
52*bf2c3715SXin Li       VERIFY(t2.cols() == 0);
53*bf2c3715SXin Li 
54*bf2c3715SXin Li       zeroReduction(t2);
55*bf2c3715SXin Li       VERIFY(t1==t2);
56*bf2c3715SXin Li     }
57*bf2c3715SXin Li   }
58*bf2c3715SXin Li 
59*bf2c3715SXin Li   if(MatrixType::MaxColsAtCompileTime!=0 && MatrixType::MaxRowsAtCompileTime!=0)
60*bf2c3715SXin Li   {
61*bf2c3715SXin Li     Index rows = MatrixType::RowsAtCompileTime==Dynamic ? internal::random<Index>(1,10) : Index(MatrixType::RowsAtCompileTime);
62*bf2c3715SXin Li     Index cols = MatrixType::ColsAtCompileTime==Dynamic ? internal::random<Index>(1,10) : Index(MatrixType::ColsAtCompileTime);
63*bf2c3715SXin Li     MatrixType m(rows,cols);
64*bf2c3715SXin Li     zeroReduction(m.template block<0,MatrixType::ColsAtCompileTime>(0,0,0,cols));
65*bf2c3715SXin Li     zeroReduction(m.template block<MatrixType::RowsAtCompileTime,0>(0,0,rows,0));
66*bf2c3715SXin Li     zeroReduction(m.template block<0,1>(0,0));
67*bf2c3715SXin Li     zeroReduction(m.template block<1,0>(0,0));
68*bf2c3715SXin Li     Matrix<Scalar,Dynamic,Dynamic> prod = m.template block<MatrixType::RowsAtCompileTime,0>(0,0,rows,0) * m.template block<0,MatrixType::ColsAtCompileTime>(0,0,0,cols);
69*bf2c3715SXin Li     VERIFY(prod.rows()==rows && prod.cols()==cols);
70*bf2c3715SXin Li     VERIFY(prod.isZero());
71*bf2c3715SXin Li     prod = m.template block<1,0>(0,0) * m.template block<0,1>(0,0);
72*bf2c3715SXin Li     VERIFY(prod.size()==1);
73*bf2c3715SXin Li     VERIFY(prod.isZero());
74*bf2c3715SXin Li   }
75*bf2c3715SXin Li }
76*bf2c3715SXin Li 
zeroSizedVector()77*bf2c3715SXin Li template<typename VectorType> void zeroSizedVector()
78*bf2c3715SXin Li {
79*bf2c3715SXin Li   VectorType t1;
80*bf2c3715SXin Li 
81*bf2c3715SXin Li   if (VectorType::SizeAtCompileTime == Dynamic || VectorType::SizeAtCompileTime==0)
82*bf2c3715SXin Li   {
83*bf2c3715SXin Li     zeroReduction(t1);
84*bf2c3715SXin Li     VERIFY(t1.size() == 0);
85*bf2c3715SXin Li     VectorType t2(DenseIndex(0)); // DenseIndex disambiguates with 0-the-null-pointer (error with gcc 4.4 and MSVC8)
86*bf2c3715SXin Li     VERIFY(t2.size() == 0);
87*bf2c3715SXin Li     zeroReduction(t2);
88*bf2c3715SXin Li 
89*bf2c3715SXin Li     VERIFY(t1==t2);
90*bf2c3715SXin Li   }
91*bf2c3715SXin Li }
92*bf2c3715SXin Li 
EIGEN_DECLARE_TEST(zerosized)93*bf2c3715SXin Li EIGEN_DECLARE_TEST(zerosized)
94*bf2c3715SXin Li {
95*bf2c3715SXin Li   zeroSizedMatrix<Matrix2d>();
96*bf2c3715SXin Li   zeroSizedMatrix<Matrix3i>();
97*bf2c3715SXin Li   zeroSizedMatrix<Matrix<float, 2, Dynamic> >();
98*bf2c3715SXin Li   zeroSizedMatrix<MatrixXf>();
99*bf2c3715SXin Li   zeroSizedMatrix<Matrix<float, 0, 0> >();
100*bf2c3715SXin Li   zeroSizedMatrix<Matrix<float, Dynamic, 0, 0, 0, 0> >();
101*bf2c3715SXin Li   zeroSizedMatrix<Matrix<float, 0, Dynamic, 0, 0, 0> >();
102*bf2c3715SXin Li   zeroSizedMatrix<Matrix<float, Dynamic, Dynamic, 0, 0, 0> >();
103*bf2c3715SXin Li   zeroSizedMatrix<Matrix<float, 0, 4> >();
104*bf2c3715SXin Li   zeroSizedMatrix<Matrix<float, 4, 0> >();
105*bf2c3715SXin Li 
106*bf2c3715SXin Li   zeroSizedVector<Vector2d>();
107*bf2c3715SXin Li   zeroSizedVector<Vector3i>();
108*bf2c3715SXin Li   zeroSizedVector<VectorXf>();
109*bf2c3715SXin Li   zeroSizedVector<Matrix<float, 0, 1> >();
110*bf2c3715SXin Li   zeroSizedVector<Matrix<float, 1, 0> >();
111*bf2c3715SXin Li }
112