GLM  0.9.5
type_vec2.hpp
1 
29 #ifndef glm_core_type_gentype2
30 #define glm_core_type_gentype2
31 
32 //#include "../fwd.hpp"
33 #include "type_vec.hpp"
34 #ifdef GLM_SWIZZLE
35 # if GLM_HAS_ANONYMOUS_UNION
36 # include "_swizzle.hpp"
37 # else
38 # include "_swizzle_func.hpp"
39 # endif
40 #endif //GLM_SWIZZLE
41 #if(GLM_HAS_INITIALIZER_LISTS)
42 # include <initializer_list>
43 #endif //GLM_HAS_INITIALIZER_LISTS
44 #include <cstddef>
45 
46 namespace glm{
47 namespace detail
48 {
49  template <typename T, precision P>
50  struct tvec2
51  {
53  // Implementation detail
54 
55  enum ctor{_null};
56 
57  typedef tvec2<T, P> type;
58  typedef tvec2<bool, P> bool_type;
59  typedef T value_type;
60  typedef int size_type;
61 
63  // Helper
64 
65  GLM_FUNC_DECL GLM_CONSTEXPR length_t length() const;
66 
68  // Data
69 
70 # if(GLM_HAS_ANONYMOUS_UNION && defined(GLM_SWIZZLE))
71  union
72  {
73  struct{ T x, y; };
74  struct{ T r, g; };
75  struct{ T s, t; };
76 
77  _GLM_SWIZZLE2_2_MEMBERS(T, P, tvec2, x, y)
78  _GLM_SWIZZLE2_2_MEMBERS(T, P, tvec2, r, g)
79  _GLM_SWIZZLE2_2_MEMBERS(T, P, tvec2, s, t)
80  _GLM_SWIZZLE2_3_MEMBERS(T, P, tvec3, x, y)
81  _GLM_SWIZZLE2_3_MEMBERS(T, P, tvec3, r, g)
82  _GLM_SWIZZLE2_3_MEMBERS(T, P, tvec3, s, t)
83  _GLM_SWIZZLE2_4_MEMBERS(T, P, tvec4, x, y)
84  _GLM_SWIZZLE2_4_MEMBERS(T, P, tvec4, r, g)
85  _GLM_SWIZZLE2_4_MEMBERS(T, P, tvec4, s, t)
86  };
87 # else
88  union {T x, r, s;};
89  union {T y, g, t;};
90 
91 # ifdef GLM_SWIZZLE
92  GLM_SWIZZLE_GEN_VEC_FROM_VEC2(T, P, detail::tvec2, detail::tvec2, detail::tvec3, detail::tvec4)
93 # endif
94 # endif
95 
97  // Accesses
98 
99  GLM_FUNC_DECL T & operator[](length_t i);
100  GLM_FUNC_DECL T const & operator[](length_t i) const;
101 
103  // Implicit basic constructors
104 
105  GLM_FUNC_DECL tvec2();
106  GLM_FUNC_DECL tvec2(tvec2<T, P> const & v);
107  template <precision Q>
108  GLM_FUNC_DECL tvec2(tvec2<T, Q> const & v);
109 
110 #if(GLM_HAS_INITIALIZER_LISTS)
111  template <typename U>
112  GLM_FUNC_DECL tvec2(std::initializer_list<U> const & v);
113 #endif//GLM_HAS_INITIALIZER_LISTS
114 
116  // Explicit basic constructors
117 
118  GLM_FUNC_DECL explicit tvec2(
119  ctor);
120  GLM_FUNC_DECL explicit tvec2(
121  T const & s);
122  GLM_FUNC_DECL explicit tvec2(
123  T const & s1,
124  T const & s2);
125 
127  // Swizzle constructors
128 
129 # if(GLM_HAS_ANONYMOUS_UNION && defined(GLM_SWIZZLE))
130  template <int E0, int E1>
131  GLM_FUNC_DECL tvec2(_swizzle<2,T, P, tvec2<T, P>, E0, E1,-1,-2> const & that)
132  {
133  *this = that();
134  }
135 # endif//(GLM_HAS_ANONYMOUS_UNION && defined(GLM_SWIZZLE))
136 
138  // Conversion constructors
139 
141  template <typename U, typename V>
142  GLM_FUNC_DECL explicit tvec2(
143  U const & x,
144  V const & y);
145 
147  // Conversion vector constructors
148 
150  template <typename U, precision Q>
151  GLM_FUNC_DECL explicit tvec2(tvec2<U, Q> const & v);
153  template <typename U, precision Q>
154  GLM_FUNC_DECL explicit tvec2(tvec3<U, Q> const & v);
156  template <typename U, precision Q>
157  GLM_FUNC_DECL explicit tvec2(tvec4<U, Q> const & v);
158 
160  // Unary arithmetic operators
161 
162  GLM_FUNC_DECL tvec2<T, P> & operator= (tvec2<T, P> const & v);
163  template <typename U>
164  GLM_FUNC_DECL tvec2<T, P> & operator= (tvec2<U, P> const & v);
165 
166  template <typename U>
167  GLM_FUNC_DECL tvec2<T, P> & operator+=(U s);
168  template <typename U>
169  GLM_FUNC_DECL tvec2<T, P> & operator+=(tvec2<U, P> const & v);
170  template <typename U>
171  GLM_FUNC_DECL tvec2<T, P> & operator-=(U s);
172  template <typename U>
173  GLM_FUNC_DECL tvec2<T, P> & operator-=(tvec2<U, P> const & v);
174  template <typename U>
175  GLM_FUNC_DECL tvec2<T, P> & operator*=(U s);
176  template <typename U>
177  GLM_FUNC_DECL tvec2<T, P> & operator*=(tvec2<U, P> const & v);
178  template <typename U>
179  GLM_FUNC_DECL tvec2<T, P> & operator/=(U s);
180  template <typename U>
181  GLM_FUNC_DECL tvec2<T, P> & operator/=(tvec2<U, P> const & v);
182 
184  // Increment and decrement operators
185 
186  GLM_FUNC_DECL tvec2<T, P> & operator++();
187  GLM_FUNC_DECL tvec2<T, P> & operator--();
188  GLM_FUNC_DECL tvec2<T, P> operator++(int);
189  GLM_FUNC_DECL tvec2<T, P> operator--(int);
190 
192  // Unary bit operators
193 
194  template <typename U>
195  GLM_FUNC_DECL tvec2<T, P> & operator%= (U s);
196  template <typename U>
197  GLM_FUNC_DECL tvec2<T, P> & operator%= (tvec2<U, P> const & v);
198  template <typename U>
199  GLM_FUNC_DECL tvec2<T, P> & operator&= (U s);
200  template <typename U>
201  GLM_FUNC_DECL tvec2<T, P> & operator&= (tvec2<U, P> const & v);
202  template <typename U>
203  GLM_FUNC_DECL tvec2<T, P> & operator|= (U s);
204  template <typename U>
205  GLM_FUNC_DECL tvec2<T, P> & operator|= (tvec2<U, P> const & v);
206  template <typename U>
207  GLM_FUNC_DECL tvec2<T, P> & operator^= (U s);
208  template <typename U>
209  GLM_FUNC_DECL tvec2<T, P> & operator^= (tvec2<U, P> const & v);
210  template <typename U>
211  GLM_FUNC_DECL tvec2<T, P> & operator<<=(U s);
212  template <typename U>
213  GLM_FUNC_DECL tvec2<T, P> & operator<<=(tvec2<U, P> const & v);
214  template <typename U>
215  GLM_FUNC_DECL tvec2<T, P> & operator>>=(U s);
216  template <typename U>
217  GLM_FUNC_DECL tvec2<T, P> & operator>>=(tvec2<U, P> const & v);
218  };
219 
220  template <typename T, precision P>
221  GLM_FUNC_DECL tvec2<T, P> operator+(tvec2<T, P> const & v, T const & s);
222 
223  template <typename T, precision P>
224  GLM_FUNC_DECL tvec2<T, P> operator+(T const & s, tvec2<T, P> const & v);
225 
226  template <typename T, precision P>
227  GLM_FUNC_DECL tvec2<T, P> operator+(tvec2<T, P> const & v1, tvec2<T, P> const & v2);
228 
229  template <typename T, precision P>
230  GLM_FUNC_DECL tvec2<T, P> operator-(tvec2<T, P> const & v, T const & s);
231 
232  template <typename T, precision P>
233  GLM_FUNC_DECL tvec2<T, P> operator-(T const & s, tvec2<T, P> const & v);
234 
235  template <typename T, precision P>
236  GLM_FUNC_DECL tvec2<T, P> operator- (tvec2<T, P> const & v1, tvec2<T, P> const & v2);
237 
238  template <typename T, precision P>
239  GLM_FUNC_DECL tvec2<T, P> operator*(tvec2<T, P> const & v, T const & s);
240 
241  template <typename T, precision P>
242  GLM_FUNC_DECL tvec2<T, P> operator*(T const & s, tvec2<T, P> const & v);
243 
244  template <typename T, precision P>
245  GLM_FUNC_DECL tvec2<T, P> operator*(tvec2<T, P> const & v1, tvec2<T, P> const & v2);
246 
247  template <typename T, precision P>
248  GLM_FUNC_DECL tvec2<T, P> operator/(tvec2<T, P> const & v, T const & s);
249 
250  template <typename T, precision P>
251  GLM_FUNC_DECL tvec2<T, P> operator/(T const & s, tvec2<T, P> const & v);
252 
253  template <typename T, precision P>
254  GLM_FUNC_DECL tvec2<T, P> operator/(tvec2<T, P> const & v1, tvec2<T, P> const & v2);
255 
256  template <typename T, precision P>
257  GLM_FUNC_DECL tvec2<T, P> operator-(tvec2<T, P> const & v);
258 
259  template <typename T, precision P>
260  GLM_FUNC_DECL tvec2<T, P> operator%(tvec2<T, P> const & v, T const & s);
261 
262  template <typename T, precision P>
263  GLM_FUNC_DECL tvec2<T, P> operator%(T const & s, tvec2<T, P> const & v);
264 
265  template <typename T, precision P>
266  GLM_FUNC_DECL tvec2<T, P> operator%(tvec2<T, P> const & v1, tvec2<T, P> const & v2);
267 
268  template <typename T, precision P>
269  GLM_FUNC_DECL tvec2<T, P> operator&(tvec2<T, P> const & v, T const & s);
270 
271  template <typename T, precision P>
272  GLM_FUNC_DECL tvec2<T, P> operator&(T const & s, tvec2<T, P> const & v);
273 
274  template <typename T, precision P>
275  GLM_FUNC_DECL tvec2<T, P> operator&(tvec2<T, P> const & v1, tvec2<T, P> const & v2);
276 
277  template <typename T, precision P>
278  GLM_FUNC_DECL tvec2<T, P> operator|(tvec2<T, P> const & v, T const & s);
279 
280  template <typename T, precision P>
281  GLM_FUNC_DECL tvec2<T, P> operator|(T const & s, tvec2<T, P> const & v);
282 
283  template <typename T, precision P>
284  GLM_FUNC_DECL tvec2<T, P> operator|(tvec2<T, P> const & v1, tvec2<T, P> const & v2);
285 
286  template <typename T, precision P>
287  GLM_FUNC_DECL tvec2<T, P> operator^(tvec2<T, P> const & v, T const & s);
288 
289  template <typename T, precision P>
290  GLM_FUNC_DECL tvec2<T, P> operator^(T const & s, tvec2<T, P> const & v);
291 
292  template <typename T, precision P>
293  GLM_FUNC_DECL tvec2<T, P> operator^(tvec2<T, P> const & v1, tvec2<T, P> const & v2);
294 
295  template <typename T, precision P>
296  GLM_FUNC_DECL tvec2<T, P> operator<<(tvec2<T, P> const & v, T const & s);
297 
298  template <typename T, precision P>
299  GLM_FUNC_DECL tvec2<T, P> operator<<(T const & s, tvec2<T, P> const & v);
300 
301  template <typename T, precision P>
302  GLM_FUNC_DECL tvec2<T, P> operator<<(tvec2<T, P> const & v1, tvec2<T, P> const & v2);
303 
304  template <typename T, precision P>
305  GLM_FUNC_DECL tvec2<T, P> operator>>(tvec2<T, P> const & v, T const & s);
306 
307  template <typename T, precision P>
308  GLM_FUNC_DECL tvec2<T, P> operator>>(T const & s, tvec2<T, P> const & v);
309 
310  template <typename T, precision P>
311  GLM_FUNC_DECL tvec2<T, P> operator>>(tvec2<T, P> const & v1, tvec2<T, P> const & v2);
312 
313  template <typename T, precision P>
314  GLM_FUNC_DECL tvec2<T, P> operator~(tvec2<T, P> const & v);
315 
316 }//namespace detail
317 }//namespace glm
318 
319 #ifndef GLM_EXTERNAL_TEMPLATE
320 #include "type_vec2.inl"
321 #endif//GLM_EXTERNAL_TEMPLATE
322 
323 #endif//glm_core_type_gentype2
GLM_FUNC_DECL genType::value_type length(genType const &x)
Returns the length of x, i.e., sqrt(x * x).