Skip to content

Add begin,end support for glm #1344

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 87 additions & 0 deletions glm/gtx/iteration.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
/// @ref gtx_iteration
/// @file glm/gtx/iteration.hpp
///
/// @defgroup gtx_iteration GLM_GTX_iteration
/// @ingroup gtx
///
/// Include <glm/gtx/iteration.hpp> to use the features of this extension.
///
/// Defines begin and end for vectors, matrices and quaternions useful for range based for loop construct

#pragma once

// Dependencies
#include "../detail/setup.hpp"
#include "../detail/qualifier.hpp"

#ifndef GLM_ENABLE_EXPERIMENTAL
# 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."
#elif GLM_MESSAGES == GLM_ENABLE && !defined(GLM_EXT_INCLUDED)
# pragma message("GLM: GLM_GTX_iteration extension included")
#endif

#include <iterator>

namespace glm
{
/// @addtogroup gtx_iteration
/// @{
template<length_t L,typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR T* begin(vec<L, T, Q>& v);
template<length_t C,length_t R,typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR T* begin(mat<C, R, T, Q>& m);
template<typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR T* begin(qua<T, Q>& q);
template<length_t L,typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR const T* begin(const vec<L, T, Q>& v);
template<length_t C,length_t R,typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR const T* begin(const mat<C, R, T, Q>& m);
template<typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR const T* begin(const qua<T, Q>& q);

template<length_t L,typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR T* end(vec<L, T, Q>& v);
template<length_t C,length_t R,typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR T* end(mat<C, R, T, Q>& m);
template<typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR T* end(qua<T, Q>& q);
template<length_t L,typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR const T* end(const vec<L, T, Q>& v);
template<length_t C,length_t R,typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR const T* end(const mat<C, R, T, Q>& m);
template<typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR const T* end(const qua<T, Q>& q);

// Reverse iteration
// rbegin,rend
template<length_t L,typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<T*> rbegin(vec<L, T, Q>& v);
template<length_t C,length_t R,typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<T*> rbegin(mat<C, R, T, Q>& m);
template<typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<T*> rbegin(qua<T, Q>& q);
template<length_t L,typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<const T*> rbegin(const vec<L, T, Q>& v);
template<length_t C,length_t R,typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<const T*> rbegin(const mat<C, R, T, Q>& m);
template<typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<const T*> rbegin(const qua<T, Q>& q);

template<length_t L,typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<T*> rend(vec<L, T, Q>& v);
template<length_t C,length_t R,typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<T*> rend(mat<C, R, T, Q>& m);
template<typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<T*> rend(qua<T, Q>& q);
template<length_t L,typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<const T*> rend(const vec<L, T, Q>& v);
template<length_t C,length_t R,typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<const T*> rend(const mat<C, R, T, Q>& m);
template<typename T,qualifier Q>
GLM_FUNC_DECL GLM_CONSTEXPR std::reverse_iterator<const T*> rend(const qua<T, Q>& q);


/// @}
}//namespace glm

#include "iteration.inl"
116 changes: 116 additions & 0 deletions glm/gtx/iteration.inl
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
namespace glm
{
/*
namespace details {
template<typename T, glm::length_t L>
struct known_length_iterator;
}
*/

/// @addtogroup gtx_iteration
/// @{
template<length_t L,typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR T* begin(vec<L,T,Q>& v) {
return &v.x;
}
template<length_t C,length_t R,typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR T* begin(mat<C,R,T,Q>& m) {
return &m[0].x;
}
template<typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR T* begin(qua<T,Q>& q) {
return &q[0];
}
template<length_t L,typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR const T* begin(const vec<L,T,Q>& v) {
return &v.x;
}
template<length_t C,length_t R,typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR const T* begin(const mat<C,R,T,Q>& m) {
return &m[0].x;
}
template<typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR const T* begin(const qua<T,Q>& q) {
return &q[0];
}

template<length_t L,typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR T* end(vec<L,T,Q>& v) {
return (&v.x) + L;
}
template<length_t C,length_t R,typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR T* end(mat<C,R,T,Q>& m) {
return (&m[0].x) + C*R;
}
template<typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR T* end(qua<T,Q>& q) {
return (&q[0]) + 4;
}
template<length_t L,typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR const T* end(const vec<L,T,Q>& v) {
return (&v.x) + L;
}
template<length_t C,length_t R,typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR const T* end(const mat<C,R,T,Q>& m) {
return (&m[0].x) + C*R;
}
template<typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR const T* end(const qua<T,Q>& q) {
return (&q[0]) + 4;
}

// Reverse iteration
// rbegin,rend
template<length_t L,typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<T*> rbegin(vec<L,T,Q>& v) {
return std::reverse_iterator<T*>(end(v));
}
template<length_t C,length_t R,typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<T*> rbegin(mat<C,R,T,Q>& m) {
return std::reverse_iterator<T*>(end(m));
}
template<typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<T*> rbegin(qua<T,Q>& q) {
return std::reverse_iterator<T*>(end(q));
}
template<length_t L,typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<const T*> rbegin(const vec<L,T,Q>& v) {
return std::reverse_iterator<const T*>(end(v));
}
template<length_t C,length_t R,typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<const T*> rbegin(const mat<C,R,T,Q>& m) {
return std::reverse_iterator<const T*>(end(m));
}
template<typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<const T*> rbegin(const qua<T,Q>& q) {
return std::reverse_iterator<const T*>(end(q));
}

template<length_t L,typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<T*> rend(vec<L,T,Q>& v) {
return std::reverse_iterator<T*>(begin(v));
}
template<length_t C,length_t R,typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<T*> rend(mat<C,R,T,Q>& m) {
return std::reverse_iterator<T*>(begin(m));
}
template<typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<T*> rend(qua<T,Q>& q) {
return std::reverse_iterator<T*>(begin(q));
}
template<length_t L,typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<const T*> rend(const vec<L,T,Q>& v) {
return std::reverse_iterator<const T*>(begin(v));
}
template<length_t C,length_t R,typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<const T*> rend(const mat<C,R,T,Q>& m) {
return std::reverse_iterator<const T*>(begin(m));
}
template<typename T,qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR std::reverse_iterator<const T*> rend(const qua<T,Q>& q) {
return std::reverse_iterator<const T*>(begin(q));
}


/// @}
}//namespace glm
1 change: 1 addition & 0 deletions test/gtx/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ glmCreateTestGTC(gtx_hash)
glmCreateTestGTC(gtx_integer)
glmCreateTestGTC(gtx_intersect)
glmCreateTestGTC(gtx_io)
glmCreateTestGTC(gtx_iteration)
glmCreateTestGTC(gtx_load)
glmCreateTestGTC(gtx_log_base)
glmCreateTestGTC(gtx_matrix_cross_product)
Expand Down
Loading