|  | // This file is part of Eigen, a lightweight C++ template library | 
|  | // for linear algebra. | 
|  | // | 
|  | // Copyright (C) 2019 David Tellenbach <david.tellenbach@tellnotes.org> | 
|  | // | 
|  | // 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" | 
|  |  | 
|  | #define VERIFY_IMPLICIT_CONVERSION_3(DIAGTYPE, V0, V1, V2) \ | 
|  | DIAGTYPE d(V0, V1, V2);                                  \ | 
|  | DIAGTYPE::DenseMatrixType Dense = d.toDenseMatrix();     \ | 
|  | VERIFY_IS_APPROX(Dense(0, 0), (Scalar)V0);               \ | 
|  | VERIFY_IS_APPROX(Dense(1, 1), (Scalar)V1);               \ | 
|  | VERIFY_IS_APPROX(Dense(2, 2), (Scalar)V2); | 
|  |  | 
|  | #define VERIFY_IMPLICIT_CONVERSION_4(DIAGTYPE, V0, V1, V2, V3) \ | 
|  | DIAGTYPE d(V0, V1, V2, V3);                                  \ | 
|  | DIAGTYPE::DenseMatrixType Dense = d.toDenseMatrix();         \ | 
|  | VERIFY_IS_APPROX(Dense(0, 0), (Scalar)V0);                   \ | 
|  | VERIFY_IS_APPROX(Dense(1, 1), (Scalar)V1);                   \ | 
|  | VERIFY_IS_APPROX(Dense(2, 2), (Scalar)V2);                   \ | 
|  | VERIFY_IS_APPROX(Dense(3, 3), (Scalar)V3); | 
|  |  | 
|  | #define VERIFY_IMPLICIT_CONVERSION_5(DIAGTYPE, V0, V1, V2, V3, V4) \ | 
|  | DIAGTYPE d(V0, V1, V2, V3, V4);                                  \ | 
|  | DIAGTYPE::DenseMatrixType Dense = d.toDenseMatrix();             \ | 
|  | VERIFY_IS_APPROX(Dense(0, 0), (Scalar)V0);                       \ | 
|  | VERIFY_IS_APPROX(Dense(1, 1), (Scalar)V1);                       \ | 
|  | VERIFY_IS_APPROX(Dense(2, 2), (Scalar)V2);                       \ | 
|  | VERIFY_IS_APPROX(Dense(3, 3), (Scalar)V3);                       \ | 
|  | VERIFY_IS_APPROX(Dense(4, 4), (Scalar)V4); | 
|  |  | 
|  | template<typename Scalar> | 
|  | void constructorTest() | 
|  | { | 
|  | typedef DiagonalMatrix<Scalar, 0> DiagonalMatrix0; | 
|  | typedef DiagonalMatrix<Scalar, 3> DiagonalMatrix3; | 
|  | typedef DiagonalMatrix<Scalar, 4> DiagonalMatrix4; | 
|  | typedef DiagonalMatrix<Scalar, Dynamic> DiagonalMatrixX; | 
|  |  | 
|  | Scalar raw[7]; | 
|  | for (int k = 0; k < 7; ++k) raw[k] = internal::random<Scalar>(); | 
|  |  | 
|  | // Fixed-sized matrices | 
|  | { | 
|  | DiagonalMatrix0 a {{}}; | 
|  | VERIFY(a.rows() == 0); | 
|  | VERIFY(a.cols() == 0); | 
|  | typename DiagonalMatrix0::DenseMatrixType m = a.toDenseMatrix(); | 
|  | for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]); | 
|  | } | 
|  | { | 
|  | DiagonalMatrix3 a {{raw[0], raw[1], raw[2]}}; | 
|  | VERIFY(a.rows() == 3); | 
|  | VERIFY(a.cols() == 3); | 
|  | typename DiagonalMatrix3::DenseMatrixType m = a.toDenseMatrix(); | 
|  | for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]); | 
|  | } | 
|  | { | 
|  | DiagonalMatrix4 a {{raw[0], raw[1], raw[2], raw[3]}}; | 
|  | VERIFY(a.rows() == 4); | 
|  | VERIFY(a.cols() == 4); | 
|  | typename DiagonalMatrix4::DenseMatrixType m = a.toDenseMatrix(); | 
|  | for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]); | 
|  | } | 
|  |  | 
|  | // dynamically sized matrices | 
|  | { | 
|  | DiagonalMatrixX a{{}}; | 
|  | VERIFY(a.rows() == 0); | 
|  | VERIFY(a.rows() == 0); | 
|  | typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix(); | 
|  | for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]); | 
|  | } | 
|  | { | 
|  | DiagonalMatrixX a{{raw[0], raw[1], raw[2], raw[3], raw[4], raw[5], raw[6]}}; | 
|  | VERIFY(a.rows() == 7); | 
|  | VERIFY(a.rows() == 7); | 
|  | typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix(); | 
|  | for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]); | 
|  | } | 
|  | } | 
|  |  | 
|  | template<> | 
|  | void constructorTest<float>() | 
|  | { | 
|  | typedef float Scalar; | 
|  |  | 
|  | typedef DiagonalMatrix<Scalar, 0> DiagonalMatrix0; | 
|  | typedef DiagonalMatrix<Scalar, 3> DiagonalMatrix3; | 
|  | typedef DiagonalMatrix<Scalar, 4> DiagonalMatrix4; | 
|  | typedef DiagonalMatrix<Scalar, 5> DiagonalMatrix5; | 
|  | typedef DiagonalMatrix<Scalar, Dynamic> DiagonalMatrixX; | 
|  |  | 
|  | Scalar raw[7]; | 
|  | for (int k = 0; k < 7; ++k) raw[k] = internal::random<Scalar>(); | 
|  |  | 
|  | // Fixed-sized matrices | 
|  | { | 
|  | DiagonalMatrix0 a {{}}; | 
|  | VERIFY(a.rows() == 0); | 
|  | VERIFY(a.cols() == 0); | 
|  | typename DiagonalMatrix0::DenseMatrixType m = a.toDenseMatrix(); | 
|  | for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]); | 
|  | } | 
|  | { | 
|  | DiagonalMatrix3 a {{raw[0], raw[1], raw[2]}}; | 
|  | VERIFY(a.rows() == 3); | 
|  | VERIFY(a.cols() == 3); | 
|  | typename DiagonalMatrix3::DenseMatrixType m = a.toDenseMatrix(); | 
|  | for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]); | 
|  | } | 
|  | { | 
|  | DiagonalMatrix4 a {{raw[0], raw[1], raw[2], raw[3]}}; | 
|  | VERIFY(a.rows() == 4); | 
|  | VERIFY(a.cols() == 4); | 
|  | typename DiagonalMatrix4::DenseMatrixType m = a.toDenseMatrix(); | 
|  | for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]); | 
|  | } | 
|  |  | 
|  | // dynamically sized matrices | 
|  | { | 
|  | DiagonalMatrixX a{{}}; | 
|  | VERIFY(a.rows() == 0); | 
|  | VERIFY(a.rows() == 0); | 
|  | typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix(); | 
|  | for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]); | 
|  | } | 
|  | { | 
|  | DiagonalMatrixX a{{raw[0], raw[1], raw[2], raw[3], raw[4], raw[5], raw[6]}}; | 
|  | VERIFY(a.rows() == 7); | 
|  | VERIFY(a.rows() == 7); | 
|  | typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix(); | 
|  | for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]); | 
|  | } | 
|  | { VERIFY_IMPLICIT_CONVERSION_3(DiagonalMatrix3, 1.2647, 2.56f, -3); } | 
|  | { VERIFY_IMPLICIT_CONVERSION_4(DiagonalMatrix4, 1.2647, 2.56f, -3, 3.23f); } | 
|  | { VERIFY_IMPLICIT_CONVERSION_5(DiagonalMatrix5, 1.2647, 2.56f, -3, 3.23f, 2); } | 
|  | } | 
|  |  | 
|  | EIGEN_DECLARE_TEST(diagonal_matrix_variadic_ctor) | 
|  | { | 
|  | CALL_SUBTEST_2(constructorTest<unsigned char>()); | 
|  | CALL_SUBTEST_2(constructorTest<float>()); | 
|  | CALL_SUBTEST_2(constructorTest<Index>()); | 
|  | CALL_SUBTEST_2(constructorTest<int>()); | 
|  | CALL_SUBTEST_2(constructorTest<long int>()); | 
|  | CALL_SUBTEST_2(constructorTest<std::ptrdiff_t>()); | 
|  | CALL_SUBTEST_2(constructorTest<std::complex<double>>()); | 
|  | } |