diagonal_matrix_variadic_ctor.cpp (6686B)
1 // This file is part of Eigen, a lightweight C++ template library 2 // for linear algebra. 3 // 4 // Copyright (C) 2019 David Tellenbach <david.tellenbach@tellnotes.org> 5 // 6 // This Source Code Form is subject to the terms of the Mozilla 7 // Public License v. 2.0. If a copy of the MPL was not distributed 8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9 10 #define EIGEN_NO_STATIC_ASSERT 11 12 #include "main.h" 13 14 template <typename Scalar> 15 void assertionTest() 16 { 17 typedef DiagonalMatrix<Scalar, 5> DiagMatrix5; 18 typedef DiagonalMatrix<Scalar, 7> DiagMatrix7; 19 typedef DiagonalMatrix<Scalar, Dynamic> DiagMatrixX; 20 21 Scalar raw[6]; 22 for (int i = 0; i < 6; ++i) { 23 raw[i] = internal::random<Scalar>(); 24 } 25 26 VERIFY_RAISES_ASSERT((DiagMatrix5{raw[0], raw[1], raw[2], raw[3]})); 27 VERIFY_RAISES_ASSERT((DiagMatrix5{raw[0], raw[1], raw[3]})); 28 VERIFY_RAISES_ASSERT((DiagMatrix7{raw[0], raw[1], raw[2], raw[3]})); 29 30 VERIFY_RAISES_ASSERT((DiagMatrixX { 31 {raw[0], raw[1], raw[2]}, 32 {raw[3], raw[4], raw[5]} 33 })); 34 } 35 36 #define VERIFY_IMPLICIT_CONVERSION_3(DIAGTYPE, V0, V1, V2) \ 37 DIAGTYPE d(V0, V1, V2); \ 38 DIAGTYPE::DenseMatrixType Dense = d.toDenseMatrix(); \ 39 VERIFY_IS_APPROX(Dense(0, 0), (Scalar)V0); \ 40 VERIFY_IS_APPROX(Dense(1, 1), (Scalar)V1); \ 41 VERIFY_IS_APPROX(Dense(2, 2), (Scalar)V2); 42 43 #define VERIFY_IMPLICIT_CONVERSION_4(DIAGTYPE, V0, V1, V2, V3) \ 44 DIAGTYPE d(V0, V1, V2, V3); \ 45 DIAGTYPE::DenseMatrixType Dense = d.toDenseMatrix(); \ 46 VERIFY_IS_APPROX(Dense(0, 0), (Scalar)V0); \ 47 VERIFY_IS_APPROX(Dense(1, 1), (Scalar)V1); \ 48 VERIFY_IS_APPROX(Dense(2, 2), (Scalar)V2); \ 49 VERIFY_IS_APPROX(Dense(3, 3), (Scalar)V3); 50 51 #define VERIFY_IMPLICIT_CONVERSION_5(DIAGTYPE, V0, V1, V2, V3, V4) \ 52 DIAGTYPE d(V0, V1, V2, V3, V4); \ 53 DIAGTYPE::DenseMatrixType Dense = d.toDenseMatrix(); \ 54 VERIFY_IS_APPROX(Dense(0, 0), (Scalar)V0); \ 55 VERIFY_IS_APPROX(Dense(1, 1), (Scalar)V1); \ 56 VERIFY_IS_APPROX(Dense(2, 2), (Scalar)V2); \ 57 VERIFY_IS_APPROX(Dense(3, 3), (Scalar)V3); \ 58 VERIFY_IS_APPROX(Dense(4, 4), (Scalar)V4); 59 60 template<typename Scalar> 61 void constructorTest() 62 { 63 typedef DiagonalMatrix<Scalar, 0> DiagonalMatrix0; 64 typedef DiagonalMatrix<Scalar, 3> DiagonalMatrix3; 65 typedef DiagonalMatrix<Scalar, 4> DiagonalMatrix4; 66 typedef DiagonalMatrix<Scalar, Dynamic> DiagonalMatrixX; 67 68 Scalar raw[7]; 69 for (int k = 0; k < 7; ++k) raw[k] = internal::random<Scalar>(); 70 71 // Fixed-sized matrices 72 { 73 DiagonalMatrix0 a {{}}; 74 VERIFY(a.rows() == 0); 75 VERIFY(a.cols() == 0); 76 typename DiagonalMatrix0::DenseMatrixType m = a.toDenseMatrix(); 77 for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]); 78 } 79 { 80 DiagonalMatrix3 a {{raw[0], raw[1], raw[2]}}; 81 VERIFY(a.rows() == 3); 82 VERIFY(a.cols() == 3); 83 typename DiagonalMatrix3::DenseMatrixType m = a.toDenseMatrix(); 84 for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]); 85 } 86 { 87 DiagonalMatrix4 a {{raw[0], raw[1], raw[2], raw[3]}}; 88 VERIFY(a.rows() == 4); 89 VERIFY(a.cols() == 4); 90 typename DiagonalMatrix4::DenseMatrixType m = a.toDenseMatrix(); 91 for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]); 92 } 93 94 // dynamically sized matrices 95 { 96 DiagonalMatrixX a{{}}; 97 VERIFY(a.rows() == 0); 98 VERIFY(a.rows() == 0); 99 typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix(); 100 for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]); 101 } 102 { 103 DiagonalMatrixX a{{raw[0], raw[1], raw[2], raw[3], raw[4], raw[5], raw[6]}}; 104 VERIFY(a.rows() == 7); 105 VERIFY(a.rows() == 7); 106 typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix(); 107 for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]); 108 } 109 } 110 111 template<> 112 void constructorTest<float>() 113 { 114 typedef float Scalar; 115 116 typedef DiagonalMatrix<Scalar, 0> DiagonalMatrix0; 117 typedef DiagonalMatrix<Scalar, 3> DiagonalMatrix3; 118 typedef DiagonalMatrix<Scalar, 4> DiagonalMatrix4; 119 typedef DiagonalMatrix<Scalar, 5> DiagonalMatrix5; 120 typedef DiagonalMatrix<Scalar, Dynamic> DiagonalMatrixX; 121 122 Scalar raw[7]; 123 for (int k = 0; k < 7; ++k) raw[k] = internal::random<Scalar>(); 124 125 // Fixed-sized matrices 126 { 127 DiagonalMatrix0 a {{}}; 128 VERIFY(a.rows() == 0); 129 VERIFY(a.cols() == 0); 130 typename DiagonalMatrix0::DenseMatrixType m = a.toDenseMatrix(); 131 for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]); 132 } 133 { 134 DiagonalMatrix3 a {{raw[0], raw[1], raw[2]}}; 135 VERIFY(a.rows() == 3); 136 VERIFY(a.cols() == 3); 137 typename DiagonalMatrix3::DenseMatrixType m = a.toDenseMatrix(); 138 for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]); 139 } 140 { 141 DiagonalMatrix4 a {{raw[0], raw[1], raw[2], raw[3]}}; 142 VERIFY(a.rows() == 4); 143 VERIFY(a.cols() == 4); 144 typename DiagonalMatrix4::DenseMatrixType m = a.toDenseMatrix(); 145 for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]); 146 } 147 148 // dynamically sized matrices 149 { 150 DiagonalMatrixX a{{}}; 151 VERIFY(a.rows() == 0); 152 VERIFY(a.rows() == 0); 153 typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix(); 154 for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]); 155 } 156 { 157 DiagonalMatrixX a{{raw[0], raw[1], raw[2], raw[3], raw[4], raw[5], raw[6]}}; 158 VERIFY(a.rows() == 7); 159 VERIFY(a.rows() == 7); 160 typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix(); 161 for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]); 162 } 163 { VERIFY_IMPLICIT_CONVERSION_3(DiagonalMatrix3, 1.2647, 2.56f, -3); } 164 { VERIFY_IMPLICIT_CONVERSION_4(DiagonalMatrix4, 1.2647, 2.56f, -3, 3.23f); } 165 { VERIFY_IMPLICIT_CONVERSION_5(DiagonalMatrix5, 1.2647, 2.56f, -3, 3.23f, 2); } 166 } 167 168 EIGEN_DECLARE_TEST(diagonal_matrix_variadic_ctor) 169 { 170 CALL_SUBTEST_1(assertionTest<unsigned char>()); 171 CALL_SUBTEST_1(assertionTest<float>()); 172 CALL_SUBTEST_1(assertionTest<Index>()); 173 CALL_SUBTEST_1(assertionTest<int>()); 174 CALL_SUBTEST_1(assertionTest<long int>()); 175 CALL_SUBTEST_1(assertionTest<std::ptrdiff_t>()); 176 CALL_SUBTEST_1(assertionTest<std::complex<double>>()); 177 178 CALL_SUBTEST_2(constructorTest<unsigned char>()); 179 CALL_SUBTEST_2(constructorTest<float>()); 180 CALL_SUBTEST_2(constructorTest<Index>()); 181 CALL_SUBTEST_2(constructorTest<int>()); 182 CALL_SUBTEST_2(constructorTest<long int>()); 183 CALL_SUBTEST_2(constructorTest<std::ptrdiff_t>()); 184 CALL_SUBTEST_2(constructorTest<std::complex<double>>()); 185 }