GLM: _vectorize.hpp Source File

GLM 0.9.5

- Main Page
- Related Pages
- Modules
- Namespaces
- Files

- File List

_vectorize.hpp
1
29 #ifndef GLM_CORE_DETAIL_INCLUDED
30 #define GLM_CORE_DETAIL_INCLUDED
31
32 #include "type_vec2.hpp"
33 #include "type_vec3.hpp"
34 #include "type_vec4.hpp"
35
36 #define VECTORIZE2_VEC(func) \
37 template <typename T, precision P> \
38 GLM_FUNC_QUALIFIER detail::tvec2<T, P> func( \
39 detail::tvec2<T, P> const & v) \
40 { \
41 return detail::tvec2<T, P>( \
42 func(v.x), \
43 func(v.y)); \
44 }
45
46 #define VECTORIZE3_VEC(func) \
47 template <typename T, precision P> \
48 GLM_FUNC_QUALIFIER detail::tvec3<T, P> func( \
49 detail::tvec3<T, P> const & v) \
50 { \
51 return detail::tvec3<T, P>( \
52 func(v.x), \
53 func(v.y), \
54 func(v.z)); \
55 }
56
57 #define VECTORIZE4_VEC(func) \
58 template <typename T, precision P> \
59 GLM_FUNC_QUALIFIER detail::tvec4<T, P> func( \
60 detail::tvec4<T, P> const & v) \
61 { \
62 return detail::tvec4<T, P>( \
63 func(v.x), \
64 func(v.y), \
65 func(v.z), \
66 func(v.w)); \
67 }
68
69 #define VECTORIZE_VEC(func) \
70 VECTORIZE2_VEC(func) \
71 VECTORIZE3_VEC(func) \
72 VECTORIZE4_VEC(func)
73
74 #define VECTORIZE2_VEC_SCA(func) \
75 template <typename T, precision P> \
76 GLM_FUNC_QUALIFIER detail::tvec2<T, P> func \
77 ( \
78 detail::tvec2<T, P> const & x, \
79 T const & y \
80 ) \
81 { \
82 return detail::tvec2<T, P>( \
83 func(x.x, y), \
84 func(x.y, y)); \
85 }
86
87 #define VECTORIZE3_VEC_SCA(func) \
88 template <typename T, precision P> \
89 GLM_FUNC_QUALIFIER detail::tvec3<T, P> func \
90 ( \
91 detail::tvec3<T, P> const & x, \
92 T const & y \
93 ) \
94 { \
95 return detail::tvec3<T, P>( \
96 func(x.x, y), \
97 func(x.y, y), \
98 func(x.z, y)); \
99 }
100
101 #define VECTORIZE4_VEC_SCA(func) \
102 template <typename T, precision P> \
103 GLM_FUNC_QUALIFIER detail::tvec4<T, P> func \
104 ( \
105 detail::tvec4<T, P> const & x, \
106 T const & y \
107 ) \
108 { \
109 return detail::tvec4<T, P>( \
110 func(x.x, y), \
111 func(x.y, y), \
112 func(x.z, y), \
113 func(x.w, y)); \
114 }
115
116 #define VECTORIZE_VEC_SCA(func) \
117 VECTORIZE2_VEC_SCA(func) \
118 VECTORIZE3_VEC_SCA(func) \
119 VECTORIZE4_VEC_SCA(func)
120
121 #define VECTORIZE2_VEC_VEC(func) \
122 template <typename T, precision P> \
123 GLM_FUNC_QUALIFIER detail::tvec2<T, P> func \
124 ( \
125 detail::tvec2<T, P> const & x, \
126 detail::tvec2<T, P> const & y \
127 ) \
128 { \
129 return detail::tvec2<T, P>( \
130 func(x.x, y.x), \
131 func(x.y, y.y)); \
132 }
133
134 #define VECTORIZE3_VEC_VEC(func) \
135 template <typename T, precision P> \
136 GLM_FUNC_QUALIFIER detail::tvec3<T, P> func \
137 ( \
138 detail::tvec3<T, P> const & x, \
139 detail::tvec3<T, P> const & y \
140 ) \
141 { \
142 return detail::tvec3<T, P>( \
143 func(x.x, y.x), \
144 func(x.y, y.y), \
145 func(x.z, y.z)); \
146 }
147
148 #define VECTORIZE4_VEC_VEC(func) \
149 template <typename T, precision P> \
150 GLM_FUNC_QUALIFIER detail::tvec4<T, P> func \
151 ( \
152 detail::tvec4<T, P> const & x, \
153 detail::tvec4<T, P> const & y \
154 ) \
155 { \
156 return detail::tvec4<T, P>( \
157 func(x.x, y.x), \
158 func(x.y, y.y), \
159 func(x.z, y.z), \
160 func(x.w, y.w)); \
161 }
162
163 #define VECTORIZE_VEC_VEC(func) \
164 VECTORIZE2_VEC_VEC(func) \
165 VECTORIZE3_VEC_VEC(func) \
166 VECTORIZE4_VEC_VEC(func)
167
168 namespace glm{
169 namespace detail
170 {
171 template<bool C>
172 struct If
173 {
174 template<typename F, typename T>
175 static GLM_FUNC_QUALIFIER T apply(F functor, const T& val)
176 {
177 return functor(val);
178 }
179 };
180
181 template<>
182 struct If<false>
183 {
184 template<typename F, typename T>
185 static GLM_FUNC_QUALIFIER T apply(F, const T& val)
186 {
187 return val;
188 }
189 };
190 }//namespace detail
191 }//namespace glm
192
193 #endif//GLM_CORE_DETAIL_INCLUDED