Skip to content

Commit ed57032

Browse files
committed
Add begin,end support for glm
1 parent 2d4c4b4 commit ed57032

File tree

4 files changed

+419
-0
lines changed

4 files changed

+419
-0
lines changed

glm/gtx/iteration.hpp

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/// @ref gtx_iteration
2+
/// @file glm/gtx/iteration.hpp
3+
///
4+
/// @defgroup gtx_iteration GLM_GTX_iteration
5+
/// @ingroup gtx
6+
///
7+
/// Include <glm/gtx/iteration.hpp> to use the features of this extension.
8+
///
9+
/// Defines begin and end for vectors, matrices and quaternions useful for range based for loop construct
10+
11+
#pragma once
12+
13+
// Dependencies
14+
#include "../detail/setup.hpp"
15+
#include "../detail/qualifier.hpp"
16+
17+
#ifndef GLM_ENABLE_EXPERIMENTAL
18+
# error "GLM: GLM_GTX_iteration is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."
19+
#elif GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
20+
# pragma message("GLM: GLM_GTX_iteration extension included")
21+
#endif
22+
23+
#include <iterator>
24+
25+
namespace glm
26+
{
27+
/// @addtogroup gtx_iteration
28+
/// @{
29+
template<length_t L,typename T,qualifier Q>
30+
GLM_FUNC_DECL GLM_CONSTEXPR T* begin(vec<L, T, Q>& v);
31+
template<length_t C,length_t R,typename T,qualifier Q>
32+
GLM_FUNC_DECL GLM_CONSTEXPR T* begin(mat<C, R, T, Q>& m);
33+
template<typename T,qualifier Q>
34+
GLM_FUNC_DECL GLM_CONSTEXPR T* begin(qua<T, Q>& q);
35+
template<length_t L,typename T,qualifier Q>
36+
GLM_FUNC_DECL GLM_CONSTEXPR const T* begin(const vec<L, T, Q>& v);
37+
template<length_t C,length_t R,typename T,qualifier Q>
38+
GLM_FUNC_DECL GLM_CONSTEXPR const T* begin(const mat<C, R, T, Q>& m);
39+
template<typename T,qualifier Q>
40+
GLM_FUNC_DECL GLM_CONSTEXPR const T* begin(const qua<T, Q>& q);
41+
42+
template<length_t L,typename T,qualifier Q>
43+
GLM_FUNC_DECL GLM_CONSTEXPR T* end(vec<L, T, Q>& v);
44+
template<length_t C,length_t R,typename T,qualifier Q>
45+
GLM_FUNC_DECL GLM_CONSTEXPR T* end(mat<C, R, T, Q>& m);
46+
template<typename T,qualifier Q>
47+
GLM_FUNC_DECL GLM_CONSTEXPR T* end(qua<T, Q>& q);
48+
template<length_t L,typename T,qualifier Q>
49+
GLM_FUNC_DECL GLM_CONSTEXPR const T* end(const vec<L, T, Q>& v);
50+
template<length_t C,length_t R,typename T,qualifier Q>
51+
GLM_FUNC_DECL GLM_CONSTEXPR const T* end(const mat<C, R, T, Q>& m);
52+
template<typename T,qualifier Q>
53+
GLM_FUNC_DECL GLM_CONSTEXPR const T* end(const qua<T, Q>& q);
54+
55+
// Reverse iteration
56+
// rbegin,rend
57+
template<length_t L,typename T,qualifier Q>
58+
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<T*> rbegin(vec<L, T, Q>& v);
59+
template<length_t C,length_t R,typename T,qualifier Q>
60+
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<T*> rbegin(mat<C, R, T, Q>& m);
61+
template<typename T,qualifier Q>
62+
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<T*> rbegin(qua<T, Q>& q);
63+
template<length_t L,typename T,qualifier Q>
64+
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<const T*> rbegin(const vec<L, T, Q>& v);
65+
template<length_t C,length_t R,typename T,qualifier Q>
66+
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<const T*> rbegin(const mat<C, R, T, Q>& m);
67+
template<typename T,qualifier Q>
68+
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<const T*> rbegin(const qua<T, Q>& q);
69+
70+
template<length_t L,typename T,qualifier Q>
71+
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<T*> rend(vec<L, T, Q>& v);
72+
template<length_t C,length_t R,typename T,qualifier Q>
73+
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<T*> rend(mat<C, R, T, Q>& m);
74+
template<typename T,qualifier Q>
75+
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<T*> rend(qua<T, Q>& q);
76+
template<length_t L,typename T,qualifier Q>
77+
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<const T*> rend(const vec<L, T, Q>& v);
78+
template<length_t C,length_t R,typename T,qualifier Q>
79+
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<const T*> rend(const mat<C, R, T, Q>& m);
80+
template<typename T,qualifier Q>
81+
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<const T*> rend(const qua<T, Q>& q);
82+
83+
84+
/// @}
85+
}//namespace glm
86+
87+
#include "iteration.inl"

glm/gtx/iteration.inl

+116
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
namespace glm
2+
{
3+
/*
4+
namespace details {
5+
template<typename T, glm::length_t L>
6+
struct known_length_iterator;
7+
}
8+
*/
9+
10+
/// @addtogroup gtx_iteration
11+
/// @{
12+
template<length_t L,typename T,qualifier Q>
13+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR T* begin(vec<L,T,Q>& v) {
14+
return &v.x;
15+
}
16+
template<length_t C,length_t R,typename T,qualifier Q>
17+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR T* begin(mat<C,R,T,Q>& m) {
18+
return &m[0].x;
19+
}
20+
template<typename T,qualifier Q>
21+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR T* begin(qua<T,Q>& q) {
22+
return &q[0];
23+
}
24+
template<length_t L,typename T,qualifier Q>
25+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR const T* begin(const vec<L,T,Q>& v) {
26+
return &v.x;
27+
}
28+
template<length_t C,length_t R,typename T,qualifier Q>
29+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR const T* begin(const mat<C,R,T,Q>& m) {
30+
return &m[0].x;
31+
}
32+
template<typename T,qualifier Q>
33+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR const T* begin(const qua<T,Q>& q) {
34+
return &q[0];
35+
}
36+
37+
template<length_t L,typename T,qualifier Q>
38+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR T* end(vec<L,T,Q>& v) {
39+
return (&v.x) + L;
40+
}
41+
template<length_t C,length_t R,typename T,qualifier Q>
42+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR T* end(mat<C,R,T,Q>& m) {
43+
return (&m[0].x) + C*R;
44+
}
45+
template<typename T,qualifier Q>
46+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR T* end(qua<T,Q>& q) {
47+
return (&q[0]) + 4;
48+
}
49+
template<length_t L,typename T,qualifier Q>
50+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR const T* end(const vec<L,T,Q>& v) {
51+
return (&v.x) + L;
52+
}
53+
template<length_t C,length_t R,typename T,qualifier Q>
54+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR const T* end(const mat<C,R,T,Q>& m) {
55+
return (&m[0].x) + C*R;
56+
}
57+
template<typename T,qualifier Q>
58+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR const T* end(const qua<T,Q>& q) {
59+
return (&q[0]) + 4;
60+
}
61+
62+
// Reverse iteration
63+
// rbegin,rend
64+
template<length_t L,typename T,qualifier Q>
65+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<T*> rbegin(vec<L,T,Q>& v) {
66+
return std::reverse_iterator<T*>(end(v));
67+
}
68+
template<length_t C,length_t R,typename T,qualifier Q>
69+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<T*> rbegin(mat<C,R,T,Q>& m) {
70+
return std::reverse_iterator<T*>(end(m));
71+
}
72+
template<typename T,qualifier Q>
73+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<T*> rbegin(qua<T,Q>& q) {
74+
return std::reverse_iterator<T*>(end(q));
75+
}
76+
template<length_t L,typename T,qualifier Q>
77+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<const T*> rbegin(const vec<L,T,Q>& v) {
78+
return std::reverse_iterator<const T*>(end(v));
79+
}
80+
template<length_t C,length_t R,typename T,qualifier Q>
81+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<const T*> rbegin(const mat<C,R,T,Q>& m) {
82+
return std::reverse_iterator<const T*>(end(m));
83+
}
84+
template<typename T,qualifier Q>
85+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<const T*> rbegin(const qua<T,Q>& q) {
86+
return std::reverse_iterator<const T*>(end(q));
87+
}
88+
89+
template<length_t L,typename T,qualifier Q>
90+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<T*> rend(vec<L,T,Q>& v) {
91+
return std::reverse_iterator<T*>(begin(v));
92+
}
93+
template<length_t C,length_t R,typename T,qualifier Q>
94+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<T*> rend(mat<C,R,T,Q>& m) {
95+
return std::reverse_iterator<T*>(begin(m));
96+
}
97+
template<typename T,qualifier Q>
98+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<T*> rend(qua<T,Q>& q) {
99+
return std::reverse_iterator<T*>(begin(q));
100+
}
101+
template<length_t L,typename T,qualifier Q>
102+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<const T*> rend(const vec<L,T,Q>& v) {
103+
return std::reverse_iterator<const T*>(begin(v));
104+
}
105+
template<length_t C,length_t R,typename T,qualifier Q>
106+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<const T*> rend(const mat<C,R,T,Q>& m) {
107+
return std::reverse_iterator<const T*>(begin(m));
108+
}
109+
template<typename T,qualifier Q>
110+
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<const T*> rend(const qua<T,Q>& q) {
111+
return std::reverse_iterator<const T*>(begin(q));
112+
}
113+
114+
115+
/// @}
116+
}//namespace glm

test/gtx/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ glmCreateTestGTC(gtx_hash)
2222
glmCreateTestGTC(gtx_integer)
2323
glmCreateTestGTC(gtx_intersect)
2424
glmCreateTestGTC(gtx_io)
25+
glmCreateTestGTC(gtx_iteration)
2526
glmCreateTestGTC(gtx_load)
2627
glmCreateTestGTC(gtx_log_base)
2728
glmCreateTestGTC(gtx_matrix_cross_product)

0 commit comments

Comments
 (0)