diagonal_matrix_variadic_ctor.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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. #define EIGEN_NO_STATIC_ASSERT
  10. #include "main.h"
  11. template <typename Scalar>
  12. void assertionTest()
  13. {
  14. typedef DiagonalMatrix<Scalar, 5> DiagMatrix5;
  15. typedef DiagonalMatrix<Scalar, 7> DiagMatrix7;
  16. typedef DiagonalMatrix<Scalar, Dynamic> DiagMatrixX;
  17. Scalar raw[6];
  18. for (int i = 0; i < 6; ++i) {
  19. raw[i] = internal::random<Scalar>();
  20. }
  21. VERIFY_RAISES_ASSERT((DiagMatrix5{raw[0], raw[1], raw[2], raw[3]}));
  22. VERIFY_RAISES_ASSERT((DiagMatrix5{raw[0], raw[1], raw[3]}));
  23. VERIFY_RAISES_ASSERT((DiagMatrix7{raw[0], raw[1], raw[2], raw[3]}));
  24. VERIFY_RAISES_ASSERT((DiagMatrixX {
  25. {raw[0], raw[1], raw[2]},
  26. {raw[3], raw[4], raw[5]}
  27. }));
  28. }
  29. #define VERIFY_IMPLICIT_CONVERSION_3(DIAGTYPE, V0, V1, V2) \
  30. DIAGTYPE d(V0, V1, V2); \
  31. DIAGTYPE::DenseMatrixType Dense = d.toDenseMatrix(); \
  32. VERIFY_IS_APPROX(Dense(0, 0), (Scalar)V0); \
  33. VERIFY_IS_APPROX(Dense(1, 1), (Scalar)V1); \
  34. VERIFY_IS_APPROX(Dense(2, 2), (Scalar)V2);
  35. #define VERIFY_IMPLICIT_CONVERSION_4(DIAGTYPE, V0, V1, V2, V3) \
  36. DIAGTYPE d(V0, V1, V2, V3); \
  37. DIAGTYPE::DenseMatrixType Dense = d.toDenseMatrix(); \
  38. VERIFY_IS_APPROX(Dense(0, 0), (Scalar)V0); \
  39. VERIFY_IS_APPROX(Dense(1, 1), (Scalar)V1); \
  40. VERIFY_IS_APPROX(Dense(2, 2), (Scalar)V2); \
  41. VERIFY_IS_APPROX(Dense(3, 3), (Scalar)V3);
  42. #define VERIFY_IMPLICIT_CONVERSION_5(DIAGTYPE, V0, V1, V2, V3, V4) \
  43. DIAGTYPE d(V0, V1, V2, V3, V4); \
  44. DIAGTYPE::DenseMatrixType Dense = d.toDenseMatrix(); \
  45. VERIFY_IS_APPROX(Dense(0, 0), (Scalar)V0); \
  46. VERIFY_IS_APPROX(Dense(1, 1), (Scalar)V1); \
  47. VERIFY_IS_APPROX(Dense(2, 2), (Scalar)V2); \
  48. VERIFY_IS_APPROX(Dense(3, 3), (Scalar)V3); \
  49. VERIFY_IS_APPROX(Dense(4, 4), (Scalar)V4);
  50. template<typename Scalar>
  51. void constructorTest()
  52. {
  53. typedef DiagonalMatrix<Scalar, 0> DiagonalMatrix0;
  54. typedef DiagonalMatrix<Scalar, 3> DiagonalMatrix3;
  55. typedef DiagonalMatrix<Scalar, 4> DiagonalMatrix4;
  56. typedef DiagonalMatrix<Scalar, Dynamic> DiagonalMatrixX;
  57. Scalar raw[7];
  58. for (int k = 0; k < 7; ++k) raw[k] = internal::random<Scalar>();
  59. // Fixed-sized matrices
  60. {
  61. DiagonalMatrix0 a {{}};
  62. VERIFY(a.rows() == 0);
  63. VERIFY(a.cols() == 0);
  64. typename DiagonalMatrix0::DenseMatrixType m = a.toDenseMatrix();
  65. for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
  66. }
  67. {
  68. DiagonalMatrix3 a {{raw[0], raw[1], raw[2]}};
  69. VERIFY(a.rows() == 3);
  70. VERIFY(a.cols() == 3);
  71. typename DiagonalMatrix3::DenseMatrixType m = a.toDenseMatrix();
  72. for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
  73. }
  74. {
  75. DiagonalMatrix4 a {{raw[0], raw[1], raw[2], raw[3]}};
  76. VERIFY(a.rows() == 4);
  77. VERIFY(a.cols() == 4);
  78. typename DiagonalMatrix4::DenseMatrixType m = a.toDenseMatrix();
  79. for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
  80. }
  81. // dynamically sized matrices
  82. {
  83. DiagonalMatrixX a{{}};
  84. VERIFY(a.rows() == 0);
  85. VERIFY(a.rows() == 0);
  86. typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix();
  87. for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
  88. }
  89. {
  90. DiagonalMatrixX a{{raw[0], raw[1], raw[2], raw[3], raw[4], raw[5], raw[6]}};
  91. VERIFY(a.rows() == 7);
  92. VERIFY(a.rows() == 7);
  93. typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix();
  94. for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
  95. }
  96. }
  97. template<>
  98. void constructorTest<float>()
  99. {
  100. typedef float Scalar;
  101. typedef DiagonalMatrix<Scalar, 0> DiagonalMatrix0;
  102. typedef DiagonalMatrix<Scalar, 3> DiagonalMatrix3;
  103. typedef DiagonalMatrix<Scalar, 4> DiagonalMatrix4;
  104. typedef DiagonalMatrix<Scalar, 5> DiagonalMatrix5;
  105. typedef DiagonalMatrix<Scalar, Dynamic> DiagonalMatrixX;
  106. Scalar raw[7];
  107. for (int k = 0; k < 7; ++k) raw[k] = internal::random<Scalar>();
  108. // Fixed-sized matrices
  109. {
  110. DiagonalMatrix0 a {{}};
  111. VERIFY(a.rows() == 0);
  112. VERIFY(a.cols() == 0);
  113. typename DiagonalMatrix0::DenseMatrixType m = a.toDenseMatrix();
  114. for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
  115. }
  116. {
  117. DiagonalMatrix3 a {{raw[0], raw[1], raw[2]}};
  118. VERIFY(a.rows() == 3);
  119. VERIFY(a.cols() == 3);
  120. typename DiagonalMatrix3::DenseMatrixType m = a.toDenseMatrix();
  121. for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
  122. }
  123. {
  124. DiagonalMatrix4 a {{raw[0], raw[1], raw[2], raw[3]}};
  125. VERIFY(a.rows() == 4);
  126. VERIFY(a.cols() == 4);
  127. typename DiagonalMatrix4::DenseMatrixType m = a.toDenseMatrix();
  128. for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
  129. }
  130. // dynamically sized matrices
  131. {
  132. DiagonalMatrixX a{{}};
  133. VERIFY(a.rows() == 0);
  134. VERIFY(a.rows() == 0);
  135. typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix();
  136. for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
  137. }
  138. {
  139. DiagonalMatrixX a{{raw[0], raw[1], raw[2], raw[3], raw[4], raw[5], raw[6]}};
  140. VERIFY(a.rows() == 7);
  141. VERIFY(a.rows() == 7);
  142. typename DiagonalMatrixX::DenseMatrixType m = a.toDenseMatrix();
  143. for (Index k = 0; k < a.rows(); ++k) VERIFY(m(k, k) == raw[k]);
  144. }
  145. { VERIFY_IMPLICIT_CONVERSION_3(DiagonalMatrix3, 1.2647, 2.56f, -3); }
  146. { VERIFY_IMPLICIT_CONVERSION_4(DiagonalMatrix4, 1.2647, 2.56f, -3, 3.23f); }
  147. { VERIFY_IMPLICIT_CONVERSION_5(DiagonalMatrix5, 1.2647, 2.56f, -3, 3.23f, 2); }
  148. }
  149. EIGEN_DECLARE_TEST(diagonal_matrix_variadic_ctor)
  150. {
  151. CALL_SUBTEST_1(assertionTest<unsigned char>());
  152. CALL_SUBTEST_1(assertionTest<float>());
  153. CALL_SUBTEST_1(assertionTest<Index>());
  154. CALL_SUBTEST_1(assertionTest<int>());
  155. CALL_SUBTEST_1(assertionTest<long int>());
  156. CALL_SUBTEST_1(assertionTest<std::ptrdiff_t>());
  157. CALL_SUBTEST_1(assertionTest<std::complex<double>>());
  158. CALL_SUBTEST_2(constructorTest<unsigned char>());
  159. CALL_SUBTEST_2(constructorTest<float>());
  160. CALL_SUBTEST_2(constructorTest<Index>());
  161. CALL_SUBTEST_2(constructorTest<int>());
  162. CALL_SUBTEST_2(constructorTest<long int>());
  163. CALL_SUBTEST_2(constructorTest<std::ptrdiff_t>());
  164. CALL_SUBTEST_2(constructorTest<std::complex<double>>());
  165. }