GLM  0.9.5
_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