dense_storage.cpp 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. // This file is part of Eigen, a lightweight C++ template library
  2. // for linear algebra.
  3. //
  4. // Copyright (C) 2013 Hauke Heibel <hauke.heibel@gmail.com>
  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. #include "main.h"
  10. #include "AnnoyingScalar.h"
  11. #include "SafeScalar.h"
  12. #include <Eigen/Core>
  13. #if EIGEN_HAS_TYPE_TRAITS && EIGEN_HAS_CXX11
  14. using DenseStorageD3x3 = Eigen::DenseStorage<double, 3, 3, 3, 3>;
  15. static_assert(std::is_trivially_move_constructible<DenseStorageD3x3>::value, "DenseStorage not trivially_move_constructible");
  16. static_assert(std::is_trivially_move_assignable<DenseStorageD3x3>::value, "DenseStorage not trivially_move_assignable");
  17. #if !defined(EIGEN_DENSE_STORAGE_CTOR_PLUGIN)
  18. static_assert(std::is_trivially_copy_constructible<DenseStorageD3x3>::value, "DenseStorage not trivially_copy_constructible");
  19. static_assert(std::is_trivially_copy_assignable<DenseStorageD3x3>::value, "DenseStorage not trivially_copy_assignable");
  20. static_assert(std::is_trivially_copyable<DenseStorageD3x3>::value, "DenseStorage not trivially_copyable");
  21. #endif
  22. #endif
  23. template <typename T, int Size, int Rows, int Cols>
  24. void dense_storage_copy(int rows, int cols)
  25. {
  26. typedef DenseStorage<T, Size, Rows, Cols, 0> DenseStorageType;
  27. const int size = rows*cols;
  28. DenseStorageType reference(size, rows, cols);
  29. T* raw_reference = reference.data();
  30. for (int i=0; i<size; ++i)
  31. raw_reference[i] = static_cast<T>(i);
  32. DenseStorageType copied_reference(reference);
  33. const T* raw_copied_reference = copied_reference.data();
  34. for (int i=0; i<size; ++i)
  35. VERIFY_IS_EQUAL(raw_reference[i], raw_copied_reference[i]);
  36. }
  37. template <typename T, int Size, int Rows, int Cols>
  38. void dense_storage_assignment(int rows, int cols)
  39. {
  40. typedef DenseStorage<T, Size, Rows, Cols, 0> DenseStorageType;
  41. const int size = rows*cols;
  42. DenseStorageType reference(size, rows, cols);
  43. T* raw_reference = reference.data();
  44. for (int i=0; i<size; ++i)
  45. raw_reference[i] = static_cast<T>(i);
  46. DenseStorageType copied_reference;
  47. copied_reference = reference;
  48. const T* raw_copied_reference = copied_reference.data();
  49. for (int i=0; i<size; ++i)
  50. VERIFY_IS_EQUAL(raw_reference[i], raw_copied_reference[i]);
  51. }
  52. template <typename T, int Size, int Rows, int Cols>
  53. void dense_storage_swap(int rows0, int cols0, int rows1, int cols1)
  54. {
  55. typedef DenseStorage<T, Size, Rows, Cols, 0> DenseStorageType;
  56. const int size0 = rows0*cols0;
  57. DenseStorageType a(size0, rows0, cols0);
  58. for (int i=0; i<size0; ++i) {
  59. a.data()[i] = static_cast<T>(i);
  60. }
  61. const int size1 = rows1*cols1;
  62. DenseStorageType b(size1, rows1, cols1);
  63. for (int i=0; i<size1; ++i) {
  64. b.data()[i] = static_cast<T>(-i);
  65. }
  66. a.swap(b);
  67. for (int i=0; i<size0; ++i) {
  68. VERIFY_IS_EQUAL(b.data()[i], static_cast<T>(i));
  69. }
  70. for (int i=0; i<size1; ++i) {
  71. VERIFY_IS_EQUAL(a.data()[i], static_cast<T>(-i));
  72. }
  73. }
  74. template<typename T, int Size, std::size_t Alignment>
  75. void dense_storage_alignment()
  76. {
  77. #if EIGEN_HAS_ALIGNAS
  78. struct alignas(Alignment) Empty1 {};
  79. VERIFY_IS_EQUAL(std::alignment_of<Empty1>::value, Alignment);
  80. struct EIGEN_ALIGN_TO_BOUNDARY(Alignment) Empty2 {};
  81. VERIFY_IS_EQUAL(std::alignment_of<Empty2>::value, Alignment);
  82. struct Nested1 { EIGEN_ALIGN_TO_BOUNDARY(Alignment) T data[Size]; };
  83. VERIFY_IS_EQUAL(std::alignment_of<Nested1>::value, Alignment);
  84. VERIFY_IS_EQUAL( (std::alignment_of<internal::plain_array<T,Size,AutoAlign,Alignment> >::value), Alignment);
  85. const std::size_t default_alignment = internal::compute_default_alignment<T,Size>::value;
  86. VERIFY_IS_EQUAL( (std::alignment_of<DenseStorage<T,Size,1,1,AutoAlign> >::value), default_alignment);
  87. VERIFY_IS_EQUAL( (std::alignment_of<Matrix<T,Size,1,AutoAlign> >::value), default_alignment);
  88. struct Nested2 { Matrix<T,Size,1,AutoAlign> mat; };
  89. VERIFY_IS_EQUAL(std::alignment_of<Nested2>::value, default_alignment);
  90. #endif
  91. }
  92. template<typename T>
  93. void dense_storage_tests() {
  94. // Dynamic Storage.
  95. dense_storage_copy<T,Dynamic,Dynamic,Dynamic>(4, 3);
  96. dense_storage_copy<T,Dynamic,Dynamic,3>(4, 3);
  97. dense_storage_copy<T,Dynamic,4,Dynamic>(4, 3);
  98. // Fixed Storage.
  99. dense_storage_copy<T,12,4,3>(4, 3);
  100. dense_storage_copy<T,12,Dynamic,Dynamic>(4, 3);
  101. dense_storage_copy<T,12,4,Dynamic>(4, 3);
  102. dense_storage_copy<T,12,Dynamic,3>(4, 3);
  103. // Fixed Storage with Uninitialized Elements.
  104. dense_storage_copy<T,18,Dynamic,Dynamic>(4, 3);
  105. dense_storage_copy<T,18,4,Dynamic>(4, 3);
  106. dense_storage_copy<T,18,Dynamic,3>(4, 3);
  107. // Dynamic Storage.
  108. dense_storage_assignment<T,Dynamic,Dynamic,Dynamic>(4, 3);
  109. dense_storage_assignment<T,Dynamic,Dynamic,3>(4, 3);
  110. dense_storage_assignment<T,Dynamic,4,Dynamic>(4, 3);
  111. // Fixed Storage.
  112. dense_storage_assignment<T,12,4,3>(4, 3);
  113. dense_storage_assignment<T,12,Dynamic,Dynamic>(4, 3);
  114. dense_storage_assignment<T,12,4,Dynamic>(4, 3);
  115. dense_storage_assignment<T,12,Dynamic,3>(4, 3);
  116. // Fixed Storage with Uninitialized Elements.
  117. dense_storage_assignment<T,18,Dynamic,Dynamic>(4, 3);
  118. dense_storage_assignment<T,18,4,Dynamic>(4, 3);
  119. dense_storage_assignment<T,18,Dynamic,3>(4, 3);
  120. // Dynamic Storage.
  121. dense_storage_swap<T,Dynamic,Dynamic,Dynamic>(4, 3, 4, 3);
  122. dense_storage_swap<T,Dynamic,Dynamic,Dynamic>(4, 3, 2, 1);
  123. dense_storage_swap<T,Dynamic,Dynamic,Dynamic>(2, 1, 4, 3);
  124. dense_storage_swap<T,Dynamic,Dynamic,3>(4, 3, 4, 3);
  125. dense_storage_swap<T,Dynamic,Dynamic,3>(4, 3, 2, 3);
  126. dense_storage_swap<T,Dynamic,Dynamic,3>(2, 3, 4, 3);
  127. dense_storage_swap<T,Dynamic,4,Dynamic>(4, 3, 4, 3);
  128. dense_storage_swap<T,Dynamic,4,Dynamic>(4, 3, 4, 1);
  129. dense_storage_swap<T,Dynamic,4,Dynamic>(4, 1, 4, 3);
  130. // Fixed Storage.
  131. dense_storage_swap<T,12,4,3>(4, 3, 4, 3);
  132. dense_storage_swap<T,12,Dynamic,Dynamic>(4, 3, 4, 3);
  133. dense_storage_swap<T,12,Dynamic,Dynamic>(4, 3, 2, 1);
  134. dense_storage_swap<T,12,Dynamic,Dynamic>(2, 1, 4, 3);
  135. dense_storage_swap<T,12,4,Dynamic>(4, 3, 4, 3);
  136. dense_storage_swap<T,12,4,Dynamic>(4, 3, 4, 1);
  137. dense_storage_swap<T,12,4,Dynamic>(4, 1, 4, 3);
  138. dense_storage_swap<T,12,Dynamic,3>(4, 3, 4, 3);
  139. dense_storage_swap<T,12,Dynamic,3>(4, 3, 2, 3);
  140. dense_storage_swap<T,12,Dynamic,3>(2, 3, 4, 3);
  141. // Fixed Storage with Uninitialized Elements.
  142. dense_storage_swap<T,18,Dynamic,Dynamic>(4, 3, 4, 3);
  143. dense_storage_swap<T,18,Dynamic,Dynamic>(4, 3, 2, 1);
  144. dense_storage_swap<T,18,Dynamic,Dynamic>(2, 1, 4, 3);
  145. dense_storage_swap<T,18,4,Dynamic>(4, 3, 4, 3);
  146. dense_storage_swap<T,18,4,Dynamic>(4, 3, 4, 1);
  147. dense_storage_swap<T,18,4,Dynamic>(4, 1, 4, 3);
  148. dense_storage_swap<T,18,Dynamic,3>(4, 3, 4, 3);
  149. dense_storage_swap<T,18,Dynamic,3>(4, 3, 2, 3);
  150. dense_storage_swap<T,18,Dynamic,3>(2, 3, 4, 3);
  151. dense_storage_alignment<T,16,8>();
  152. dense_storage_alignment<T,16,16>();
  153. dense_storage_alignment<T,16,32>();
  154. dense_storage_alignment<T,16,64>();
  155. }
  156. EIGEN_DECLARE_TEST(dense_storage)
  157. {
  158. dense_storage_tests<int>();
  159. dense_storage_tests<float>();
  160. dense_storage_tests<SafeScalar<float> >();
  161. dense_storage_tests<AnnoyingScalar>();
  162. }