gtx_iteration.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. #define GLM_ENABLE_EXPERIMENTAL
  2. #include <glm/gtx/iteration.hpp>
  3. #include <iterator>
  4. #include <algorithm>
  5. #include <numeric>
  6. #include <glm/glm.hpp>
  7. #include <glm/gtx/quaternion.hpp>
  8. // Testing if adl works if it doesn't a compiler error is generated
  9. // Note all usages of glm::begin,glm::end,glm::rbegin,glm::rend
  10. // in this file is via adl
  11. template<typename T>
  12. void begin(T) {}
  13. template<typename T>
  14. void rbegin(T) {}
  15. template<typename T>
  16. void end(T) {}
  17. template<typename T>
  18. void rend(T) {}
  19. template<typename T>
  20. std::ptrdiff_t get_iter_distance() {
  21. T t = T(); // needed for const initializing
  22. return std::distance(begin(t), end(t));
  23. }
  24. template<typename T>
  25. std::ptrdiff_t get_rev_iter_distance() {
  26. T t = T(); // needed for const initializing
  27. return std::distance(rbegin(t), rend(t));
  28. }
  29. template<typename GenTypc>
  30. int rangedSumComp(GenTypc& genType, int compsum) {
  31. int Error = 0;
  32. #if defined(__cpp_range_based_for)
  33. #if __cpp_range_based_for >= 200907L
  34. {
  35. int sum = 0;
  36. for (const int& elem : genType)
  37. sum += elem;
  38. Error += sum != compsum;
  39. }
  40. #endif
  41. #endif
  42. {
  43. int sum = 0;
  44. for (const int* it = begin(genType); it != end(genType); ++it)
  45. sum += *it;
  46. Error += sum != compsum;
  47. }
  48. {
  49. int sum = 0;
  50. for (std::reverse_iterator<const int*> it = rbegin(genType); it != rend(genType); ++it)
  51. sum += *it;
  52. Error += sum != compsum;
  53. }
  54. return Error;
  55. }
  56. template<glm::length_t L>
  57. int sumVec() {
  58. glm::vec<L, int> v;
  59. int sumManual = 0;
  60. for (int i = 0; i < L; ++i) {
  61. v[i] = i;
  62. sumManual += i;
  63. }
  64. glm::vec<L, int> const cv = v;
  65. return (sumManual != std::accumulate(begin(v), end(v), 0))
  66. + (sumManual != std::accumulate(begin(cv), end(cv), 0))
  67. + (sumManual != std::accumulate(rbegin(v), rend(v), 0))
  68. + (sumManual != std::accumulate(rbegin(cv), rend(cv), 0))
  69. + rangedSumComp(v, sumManual)
  70. + rangedSumComp(cv, sumManual);
  71. }
  72. template<glm::length_t C, glm::length_t R>
  73. int sumMat() {
  74. glm::mat<C, R, int> m;
  75. int sumManual = 0;
  76. for (int i = 0; i < C; ++i) {
  77. for (int j = 0; j < R; ++j) {
  78. m[i][j] = i * j;
  79. sumManual += i * j;
  80. }
  81. }
  82. glm::mat<C, R, int> const cm = m;
  83. return (sumManual != std::accumulate(begin(m), end(m), 0))
  84. + (sumManual != std::accumulate(begin(cm), end(cm), 0))
  85. + (sumManual != std::accumulate(rbegin(m), rend(m), 0))
  86. + (sumManual != std::accumulate(rbegin(cm), rend(cm), 0))
  87. + rangedSumComp(m, sumManual)
  88. + rangedSumComp(cm, sumManual);
  89. }
  90. static int sumQuat() {
  91. glm::qua<int> q(0, 1, 2, 3);
  92. glm::qua<int> const cq(0, 1, 2, 3);
  93. const int sumManual = (0 + 1 + 2 + 3);
  94. return (sumManual != std::accumulate(begin(q), end(q), 0))
  95. + (sumManual != std::accumulate(begin(cq), end(cq), 0))
  96. + (sumManual != std::accumulate(rbegin(q), rend(q), 0))
  97. + (sumManual != std::accumulate(rbegin(cq), rend(cq), 0))
  98. + rangedSumComp(q, sumManual)
  99. + rangedSumComp(cq, sumManual);
  100. }
  101. int main()
  102. {
  103. int Error = 0;
  104. Error += (1 != get_iter_distance<glm::vec1>());
  105. Error += (2 != get_iter_distance<glm::vec2>());
  106. Error += (3 != get_iter_distance<glm::vec3>());
  107. Error += (4 != get_iter_distance<glm::vec4>());
  108. Error += (1 != get_iter_distance<const glm::vec1>());
  109. Error += (2 != get_iter_distance<const glm::vec2>());
  110. Error += (3 != get_iter_distance<const glm::vec3>());
  111. Error += (4 != get_iter_distance<const glm::vec4>());
  112. Error += (4 != get_iter_distance<glm::quat>());
  113. Error += (4 != get_iter_distance<const glm::quat>());
  114. Error += (2 * 2 != get_iter_distance<glm::mat2x2>());
  115. Error += (2 * 3 != get_iter_distance<glm::mat2x3>());
  116. Error += (2 * 4 != get_iter_distance<glm::mat2x4>());
  117. Error += (2 * 2 != get_iter_distance<const glm::mat2x2>());
  118. Error += (2 * 3 != get_iter_distance<const glm::mat2x3>());
  119. Error += (2 * 4 != get_iter_distance<const glm::mat2x4>());
  120. Error += (3 * 2 != get_iter_distance<glm::mat3x2>());
  121. Error += (3 * 3 != get_iter_distance<glm::mat3x3>());
  122. Error += (3 * 4 != get_iter_distance<glm::mat3x4>());
  123. Error += (3 * 2 != get_iter_distance<const glm::mat3x2>());
  124. Error += (3 * 3 != get_iter_distance<const glm::mat3x3>());
  125. Error += (3 * 4 != get_iter_distance<const glm::mat3x4>());
  126. Error += (4 * 2 != get_iter_distance<glm::mat4x2>());
  127. Error += (4 * 3 != get_iter_distance<glm::mat4x3>());
  128. Error += (4 * 4 != get_iter_distance<glm::mat4x4>());
  129. Error += (4 * 2 != get_iter_distance<const glm::mat4x2>());
  130. Error += (4 * 3 != get_iter_distance<const glm::mat4x3>());
  131. Error += (4 * 4 != get_iter_distance<const glm::mat4x4>());
  132. Error += (1 != get_rev_iter_distance<glm::vec1>());
  133. Error += (2 != get_rev_iter_distance<glm::vec2>());
  134. Error += (3 != get_rev_iter_distance<glm::vec3>());
  135. Error += (4 != get_rev_iter_distance<glm::vec4>());
  136. Error += (1 != get_rev_iter_distance<const glm::vec1>());
  137. Error += (2 != get_rev_iter_distance<const glm::vec2>());
  138. Error += (3 != get_rev_iter_distance<const glm::vec3>());
  139. Error += (4 != get_rev_iter_distance<const glm::vec4>());
  140. Error += (4 != get_rev_iter_distance<glm::quat>());
  141. Error += (4 != get_rev_iter_distance<const glm::quat>());
  142. Error += (2 * 2 != get_rev_iter_distance<glm::mat2x2>());
  143. Error += (2 * 3 != get_rev_iter_distance<glm::mat2x3>());
  144. Error += (2 * 4 != get_rev_iter_distance<glm::mat2x4>());
  145. Error += (2 * 2 != get_rev_iter_distance<const glm::mat2x2>());
  146. Error += (2 * 3 != get_rev_iter_distance<const glm::mat2x3>());
  147. Error += (2 * 4 != get_rev_iter_distance<const glm::mat2x4>());
  148. Error += (3 * 2 != get_rev_iter_distance<glm::mat3x2>());
  149. Error += (3 * 3 != get_rev_iter_distance<glm::mat3x3>());
  150. Error += (3 * 4 != get_rev_iter_distance<glm::mat3x4>());
  151. Error += (3 * 2 != get_rev_iter_distance<const glm::mat3x2>());
  152. Error += (3 * 3 != get_rev_iter_distance<const glm::mat3x3>());
  153. Error += (3 * 4 != get_rev_iter_distance<const glm::mat3x4>());
  154. Error += (4 * 2 != get_rev_iter_distance<glm::mat4x2>());
  155. Error += (4 * 3 != get_rev_iter_distance<glm::mat4x3>());
  156. Error += (4 * 4 != get_rev_iter_distance<glm::mat4x4>());
  157. Error += (4 * 2 != get_rev_iter_distance<const glm::mat4x2>());
  158. Error += (4 * 3 != get_rev_iter_distance<const glm::mat4x3>());
  159. Error += (4 * 4 != get_rev_iter_distance<const glm::mat4x4>());
  160. Error += sumVec<1>();
  161. Error += sumVec<2>();
  162. Error += sumVec<3>();
  163. Error += sumVec<4>();
  164. Error += sumMat<2, 2>();
  165. Error += sumMat<2, 3>();
  166. Error += sumMat<2, 4>();
  167. Error += sumMat<3, 2>();
  168. Error += sumMat<3, 3>();
  169. Error += sumMat<3, 4>();
  170. Error += sumMat<4, 2>();
  171. Error += sumMat<4, 3>();
  172. Error += sumMat<4, 4>();
  173. Error += sumQuat();
  174. return Error;
  175. }