vec_register_test.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. //Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc.
  2. //Copyright (c) 2018 agate-pris
  3. //Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. #include <boost/core/lightweight_test.hpp>
  6. #include <boost/qvm/vec_register.hpp>
  7. struct v2
  8. {
  9. float x;
  10. float y;
  11. };
  12. struct v3 : v2
  13. {
  14. float z;
  15. };
  16. struct v4 : v3
  17. {
  18. float w;
  19. };
  20. struct v2r
  21. {
  22. float xr;
  23. float yr;
  24. };
  25. struct v3r : v2r
  26. {
  27. float zr;
  28. };
  29. struct v4r : v3r
  30. {
  31. float wr;
  32. };
  33. struct v2rw : v2, v2r { };
  34. struct v3rw : v3, v3r { };
  35. struct v4rw : v4, v4r { };
  36. BOOST_QVM_REGISTER_VEC_2(v2, float, x, y)
  37. BOOST_QVM_REGISTER_VEC_3(v3, float, x, y, z)
  38. BOOST_QVM_REGISTER_VEC_4(v4, float, x, y, z, w)
  39. BOOST_QVM_REGISTER_VEC_2_READ(v2r, float, xr, yr)
  40. BOOST_QVM_REGISTER_VEC_3_READ(v3r, float, xr, yr, zr)
  41. BOOST_QVM_REGISTER_VEC_4_READ(v4r, float, xr, yr, zr, wr)
  42. BOOST_QVM_REGISTER_VEC_2_READ_WRITE(v2rw, float, xr, yr, x, y)
  43. BOOST_QVM_REGISTER_VEC_3_READ_WRITE(v3rw, float, xr, yr, zr, x, y, z)
  44. BOOST_QVM_REGISTER_VEC_4_READ_WRITE(v4rw, float, xr, yr, zr, wr, x, y, z, w)
  45. int main()
  46. {
  47. using namespace boost::qvm;
  48. v2 v_v2;
  49. v3 v_v3;
  50. v4 v_v4;
  51. v2r v_v2r;
  52. v3r v_v3r;
  53. v4r v_v4r;
  54. v2rw v_v2rw;
  55. v3rw v_v3rw;
  56. v4rw v_v4rw;
  57. v_v2.x = 41.f;
  58. v_v3.x = 42.f;
  59. v_v4.x = 43.f;
  60. v_v2.y = 44.f;
  61. v_v3.y = 45.f;
  62. v_v4.y = 46.f;
  63. v_v3.z = 47.f;
  64. v_v4.z = 48.f;
  65. v_v4.w = 49.f;
  66. v_v2r.xr = 51.f;
  67. v_v3r.xr = 52.f;
  68. v_v4r.xr = 53.f;
  69. v_v2r.yr = 54.f;
  70. v_v3r.yr = 55.f;
  71. v_v4r.yr = 56.f;
  72. v_v3r.zr = 57.f;
  73. v_v4r.zr = 58.f;
  74. v_v4r.wr = 59.f;
  75. v_v2rw.x = 61.f;
  76. v_v3rw.x = 62.f;
  77. v_v4rw.x = 63.f;
  78. v_v2rw.y = 64.f;
  79. v_v3rw.y = 65.f;
  80. v_v4rw.y = 66.f;
  81. v_v3rw.z = 67.f;
  82. v_v4rw.z = 68.f;
  83. v_v4rw.w = 69.f;
  84. v_v2rw.xr = 71.f;
  85. v_v3rw.xr = 72.f;
  86. v_v4rw.xr = 73.f;
  87. v_v2rw.yr = 74.f;
  88. v_v3rw.yr = 75.f;
  89. v_v4rw.yr = 76.f;
  90. v_v3rw.zr = 77.f;
  91. v_v4rw.zr = 78.f;
  92. v_v4rw.wr = 79.f;
  93. BOOST_TEST(vec_traits<v2 >::read_element<0>(v_v2 ) == v_v2 .x );
  94. BOOST_TEST(vec_traits<v3 >::read_element<0>(v_v3 ) == v_v3 .x );
  95. BOOST_TEST(vec_traits<v4 >::read_element<0>(v_v4 ) == v_v4 .x );
  96. BOOST_TEST(vec_traits<v2r >::read_element<0>(v_v2r ) == v_v2r .xr);
  97. BOOST_TEST(vec_traits<v3r >::read_element<0>(v_v3r ) == v_v3r .xr);
  98. BOOST_TEST(vec_traits<v4r >::read_element<0>(v_v4r ) == v_v4r .xr);
  99. BOOST_TEST(vec_traits<v2rw>::read_element<0>(v_v2rw) == v_v2rw.xr);
  100. BOOST_TEST(vec_traits<v3rw>::read_element<0>(v_v3rw) == v_v3rw.xr);
  101. BOOST_TEST(vec_traits<v4rw>::read_element<0>(v_v4rw) == v_v4rw.xr);
  102. BOOST_TEST(vec_traits<v2 >::read_element<1>(v_v2 ) == v_v2 .y );
  103. BOOST_TEST(vec_traits<v3 >::read_element<1>(v_v3 ) == v_v3 .y );
  104. BOOST_TEST(vec_traits<v4 >::read_element<1>(v_v4 ) == v_v4 .y );
  105. BOOST_TEST(vec_traits<v2r >::read_element<1>(v_v2r ) == v_v2r .yr);
  106. BOOST_TEST(vec_traits<v3r >::read_element<1>(v_v3r ) == v_v3r .yr);
  107. BOOST_TEST(vec_traits<v4r >::read_element<1>(v_v4r ) == v_v4r .yr);
  108. BOOST_TEST(vec_traits<v2rw>::read_element<1>(v_v2rw) == v_v2rw.yr);
  109. BOOST_TEST(vec_traits<v3rw>::read_element<1>(v_v3rw) == v_v3rw.yr);
  110. BOOST_TEST(vec_traits<v4rw>::read_element<1>(v_v4rw) == v_v4rw.yr);
  111. BOOST_TEST(vec_traits<v3 >::read_element<2>(v_v3 ) == v_v3 .z );
  112. BOOST_TEST(vec_traits<v4 >::read_element<2>(v_v4 ) == v_v4 .z );
  113. BOOST_TEST(vec_traits<v3r >::read_element<2>(v_v3r ) == v_v3r .zr);
  114. BOOST_TEST(vec_traits<v4r >::read_element<2>(v_v4r ) == v_v4r .zr);
  115. BOOST_TEST(vec_traits<v3rw>::read_element<2>(v_v3rw) == v_v3rw.zr);
  116. BOOST_TEST(vec_traits<v4rw>::read_element<2>(v_v4rw) == v_v4rw.zr);
  117. BOOST_TEST(vec_traits<v4 >::read_element<3>(v_v4 ) == v_v4 .w );
  118. BOOST_TEST(vec_traits<v4r >::read_element<3>(v_v4r ) == v_v4r .wr);
  119. BOOST_TEST(vec_traits<v4rw>::read_element<3>(v_v4rw) == v_v4rw.wr);
  120. BOOST_TEST(vec_traits<v2 >::read_element_idx(0, v_v2 ) == v_v2 .x );
  121. BOOST_TEST(vec_traits<v3 >::read_element_idx(0, v_v3 ) == v_v3 .x );
  122. BOOST_TEST(vec_traits<v4 >::read_element_idx(0, v_v4 ) == v_v4 .x );
  123. BOOST_TEST(vec_traits<v2r >::read_element_idx(0, v_v2r ) == v_v2r .xr);
  124. BOOST_TEST(vec_traits<v3r >::read_element_idx(0, v_v3r ) == v_v3r .xr);
  125. BOOST_TEST(vec_traits<v4r >::read_element_idx(0, v_v4r ) == v_v4r .xr);
  126. BOOST_TEST(vec_traits<v2rw>::read_element_idx(0, v_v2rw) == v_v2rw.xr);
  127. BOOST_TEST(vec_traits<v3rw>::read_element_idx(0, v_v3rw) == v_v3rw.xr);
  128. BOOST_TEST(vec_traits<v4rw>::read_element_idx(0, v_v4rw) == v_v4rw.xr);
  129. BOOST_TEST(vec_traits<v2 >::read_element_idx(1, v_v2 ) == v_v2 .y );
  130. BOOST_TEST(vec_traits<v3 >::read_element_idx(1, v_v3 ) == v_v3 .y );
  131. BOOST_TEST(vec_traits<v4 >::read_element_idx(1, v_v4 ) == v_v4 .y );
  132. BOOST_TEST(vec_traits<v2r >::read_element_idx(1, v_v2r ) == v_v2r .yr);
  133. BOOST_TEST(vec_traits<v3r >::read_element_idx(1, v_v3r ) == v_v3r .yr);
  134. BOOST_TEST(vec_traits<v4r >::read_element_idx(1, v_v4r ) == v_v4r .yr);
  135. BOOST_TEST(vec_traits<v2rw>::read_element_idx(1, v_v2rw) == v_v2rw.yr);
  136. BOOST_TEST(vec_traits<v3rw>::read_element_idx(1, v_v3rw) == v_v3rw.yr);
  137. BOOST_TEST(vec_traits<v4rw>::read_element_idx(1, v_v4rw) == v_v4rw.yr);
  138. BOOST_TEST(vec_traits<v3 >::read_element_idx(2, v_v3 ) == v_v3 .z );
  139. BOOST_TEST(vec_traits<v4 >::read_element_idx(2, v_v4 ) == v_v4 .z );
  140. BOOST_TEST(vec_traits<v3r >::read_element_idx(2, v_v3r ) == v_v3r .zr);
  141. BOOST_TEST(vec_traits<v4r >::read_element_idx(2, v_v4r ) == v_v4r .zr);
  142. BOOST_TEST(vec_traits<v3rw>::read_element_idx(2, v_v3rw) == v_v3rw.zr);
  143. BOOST_TEST(vec_traits<v4rw>::read_element_idx(2, v_v4rw) == v_v4rw.zr);
  144. BOOST_TEST(vec_traits<v4 >::read_element_idx(3, v_v4 ) == v_v4 .w );
  145. BOOST_TEST(vec_traits<v4r >::read_element_idx(3, v_v4r ) == v_v4r .wr);
  146. BOOST_TEST(vec_traits<v4rw>::read_element_idx(3, v_v4rw) == v_v4rw.wr);
  147. BOOST_TEST(&vec_traits<v2 >::write_element<0>(v_v2 ) == &v_v2 .x );
  148. BOOST_TEST(&vec_traits<v3 >::write_element<0>(v_v3 ) == &v_v3 .x );
  149. BOOST_TEST(&vec_traits<v4 >::write_element<0>(v_v4 ) == &v_v4 .x );
  150. BOOST_TEST_NOT(&vec_traits<v2rw>::write_element<0>(v_v2rw) == &v_v2rw.xr);
  151. BOOST_TEST_NOT(&vec_traits<v3rw>::write_element<0>(v_v3rw) == &v_v3rw.xr);
  152. BOOST_TEST_NOT(&vec_traits<v4rw>::write_element<0>(v_v4rw) == &v_v4rw.xr);
  153. BOOST_TEST(&vec_traits<v2rw>::write_element<0>(v_v2rw) == &v_v2rw.x );
  154. BOOST_TEST(&vec_traits<v3rw>::write_element<0>(v_v3rw) == &v_v3rw.x );
  155. BOOST_TEST(&vec_traits<v4rw>::write_element<0>(v_v4rw) == &v_v4rw.x );
  156. BOOST_TEST(&vec_traits<v2 >::write_element<1>(v_v2 ) == &v_v2 .y );
  157. BOOST_TEST(&vec_traits<v3 >::write_element<1>(v_v3 ) == &v_v3 .y );
  158. BOOST_TEST(&vec_traits<v4 >::write_element<1>(v_v4 ) == &v_v4 .y );
  159. BOOST_TEST_NOT(&vec_traits<v2rw>::write_element<1>(v_v2rw) == &v_v2rw.yr);
  160. BOOST_TEST_NOT(&vec_traits<v3rw>::write_element<1>(v_v3rw) == &v_v3rw.yr);
  161. BOOST_TEST_NOT(&vec_traits<v4rw>::write_element<1>(v_v4rw) == &v_v4rw.yr);
  162. BOOST_TEST(&vec_traits<v2rw>::write_element<1>(v_v2rw) == &v_v2rw.y );
  163. BOOST_TEST(&vec_traits<v3rw>::write_element<1>(v_v3rw) == &v_v3rw.y );
  164. BOOST_TEST(&vec_traits<v4rw>::write_element<1>(v_v4rw) == &v_v4rw.y );
  165. BOOST_TEST(&vec_traits<v3 >::write_element<2>(v_v3 ) == &v_v3 .z );
  166. BOOST_TEST(&vec_traits<v4 >::write_element<2>(v_v4 ) == &v_v4 .z );
  167. BOOST_TEST_NOT(&vec_traits<v3rw>::write_element<2>(v_v3rw) == &v_v3rw.zr);
  168. BOOST_TEST_NOT(&vec_traits<v4rw>::write_element<2>(v_v4rw) == &v_v4rw.zr);
  169. BOOST_TEST(&vec_traits<v3rw>::write_element<2>(v_v3rw) == &v_v3rw.z );
  170. BOOST_TEST(&vec_traits<v4rw>::write_element<2>(v_v4rw) == &v_v4rw.z );
  171. BOOST_TEST(&vec_traits<v4 >::write_element<3>(v_v4 ) == &v_v4 .w );
  172. BOOST_TEST_NOT(&vec_traits<v4rw>::write_element<3>(v_v4rw) == &v_v4rw.wr);
  173. BOOST_TEST(&vec_traits<v4rw>::write_element<3>(v_v4rw) == &v_v4rw.w );
  174. BOOST_TEST(&vec_traits<v2 >::write_element_idx(0, v_v2 ) == &v_v2 .x );
  175. BOOST_TEST(&vec_traits<v3 >::write_element_idx(0, v_v3 ) == &v_v3 .x );
  176. BOOST_TEST(&vec_traits<v4 >::write_element_idx(0, v_v4 ) == &v_v4 .x );
  177. BOOST_TEST_NOT(&vec_traits<v2rw>::write_element_idx(0, v_v2rw) == &v_v2rw.xr);
  178. BOOST_TEST_NOT(&vec_traits<v3rw>::write_element_idx(0, v_v3rw) == &v_v3rw.xr);
  179. BOOST_TEST_NOT(&vec_traits<v4rw>::write_element_idx(0, v_v4rw) == &v_v4rw.xr);
  180. BOOST_TEST(&vec_traits<v2rw>::write_element_idx(0, v_v2rw) == &v_v2rw.x );
  181. BOOST_TEST(&vec_traits<v3rw>::write_element_idx(0, v_v3rw) == &v_v3rw.x );
  182. BOOST_TEST(&vec_traits<v4rw>::write_element_idx(0, v_v4rw) == &v_v4rw.x );
  183. BOOST_TEST(&vec_traits<v2 >::write_element_idx(1, v_v2 ) == &v_v2 .y );
  184. BOOST_TEST(&vec_traits<v3 >::write_element_idx(1, v_v3 ) == &v_v3 .y );
  185. BOOST_TEST(&vec_traits<v4 >::write_element_idx(1, v_v4 ) == &v_v4 .y );
  186. BOOST_TEST_NOT(&vec_traits<v2rw>::write_element_idx(1, v_v2rw) == &v_v2rw.yr);
  187. BOOST_TEST_NOT(&vec_traits<v3rw>::write_element_idx(1, v_v3rw) == &v_v3rw.yr);
  188. BOOST_TEST_NOT(&vec_traits<v4rw>::write_element_idx(1, v_v4rw) == &v_v4rw.yr);
  189. BOOST_TEST(&vec_traits<v2rw>::write_element_idx(1, v_v2rw) == &v_v2rw.y );
  190. BOOST_TEST(&vec_traits<v3rw>::write_element_idx(1, v_v3rw) == &v_v3rw.y );
  191. BOOST_TEST(&vec_traits<v4rw>::write_element_idx(1, v_v4rw) == &v_v4rw.y );
  192. BOOST_TEST(&vec_traits<v3 >::write_element_idx(2, v_v3 ) == &v_v3 .z );
  193. BOOST_TEST(&vec_traits<v4 >::write_element_idx(2, v_v4 ) == &v_v4 .z );
  194. BOOST_TEST_NOT(&vec_traits<v3rw>::write_element_idx(2, v_v3rw) == &v_v3rw.zr);
  195. BOOST_TEST_NOT(&vec_traits<v4rw>::write_element_idx(2, v_v4rw) == &v_v4rw.zr);
  196. BOOST_TEST(&vec_traits<v3rw>::write_element_idx(2, v_v3rw) == &v_v3rw.z );
  197. BOOST_TEST(&vec_traits<v4rw>::write_element_idx(2, v_v4rw) == &v_v4rw.z );
  198. BOOST_TEST(&vec_traits<v4 >::write_element_idx(3, v_v4 ) == &v_v4 .w );
  199. BOOST_TEST_NOT(&vec_traits<v4rw>::write_element_idx(3, v_v4rw) == &v_v4rw.wr);
  200. BOOST_TEST(&vec_traits<v4rw>::write_element_idx(3, v_v4rw) == &v_v4rw.w );
  201. return boost::report_errors();
  202. }