mat_traits_array_test.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. //Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc.
  2. //Distributed under the Boost Software License, Version 1.0. (See accompanying
  3. //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  4. #include <boost/qvm/mat_traits_array.hpp>
  5. #include <boost/qvm/mat_operations.hpp>
  6. #include <boost/detail/lightweight_test.hpp>
  7. template <class T,class U>
  8. struct same_type;
  9. template <class T>
  10. struct
  11. same_type<T,T>
  12. {
  13. };
  14. template <class T,class P>
  15. void
  16. test_ref_cast( T & v, P * ptr )
  17. {
  18. using namespace boost::qvm;
  19. BOOST_QVM_STATIC_ASSERT(is_mat<T>::value);
  20. BOOST_QVM_STATIC_ASSERT(mat_traits<T>::rows==3);
  21. BOOST_QVM_STATIC_ASSERT(mat_traits<T>::cols==2);
  22. BOOST_TEST((mat_traits<T>::template read_element<0,0>(v)==ptr[0*2+0]));
  23. BOOST_TEST((mat_traits<T>::template read_element<0,1>(v)==ptr[0*2+1]));
  24. BOOST_TEST((mat_traits<T>::template read_element<1,0>(v)==ptr[1*2+0]));
  25. BOOST_TEST((mat_traits<T>::template read_element<1,1>(v)==ptr[1*2+1]));
  26. BOOST_TEST((mat_traits<T>::template read_element<2,0>(v)==ptr[2*2+0]));
  27. BOOST_TEST((mat_traits<T>::template read_element<2,1>(v)==ptr[2*2+1]));
  28. BOOST_TEST((&mat_traits<T>::template write_element<0,0>(v)==&ptr[0*2+0]));
  29. BOOST_TEST((&mat_traits<T>::template write_element<0,1>(v)==&ptr[0*2+1]));
  30. BOOST_TEST((&mat_traits<T>::template write_element<1,0>(v)==&ptr[1*2+0]));
  31. BOOST_TEST((&mat_traits<T>::template write_element<1,1>(v)==&ptr[1*2+1]));
  32. BOOST_TEST((&mat_traits<T>::template write_element<2,0>(v)==&ptr[2*2+0]));
  33. BOOST_TEST((&mat_traits<T>::template write_element<2,1>(v)==&ptr[2*2+1]));
  34. BOOST_TEST(&v[0][0]==&ptr[0*2+0]);
  35. BOOST_TEST(&v[0][1]==&ptr[0*2+1]);
  36. BOOST_TEST(&v[1][0]==&ptr[1*2+0]);
  37. BOOST_TEST(&v[1][1]==&ptr[1*2+1]);
  38. BOOST_TEST(&v[2][0]==&ptr[2*2+0]);
  39. BOOST_TEST(&v[2][1]==&ptr[2*2+1]);
  40. }
  41. int
  42. main()
  43. {
  44. using namespace boost::qvm;
  45. {
  46. BOOST_QVM_STATIC_ASSERT(!is_mat<int[3]>::value);
  47. BOOST_QVM_STATIC_ASSERT(!is_mat<int[3][3][3]>::value);
  48. BOOST_QVM_STATIC_ASSERT(is_mat<int[3][4]>::value);
  49. BOOST_QVM_STATIC_ASSERT(mat_traits<int[3][4]>::rows==3);
  50. BOOST_QVM_STATIC_ASSERT(mat_traits<int[3][4]>::cols==4);
  51. same_type<mat_traits<int[3][4]>::scalar_type,int>();
  52. same_type< mat<int,3,3>, deduce_mat<int[3][3]>::type >();
  53. same_type< mat<int,3,3>, deduce_mat<int const[3][3]>::type >();
  54. int arr[3][3] = {{00,01,02},{10,11,12},{20,21,22}};
  55. BOOST_TEST((mat_traits<int[3][3]>::read_element<0,0>(arr)==00));
  56. BOOST_TEST((mat_traits<int[3][3]>::read_element<0,1>(arr)==01));
  57. BOOST_TEST((mat_traits<int[3][3]>::read_element<0,2>(arr)==02));
  58. BOOST_TEST((mat_traits<int[3][3]>::read_element<1,0>(arr)==10));
  59. BOOST_TEST((mat_traits<int[3][3]>::read_element<1,1>(arr)==11));
  60. BOOST_TEST((mat_traits<int[3][3]>::read_element<1,2>(arr)==12));
  61. BOOST_TEST((mat_traits<int[3][3]>::read_element<2,0>(arr)==20));
  62. BOOST_TEST((mat_traits<int[3][3]>::read_element<2,1>(arr)==21));
  63. BOOST_TEST((mat_traits<int[3][3]>::read_element<2,2>(arr)==22));
  64. BOOST_TEST((mat_traits<int const[3][3]>::read_element<0,0>(arr)==00));
  65. BOOST_TEST((mat_traits<int const[3][3]>::read_element<0,1>(arr)==01));
  66. BOOST_TEST((mat_traits<int const[3][3]>::read_element<0,2>(arr)==02));
  67. BOOST_TEST((mat_traits<int const[3][3]>::read_element<1,0>(arr)==10));
  68. BOOST_TEST((mat_traits<int const[3][3]>::read_element<1,1>(arr)==11));
  69. BOOST_TEST((mat_traits<int const[3][3]>::read_element<1,2>(arr)==12));
  70. BOOST_TEST((mat_traits<int const[3][3]>::read_element<2,0>(arr)==20));
  71. BOOST_TEST((mat_traits<int const[3][3]>::read_element<2,1>(arr)==21));
  72. BOOST_TEST((mat_traits<int const[3][3]>::read_element<2,2>(arr)==22));
  73. BOOST_TEST((mat_traits<int[3][3]>::read_element_idx(0,0,arr)==00));
  74. BOOST_TEST((mat_traits<int[3][3]>::read_element_idx(0,1,arr)==01));
  75. BOOST_TEST((mat_traits<int[3][3]>::read_element_idx(0,2,arr)==02));
  76. BOOST_TEST((mat_traits<int[3][3]>::read_element_idx(1,0,arr)==10));
  77. BOOST_TEST((mat_traits<int[3][3]>::read_element_idx(1,1,arr)==11));
  78. BOOST_TEST((mat_traits<int[3][3]>::read_element_idx(1,2,arr)==12));
  79. BOOST_TEST((mat_traits<int[3][3]>::read_element_idx(2,0,arr)==20));
  80. BOOST_TEST((mat_traits<int[3][3]>::read_element_idx(2,1,arr)==21));
  81. BOOST_TEST((mat_traits<int[3][3]>::read_element_idx(2,2,arr)==22));
  82. BOOST_TEST((mat_traits<int const[3][3]>::read_element_idx(0,0,arr)==00));
  83. BOOST_TEST((mat_traits<int const[3][3]>::read_element_idx(0,1,arr)==01));
  84. BOOST_TEST((mat_traits<int const[3][3]>::read_element_idx(0,2,arr)==02));
  85. BOOST_TEST((mat_traits<int const[3][3]>::read_element_idx(1,0,arr)==10));
  86. BOOST_TEST((mat_traits<int const[3][3]>::read_element_idx(1,1,arr)==11));
  87. BOOST_TEST((mat_traits<int const[3][3]>::read_element_idx(1,2,arr)==12));
  88. BOOST_TEST((mat_traits<int const[3][3]>::read_element_idx(2,0,arr)==20));
  89. BOOST_TEST((mat_traits<int const[3][3]>::read_element_idx(2,1,arr)==21));
  90. BOOST_TEST((mat_traits<int const[3][3]>::read_element_idx(2,2,arr)==22));
  91. BOOST_TEST((&mat_traits<int[3][3]>::write_element<0,0>(arr)==&arr[0][0]));
  92. BOOST_TEST((&mat_traits<int[3][3]>::write_element<0,1>(arr)==&arr[0][1]));
  93. BOOST_TEST((&mat_traits<int[3][3]>::write_element<0,2>(arr)==&arr[0][2]));
  94. BOOST_TEST((&mat_traits<int[3][3]>::write_element<1,0>(arr)==&arr[1][0]));
  95. BOOST_TEST((&mat_traits<int[3][3]>::write_element<1,1>(arr)==&arr[1][1]));
  96. BOOST_TEST((&mat_traits<int[3][3]>::write_element<1,2>(arr)==&arr[1][2]));
  97. BOOST_TEST((&mat_traits<int[3][3]>::write_element<2,0>(arr)==&arr[2][0]));
  98. BOOST_TEST((&mat_traits<int[3][3]>::write_element<2,1>(arr)==&arr[2][1]));
  99. BOOST_TEST((&mat_traits<int[3][3]>::write_element<2,2>(arr)==&arr[2][2]));
  100. BOOST_TEST((&mat_traits<int[3][3]>::write_element_idx(0,0,arr)==&arr[0][0]));
  101. BOOST_TEST((&mat_traits<int[3][3]>::write_element_idx(0,1,arr)==&arr[0][1]));
  102. BOOST_TEST((&mat_traits<int[3][3]>::write_element_idx(0,2,arr)==&arr[0][2]));
  103. BOOST_TEST((&mat_traits<int[3][3]>::write_element_idx(1,0,arr)==&arr[1][0]));
  104. BOOST_TEST((&mat_traits<int[3][3]>::write_element_idx(1,1,arr)==&arr[1][1]));
  105. BOOST_TEST((&mat_traits<int[3][3]>::write_element_idx(1,2,arr)==&arr[1][2]));
  106. BOOST_TEST((&mat_traits<int[3][3]>::write_element_idx(2,0,arr)==&arr[2][0]));
  107. BOOST_TEST((&mat_traits<int[3][3]>::write_element_idx(2,1,arr)==&arr[2][1]));
  108. BOOST_TEST((&mat_traits<int[3][3]>::write_element_idx(2,2,arr)==&arr[2][2]));
  109. }
  110. {
  111. int arr[42] = {0};
  112. int * ptr=arr+5;
  113. ptr[0*2+0]=42;
  114. ptr[0*2+1]=43;
  115. ptr[1*2+0]=44;
  116. ptr[1*2+1]=45;
  117. ptr[2*2+0]=46;
  118. ptr[2*2+1]=47;
  119. test_ref_cast(ptr_mref<3,2>(ptr),ptr);
  120. int m[3][2] = {{1,1},{1,1},{1,1}};
  121. ptr_mref<3,2>(ptr) += mref(m);
  122. BOOST_TEST(ptr[0*2+0]=43);
  123. BOOST_TEST(ptr[0*2+1]=44);
  124. BOOST_TEST(ptr[1*2+0]=45);
  125. BOOST_TEST(ptr[1*2+1]=46);
  126. BOOST_TEST(ptr[2*2+0]=47);
  127. BOOST_TEST(ptr[2*2+1]=48);
  128. }
  129. return boost::report_errors();
  130. }