#define GLM_ENABLE_EXPERIMENTAL #include #include #include #include #include #include // Testing if adl works if it doesn't a compiler error is generated // Note all usages of glm::begin,glm::end,glm::rbegin,glm::rend // in this file is via adl template void begin(T) {} template void rbegin(T) {} template void end(T) {} template void rend(T) {} template std::ptrdiff_t get_iter_distance() { T t = T(); // needed for const initializing return std::distance(begin(t), end(t)); } template std::ptrdiff_t get_rev_iter_distance() { T t = T(); // needed for const initializing return std::distance(rbegin(t), rend(t)); } template int rangedSumComp(GenTypc& genType, int compsum) { int Error = 0; #if defined(__cpp_range_based_for) #if __cpp_range_based_for >= 200907L { int sum = 0; for (const int& elem : genType) sum += elem; Error += sum != compsum; } #endif #endif { int sum = 0; for (const int* it = begin(genType); it != end(genType); ++it) sum += *it; Error += sum != compsum; } { int sum = 0; for (std::reverse_iterator it = rbegin(genType); it != rend(genType); ++it) sum += *it; Error += sum != compsum; } return Error; } template int sumVec() { glm::vec v; int sumManual = 0; for (int i = 0; i < L; ++i) { v[i] = i; sumManual += i; } glm::vec const cv = v; return (sumManual != std::accumulate(begin(v), end(v), 0)) + (sumManual != std::accumulate(begin(cv), end(cv), 0)) + (sumManual != std::accumulate(rbegin(v), rend(v), 0)) + (sumManual != std::accumulate(rbegin(cv), rend(cv), 0)) + rangedSumComp(v, sumManual) + rangedSumComp(cv, sumManual); } template int sumMat() { glm::mat m; int sumManual = 0; for (int i = 0; i < C; ++i) { for (int j = 0; j < R; ++j) { m[i][j] = i * j; sumManual += i * j; } } glm::mat const cm = m; return (sumManual != std::accumulate(begin(m), end(m), 0)) + (sumManual != std::accumulate(begin(cm), end(cm), 0)) + (sumManual != std::accumulate(rbegin(m), rend(m), 0)) + (sumManual != std::accumulate(rbegin(cm), rend(cm), 0)) + rangedSumComp(m, sumManual) + rangedSumComp(cm, sumManual); } static int sumQuat() { glm::qua q(0, 1, 2, 3); glm::qua const cq(0, 1, 2, 3); const int sumManual = (0 + 1 + 2 + 3); return (sumManual != std::accumulate(begin(q), end(q), 0)) + (sumManual != std::accumulate(begin(cq), end(cq), 0)) + (sumManual != std::accumulate(rbegin(q), rend(q), 0)) + (sumManual != std::accumulate(rbegin(cq), rend(cq), 0)) + rangedSumComp(q, sumManual) + rangedSumComp(cq, sumManual); } int main() { int Error = 0; Error += (1 != get_iter_distance()); Error += (2 != get_iter_distance()); Error += (3 != get_iter_distance()); Error += (4 != get_iter_distance()); Error += (1 != get_iter_distance()); Error += (2 != get_iter_distance()); Error += (3 != get_iter_distance()); Error += (4 != get_iter_distance()); Error += (4 != get_iter_distance()); Error += (4 != get_iter_distance()); Error += (2 * 2 != get_iter_distance()); Error += (2 * 3 != get_iter_distance()); Error += (2 * 4 != get_iter_distance()); Error += (2 * 2 != get_iter_distance()); Error += (2 * 3 != get_iter_distance()); Error += (2 * 4 != get_iter_distance()); Error += (3 * 2 != get_iter_distance()); Error += (3 * 3 != get_iter_distance()); Error += (3 * 4 != get_iter_distance()); Error += (3 * 2 != get_iter_distance()); Error += (3 * 3 != get_iter_distance()); Error += (3 * 4 != get_iter_distance()); Error += (4 * 2 != get_iter_distance()); Error += (4 * 3 != get_iter_distance()); Error += (4 * 4 != get_iter_distance()); Error += (4 * 2 != get_iter_distance()); Error += (4 * 3 != get_iter_distance()); Error += (4 * 4 != get_iter_distance()); Error += (1 != get_rev_iter_distance()); Error += (2 != get_rev_iter_distance()); Error += (3 != get_rev_iter_distance()); Error += (4 != get_rev_iter_distance()); Error += (1 != get_rev_iter_distance()); Error += (2 != get_rev_iter_distance()); Error += (3 != get_rev_iter_distance()); Error += (4 != get_rev_iter_distance()); Error += (4 != get_rev_iter_distance()); Error += (4 != get_rev_iter_distance()); Error += (2 * 2 != get_rev_iter_distance()); Error += (2 * 3 != get_rev_iter_distance()); Error += (2 * 4 != get_rev_iter_distance()); Error += (2 * 2 != get_rev_iter_distance()); Error += (2 * 3 != get_rev_iter_distance()); Error += (2 * 4 != get_rev_iter_distance()); Error += (3 * 2 != get_rev_iter_distance()); Error += (3 * 3 != get_rev_iter_distance()); Error += (3 * 4 != get_rev_iter_distance()); Error += (3 * 2 != get_rev_iter_distance()); Error += (3 * 3 != get_rev_iter_distance()); Error += (3 * 4 != get_rev_iter_distance()); Error += (4 * 2 != get_rev_iter_distance()); Error += (4 * 3 != get_rev_iter_distance()); Error += (4 * 4 != get_rev_iter_distance()); Error += (4 * 2 != get_rev_iter_distance()); Error += (4 * 3 != get_rev_iter_distance()); Error += (4 * 4 != get_rev_iter_distance()); Error += sumVec<1>(); Error += sumVec<2>(); Error += sumVec<3>(); Error += sumVec<4>(); Error += sumMat<2, 2>(); Error += sumMat<2, 3>(); Error += sumMat<2, 4>(); Error += sumMat<3, 2>(); Error += sumMat<3, 3>(); Error += sumMat<3, 4>(); Error += sumMat<4, 2>(); Error += sumMat<4, 3>(); Error += sumMat<4, 4>(); Error += sumQuat(); return Error; }