vectorx.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. #define BOOST_TEST_DYN_LINK
  2. #include <boost/test/unit_test.hpp>
  3. #include "core/global_io_context.hpp"
  4. #include "core/types/vectorx.hpp"
  5. using namespace sophiar;
  6. void test_vectorx_view_func_1(vectorx_view<double *, 2> data) {}
  7. void test_vectorx_view_func_2(vectorx_view<const double *, 2> data) {}
  8. BOOST_AUTO_TEST_CASE(test_vectorx) {
  9. auto test_a = vector3d({3, 2, 1});
  10. BOOST_TEST(test_a[0] == 3);
  11. BOOST_TEST(test_a[1] == 2);
  12. BOOST_TEST(test_a[2] == 1);
  13. BOOST_TEST(test_a.at<0>() == 3);
  14. BOOST_TEST(test_a.at<1>() == 2);
  15. BOOST_TEST(test_a.at<2>() == 1);
  16. test_a = {4, 5, 6};
  17. BOOST_TEST(test_a[0] == 4);
  18. BOOST_TEST(test_a[1] == 5);
  19. BOOST_TEST(test_a[2] == 6);
  20. BOOST_TEST(test_a.length() == sizeof(double) * 3);
  21. auto view_a = test_a.get_view<0, 2>();
  22. BOOST_TEST(view_a[0] == 4);
  23. BOOST_TEST(view_a[1] == 5);
  24. BOOST_TEST(view_a.at<0>() == 4);
  25. BOOST_TEST(view_a.at<1>() == 5);
  26. auto view_b = test_a.get_view<1, 3>();
  27. BOOST_TEST(view_b[0] == 5);
  28. BOOST_TEST(view_b[1] == 6);
  29. BOOST_TEST(view_b.at<0>() == 5);
  30. BOOST_TEST(view_b.at<1>() == 6);
  31. view_b.at<1>() = 7;
  32. BOOST_TEST(test_a.at<2>() == 7);
  33. auto test_b = view_b.to_vectorx();
  34. static_assert(std::is_same_v<decltype(test_b), vectorx<double, 2>>);
  35. test_b.at<1>() = 8;
  36. BOOST_TEST(view_b.at<1>() == 7);
  37. const vector3d &const_test_a = test_a;
  38. auto view_c = const_test_a.get_view<0, 2>();
  39. BOOST_TEST(view_c[0] == 4);
  40. BOOST_TEST(view_c[1] == 5);
  41. BOOST_TEST(view_c.at<0>() == 4);
  42. BOOST_TEST(view_c.at<1>() == 5);
  43. auto test_c = view_c.to_vectorx();
  44. static_assert(std::is_same_v<decltype(test_c), vectorx<double, 2>>);
  45. test_c.at<1>() = 6;
  46. BOOST_TEST(view_c.at<1>() == 5);
  47. auto test_c_obj = view_c.to_vectorx_obj<high_freq_tag>();
  48. BOOST_TEST(test_c_obj->at<0>() == 4);
  49. BOOST_TEST(test_c_obj->at<1>() == 5);
  50. test_c.at<1>() = 7;
  51. BOOST_TEST(test_c_obj->at<0>() == 4);
  52. BOOST_TEST(test_c_obj->at<1>() == 5);
  53. const auto &test_d = test_c;
  54. test_vectorx_view_func_1(view_b);
  55. // test_vectorx_view_func_1(view_c);
  56. test_vectorx_view_func_2(view_b);
  57. test_vectorx_view_func_2(view_c);
  58. test_vectorx_view_func_1(test_c);
  59. // test_vectorx_view_func_1(test_d);
  60. test_vectorx_view_func_2(test_c);
  61. test_vectorx_view_func_2(test_d);
  62. test_vectorx_view_func_1(test_c.get_view());
  63. // test_vectorx_view_func_1(test_d.get_view());
  64. test_vectorx_view_func_2(test_c.get_view());
  65. test_vectorx_view_func_2(test_d.get_view());
  66. test_a = {1, 2, 3};
  67. auto eigen_column = test_a.get_view().as_eigen_column_view();
  68. BOOST_TEST(eigen_column(0) == 1);
  69. BOOST_TEST(eigen_column(1) == 2);
  70. BOOST_TEST(eigen_column(2) == 3);
  71. auto transposed = eigen_column.transpose();
  72. transposed(1) = 3; // will affect origin
  73. BOOST_TEST(eigen_column(1) == 3);
  74. BOOST_TEST(test_a.at<1>() == 3);
  75. Eigen::Vector3d real_vector = eigen_column;
  76. real_vector(0) = 2; // will not affect origin
  77. BOOST_TEST(eigen_column(0) == 1);
  78. BOOST_TEST(test_a.at<0>() == 1);
  79. auto eigen_const_column = test_a.get_view().as_eigen_const_column_view();
  80. test_a = {1, 2, 3};
  81. BOOST_TEST(eigen_const_column(0) == 1);
  82. BOOST_TEST(eigen_const_column(1) == 2);
  83. BOOST_TEST(eigen_const_column(2) == 3);
  84. Eigen::Vector3d real_vector_2 = eigen_const_column;
  85. real_vector(0) = 2; // will not affect origin
  86. BOOST_TEST(eigen_const_column(0) == 1);
  87. BOOST_TEST(test_a.at<0>() == 1);
  88. test_a.get_view().fill({10}).fill({11}).fill({12});
  89. BOOST_TEST(test_a[0] == 10);
  90. BOOST_TEST(test_a[1] == 11);
  91. BOOST_TEST(test_a[2] == 12);
  92. test_a.get_view().fill({13, 14}).fill({15});
  93. BOOST_TEST(test_a[0] == 13);
  94. BOOST_TEST(test_a[1] == 14);
  95. BOOST_TEST(test_a[2] == 15);
  96. auto test_e = vectorx<double, 1>({16});
  97. auto test_f = vectorx<double, 2>({17, 18});
  98. test_a.get_view().fill(test_e).fill(test_f);
  99. BOOST_TEST(test_a[0] == 16);
  100. BOOST_TEST(test_a[1] == 17);
  101. BOOST_TEST(test_a[2] == 18);
  102. test_a = {1, 2, 3};
  103. test_a.get_view().fill(test_e.get_view()).fill(test_f.get_view());
  104. BOOST_TEST(test_a[0] == 16);
  105. BOOST_TEST(test_a[1] == 17);
  106. BOOST_TEST(test_a[2] == 18);
  107. auto eigen_vec3 = Eigen::Vector3d(20, 21, 22);
  108. test_a = eigen_vec3;
  109. BOOST_TEST(test_a[0] == 20);
  110. BOOST_TEST(test_a[1] == 21);
  111. BOOST_TEST(test_a[2] == 22);
  112. test_a = {1, 2, 3};
  113. test_a.get_view().fill(eigen_vec3);
  114. BOOST_TEST(test_a[0] == 20);
  115. BOOST_TEST(test_a[1] == 21);
  116. BOOST_TEST(test_a[2] == 22);
  117. }