]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | //Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc. |
2 | ||
3 | //Distributed under the Boost Software License, Version 1.0. (See accompanying | |
4 | //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
5 | ||
6 | #ifndef BOOST_QVM_AD4F14F2444066D06BC430B7323BA122 | |
7 | #define BOOST_QVM_AD4F14F2444066D06BC430B7323BA122 | |
8 | ||
9 | //This file was generated by a program. Do not edit manually. | |
10 | ||
11 | #include <boost/qvm/deduce_scalar.hpp> | |
12 | #include <boost/qvm/deduce_vec.hpp> | |
13 | #include <boost/qvm/enable_if.hpp> | |
14 | #include <boost/qvm/error.hpp> | |
15 | #include <boost/qvm/inline.hpp> | |
16 | #include <boost/qvm/math.hpp> | |
17 | #include <boost/qvm/static_assert.hpp> | |
18 | #include <boost/qvm/throw_exception.hpp> | |
19 | #include <boost/qvm/vec_traits.hpp> | |
20 | ||
21 | namespace | |
22 | boost | |
23 | { | |
24 | namespace | |
25 | qvm | |
26 | { | |
27 | template <class A,class B> | |
28 | BOOST_QVM_INLINE_OPERATIONS | |
29 | typename lazy_enable_if_c< | |
30 | vec_traits<A>::dim==4 && vec_traits<B>::dim==4, | |
31 | deduce_vec2<A,B,4> >::type | |
32 | operator+( A const & a, B const & b ) | |
33 | { | |
34 | typedef typename deduce_vec2<A,B,4>::type R; | |
35 | BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==4); | |
36 | R r; | |
37 | vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)+vec_traits<B>::template read_element<0>(b); | |
38 | vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)+vec_traits<B>::template read_element<1>(b); | |
39 | vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)+vec_traits<B>::template read_element<2>(b); | |
40 | vec_traits<R>::template write_element<3>(r)=vec_traits<A>::template read_element<3>(a)+vec_traits<B>::template read_element<3>(b); | |
41 | return r; | |
42 | } | |
43 | ||
44 | namespace | |
45 | sfinae | |
46 | { | |
47 | using ::boost::qvm::operator+; | |
48 | } | |
49 | ||
50 | namespace | |
51 | qvm_detail | |
52 | { | |
53 | template <int D> | |
54 | struct plus_vv_defined; | |
55 | ||
56 | template <> | |
57 | struct | |
58 | plus_vv_defined<4> | |
59 | { | |
60 | static bool const value=true; | |
61 | }; | |
62 | } | |
63 | ||
64 | template <class A,class B> | |
65 | BOOST_QVM_INLINE_OPERATIONS | |
66 | typename lazy_enable_if_c< | |
67 | vec_traits<A>::dim==4 && vec_traits<B>::dim==4, | |
68 | deduce_vec2<A,B,4> >::type | |
69 | operator-( A const & a, B const & b ) | |
70 | { | |
71 | typedef typename deduce_vec2<A,B,4>::type R; | |
72 | BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==4); | |
73 | R r; | |
74 | vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)-vec_traits<B>::template read_element<0>(b); | |
75 | vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)-vec_traits<B>::template read_element<1>(b); | |
76 | vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)-vec_traits<B>::template read_element<2>(b); | |
77 | vec_traits<R>::template write_element<3>(r)=vec_traits<A>::template read_element<3>(a)-vec_traits<B>::template read_element<3>(b); | |
78 | return r; | |
79 | } | |
80 | ||
81 | namespace | |
82 | sfinae | |
83 | { | |
84 | using ::boost::qvm::operator-; | |
85 | } | |
86 | ||
87 | namespace | |
88 | qvm_detail | |
89 | { | |
90 | template <int D> | |
91 | struct minus_vv_defined; | |
92 | ||
93 | template <> | |
94 | struct | |
95 | minus_vv_defined<4> | |
96 | { | |
97 | static bool const value=true; | |
98 | }; | |
99 | } | |
100 | ||
101 | template <class A,class B> | |
102 | BOOST_QVM_INLINE_OPERATIONS | |
103 | typename enable_if_c< | |
104 | vec_traits<A>::dim==4 && vec_traits<B>::dim==4, | |
105 | A &>::type | |
106 | operator+=( A & a, B const & b ) | |
107 | { | |
108 | vec_traits<A>::template write_element<0>(a)+=vec_traits<B>::template read_element<0>(b); | |
109 | vec_traits<A>::template write_element<1>(a)+=vec_traits<B>::template read_element<1>(b); | |
110 | vec_traits<A>::template write_element<2>(a)+=vec_traits<B>::template read_element<2>(b); | |
111 | vec_traits<A>::template write_element<3>(a)+=vec_traits<B>::template read_element<3>(b); | |
112 | return a; | |
113 | } | |
114 | ||
115 | namespace | |
116 | sfinae | |
117 | { | |
118 | using ::boost::qvm::operator+=; | |
119 | } | |
120 | ||
121 | namespace | |
122 | qvm_detail | |
123 | { | |
124 | template <int D> | |
125 | struct plus_eq_vv_defined; | |
126 | ||
127 | template <> | |
128 | struct | |
129 | plus_eq_vv_defined<4> | |
130 | { | |
131 | static bool const value=true; | |
132 | }; | |
133 | } | |
134 | ||
135 | template <class A,class B> | |
136 | BOOST_QVM_INLINE_OPERATIONS | |
137 | typename enable_if_c< | |
138 | vec_traits<A>::dim==4 && vec_traits<B>::dim==4, | |
139 | A &>::type | |
140 | operator-=( A & a, B const & b ) | |
141 | { | |
142 | vec_traits<A>::template write_element<0>(a)-=vec_traits<B>::template read_element<0>(b); | |
143 | vec_traits<A>::template write_element<1>(a)-=vec_traits<B>::template read_element<1>(b); | |
144 | vec_traits<A>::template write_element<2>(a)-=vec_traits<B>::template read_element<2>(b); | |
145 | vec_traits<A>::template write_element<3>(a)-=vec_traits<B>::template read_element<3>(b); | |
146 | return a; | |
147 | } | |
148 | ||
149 | namespace | |
150 | sfinae | |
151 | { | |
152 | using ::boost::qvm::operator-=; | |
153 | } | |
154 | ||
155 | namespace | |
156 | qvm_detail | |
157 | { | |
158 | template <int D> | |
159 | struct minus_eq_vv_defined; | |
160 | ||
161 | template <> | |
162 | struct | |
163 | minus_eq_vv_defined<4> | |
164 | { | |
165 | static bool const value=true; | |
166 | }; | |
167 | } | |
168 | ||
169 | template <class A,class B> | |
170 | BOOST_QVM_INLINE_OPERATIONS | |
171 | typename lazy_enable_if_c< | |
172 | vec_traits<A>::dim==4 && is_scalar<B>::value, | |
173 | deduce_vec<A> >::type | |
174 | operator*( A const & a, B b ) | |
175 | { | |
176 | typedef typename deduce_vec<A>::type R; | |
177 | R r; | |
178 | vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)*b; | |
179 | vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)*b; | |
180 | vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)*b; | |
181 | vec_traits<R>::template write_element<3>(r)=vec_traits<A>::template read_element<3>(a)*b; | |
182 | return r; | |
183 | } | |
184 | ||
185 | namespace | |
186 | sfinae | |
187 | { | |
188 | using ::boost::qvm::operator*; | |
189 | } | |
190 | ||
191 | namespace | |
192 | qvm_detail | |
193 | { | |
194 | template <int D> | |
195 | struct mul_vs_defined; | |
196 | ||
197 | template <> | |
198 | struct | |
199 | mul_vs_defined<4> | |
200 | { | |
201 | static bool const value=true; | |
202 | }; | |
203 | } | |
204 | ||
205 | template <class A,class B> | |
206 | BOOST_QVM_INLINE_OPERATIONS | |
207 | typename enable_if_c< | |
208 | vec_traits<A>::dim==4 && is_scalar<B>::value, | |
209 | A &>::type | |
210 | operator*=( A & a, B b ) | |
211 | { | |
212 | vec_traits<A>::template write_element<0>(a)*=b; | |
213 | vec_traits<A>::template write_element<1>(a)*=b; | |
214 | vec_traits<A>::template write_element<2>(a)*=b; | |
215 | vec_traits<A>::template write_element<3>(a)*=b; | |
216 | return a; | |
217 | } | |
218 | ||
219 | namespace | |
220 | sfinae | |
221 | { | |
222 | using ::boost::qvm::operator*=; | |
223 | } | |
224 | ||
225 | namespace | |
226 | qvm_detail | |
227 | { | |
228 | template <int D> | |
229 | struct mul_eq_vs_defined; | |
230 | ||
231 | template <> | |
232 | struct | |
233 | mul_eq_vs_defined<4> | |
234 | { | |
235 | static bool const value=true; | |
236 | }; | |
237 | } | |
238 | ||
239 | template <class A,class B> | |
240 | BOOST_QVM_INLINE_OPERATIONS | |
241 | typename lazy_enable_if_c< | |
242 | vec_traits<A>::dim==4 && is_scalar<B>::value, | |
243 | deduce_vec<A> >::type | |
244 | operator/( A const & a, B b ) | |
245 | { | |
246 | typedef typename deduce_vec<A>::type R; | |
247 | R r; | |
248 | vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)/b; | |
249 | vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)/b; | |
250 | vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)/b; | |
251 | vec_traits<R>::template write_element<3>(r)=vec_traits<A>::template read_element<3>(a)/b; | |
252 | return r; | |
253 | } | |
254 | ||
255 | namespace | |
256 | sfinae | |
257 | { | |
258 | using ::boost::qvm::operator/; | |
259 | } | |
260 | ||
261 | namespace | |
262 | qvm_detail | |
263 | { | |
264 | template <int D> | |
265 | struct div_vs_defined; | |
266 | ||
267 | template <> | |
268 | struct | |
269 | div_vs_defined<4> | |
270 | { | |
271 | static bool const value=true; | |
272 | }; | |
273 | } | |
274 | ||
275 | template <class A,class B> | |
276 | BOOST_QVM_INLINE_OPERATIONS | |
277 | typename enable_if_c< | |
278 | vec_traits<A>::dim==4 && is_scalar<B>::value, | |
279 | A &>::type | |
280 | operator/=( A & a, B b ) | |
281 | { | |
282 | vec_traits<A>::template write_element<0>(a)/=b; | |
283 | vec_traits<A>::template write_element<1>(a)/=b; | |
284 | vec_traits<A>::template write_element<2>(a)/=b; | |
285 | vec_traits<A>::template write_element<3>(a)/=b; | |
286 | return a; | |
287 | } | |
288 | ||
289 | namespace | |
290 | sfinae | |
291 | { | |
292 | using ::boost::qvm::operator/=; | |
293 | } | |
294 | ||
295 | namespace | |
296 | qvm_detail | |
297 | { | |
298 | template <int D> | |
299 | struct div_eq_vs_defined; | |
300 | ||
301 | template <> | |
302 | struct | |
303 | div_eq_vs_defined<4> | |
304 | { | |
305 | static bool const value=true; | |
306 | }; | |
307 | } | |
308 | ||
309 | template <class A,class B> | |
310 | BOOST_QVM_INLINE_OPERATIONS | |
311 | typename enable_if_c< | |
312 | vec_traits<A>::dim==4 && vec_traits<B>::dim==4, | |
313 | A &>::type | |
314 | assign( A & a, B const & b ) | |
315 | { | |
316 | vec_traits<A>::template write_element<0>(a)=vec_traits<B>::template read_element<0>(b); | |
317 | vec_traits<A>::template write_element<1>(a)=vec_traits<B>::template read_element<1>(b); | |
318 | vec_traits<A>::template write_element<2>(a)=vec_traits<B>::template read_element<2>(b); | |
319 | vec_traits<A>::template write_element<3>(a)=vec_traits<B>::template read_element<3>(b); | |
320 | return a; | |
321 | } | |
322 | ||
323 | namespace | |
324 | sfinae | |
325 | { | |
326 | using ::boost::qvm::assign; | |
327 | } | |
328 | ||
329 | namespace | |
330 | qvm_detail | |
331 | { | |
332 | template <int D> | |
333 | struct assign_vv_defined; | |
334 | ||
335 | template <> | |
336 | struct | |
337 | assign_vv_defined<4> | |
338 | { | |
339 | static bool const value=true; | |
340 | }; | |
341 | } | |
342 | ||
343 | template <class R,class A> | |
344 | BOOST_QVM_INLINE_OPERATIONS | |
345 | typename enable_if_c< | |
346 | is_vec<A>::value && | |
347 | vec_traits<R>::dim==4 && vec_traits<A>::dim==4, | |
348 | R>::type | |
349 | convert_to( A const & a ) | |
350 | { | |
351 | R r; | |
352 | vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a); | |
353 | vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a); | |
354 | vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a); | |
355 | vec_traits<R>::template write_element<3>(r)=vec_traits<A>::template read_element<3>(a); | |
356 | return r; | |
357 | } | |
358 | ||
359 | namespace | |
360 | sfinae | |
361 | { | |
362 | using ::boost::qvm::convert_to; | |
363 | } | |
364 | ||
365 | namespace | |
366 | qvm_detail | |
367 | { | |
368 | template <int D> | |
369 | struct convert_to_v_defined; | |
370 | ||
371 | template <> | |
372 | struct | |
373 | convert_to_v_defined<4> | |
374 | { | |
375 | static bool const value=true; | |
376 | }; | |
377 | } | |
378 | ||
379 | template <class A,class B> | |
380 | BOOST_QVM_INLINE_OPERATIONS | |
381 | typename enable_if_c< | |
382 | vec_traits<A>::dim==4 && vec_traits<B>::dim==4, | |
383 | bool>::type | |
384 | operator==( A const & a, B const & b ) | |
385 | { | |
386 | return | |
387 | vec_traits<A>::template read_element<0>(a)==vec_traits<B>::template read_element<0>(b) && | |
388 | vec_traits<A>::template read_element<1>(a)==vec_traits<B>::template read_element<1>(b) && | |
389 | vec_traits<A>::template read_element<2>(a)==vec_traits<B>::template read_element<2>(b) && | |
390 | vec_traits<A>::template read_element<3>(a)==vec_traits<B>::template read_element<3>(b); | |
391 | } | |
392 | ||
393 | namespace | |
394 | sfinae | |
395 | { | |
396 | using ::boost::qvm::operator==; | |
397 | } | |
398 | ||
399 | namespace | |
400 | qvm_detail | |
401 | { | |
402 | template <int D> | |
403 | struct eq_vv_defined; | |
404 | ||
405 | template <> | |
406 | struct | |
407 | eq_vv_defined<4> | |
408 | { | |
409 | static bool const value=true; | |
410 | }; | |
411 | } | |
412 | ||
413 | template <class A,class B> | |
414 | BOOST_QVM_INLINE_OPERATIONS | |
415 | typename enable_if_c< | |
416 | vec_traits<A>::dim==4 && vec_traits<B>::dim==4, | |
417 | bool>::type | |
418 | operator!=( A const & a, B const & b ) | |
419 | { | |
420 | return | |
421 | !(vec_traits<A>::template read_element<0>(a)==vec_traits<B>::template read_element<0>(b)) || | |
422 | !(vec_traits<A>::template read_element<1>(a)==vec_traits<B>::template read_element<1>(b)) || | |
423 | !(vec_traits<A>::template read_element<2>(a)==vec_traits<B>::template read_element<2>(b)) || | |
424 | !(vec_traits<A>::template read_element<3>(a)==vec_traits<B>::template read_element<3>(b)); | |
425 | } | |
426 | ||
427 | namespace | |
428 | sfinae | |
429 | { | |
430 | using ::boost::qvm::operator!=; | |
431 | } | |
432 | ||
433 | namespace | |
434 | qvm_detail | |
435 | { | |
436 | template <int D> | |
437 | struct neq_vv_defined; | |
438 | ||
439 | template <> | |
440 | struct | |
441 | neq_vv_defined<4> | |
442 | { | |
443 | static bool const value=true; | |
444 | }; | |
445 | } | |
446 | ||
447 | template <class A> | |
448 | BOOST_QVM_INLINE_OPERATIONS | |
449 | typename lazy_enable_if_c< | |
450 | vec_traits<A>::dim==4, | |
451 | deduce_vec<A> >::type | |
452 | operator-( A const & a ) | |
453 | { | |
454 | typedef typename deduce_vec<A>::type R; | |
455 | R r; | |
456 | vec_traits<R>::template write_element<0>(r)=-vec_traits<A>::template read_element<0>(a); | |
457 | vec_traits<R>::template write_element<1>(r)=-vec_traits<A>::template read_element<1>(a); | |
458 | vec_traits<R>::template write_element<2>(r)=-vec_traits<A>::template read_element<2>(a); | |
459 | vec_traits<R>::template write_element<3>(r)=-vec_traits<A>::template read_element<3>(a); | |
460 | return r; | |
461 | } | |
462 | ||
463 | namespace | |
464 | sfinae | |
465 | { | |
466 | using ::boost::qvm::operator-; | |
467 | } | |
468 | ||
469 | namespace | |
470 | qvm_detail | |
471 | { | |
472 | template <int D> | |
473 | struct minus_v_defined; | |
474 | ||
475 | template <> | |
476 | struct | |
477 | minus_v_defined<4> | |
478 | { | |
479 | static bool const value=true; | |
480 | }; | |
481 | } | |
482 | ||
483 | template <class A> | |
484 | BOOST_QVM_INLINE_OPERATIONS | |
485 | typename enable_if_c< | |
486 | is_vec<A>::value && vec_traits<A>::dim==4, | |
487 | typename vec_traits<A>::scalar_type>::type | |
488 | mag( A const & a ) | |
489 | { | |
490 | typedef typename vec_traits<A>::scalar_type T; | |
491 | T const a0=vec_traits<A>::template read_element<0>(a); | |
492 | T const a1=vec_traits<A>::template read_element<1>(a); | |
493 | T const a2=vec_traits<A>::template read_element<2>(a); | |
494 | T const a3=vec_traits<A>::template read_element<3>(a); | |
495 | T const m2=a0*a0+a1*a1+a2*a2+a3*a3; | |
496 | T const mag=sqrt<T>(m2); | |
497 | return mag; | |
498 | } | |
499 | ||
500 | namespace | |
501 | sfinae | |
502 | { | |
503 | using ::boost::qvm::mag; | |
504 | } | |
505 | ||
506 | namespace | |
507 | qvm_detail | |
508 | { | |
509 | template <int D> | |
510 | struct mag_v_defined; | |
511 | ||
512 | template <> | |
513 | struct | |
514 | mag_v_defined<4> | |
515 | { | |
516 | static bool const value=true; | |
517 | }; | |
518 | } | |
519 | ||
520 | template <class A> | |
521 | BOOST_QVM_INLINE_OPERATIONS | |
522 | typename enable_if_c< | |
523 | is_vec<A>::value && vec_traits<A>::dim==4, | |
524 | typename vec_traits<A>::scalar_type>::type | |
525 | mag_sqr( A const & a ) | |
526 | { | |
527 | typedef typename vec_traits<A>::scalar_type T; | |
528 | T const a0=vec_traits<A>::template read_element<0>(a); | |
529 | T const a1=vec_traits<A>::template read_element<1>(a); | |
530 | T const a2=vec_traits<A>::template read_element<2>(a); | |
531 | T const a3=vec_traits<A>::template read_element<3>(a); | |
532 | T const m2=a0*a0+a1*a1+a2*a2+a3*a3; | |
533 | return m2; | |
534 | } | |
535 | ||
536 | namespace | |
537 | sfinae | |
538 | { | |
539 | using ::boost::qvm::mag_sqr; | |
540 | } | |
541 | ||
542 | namespace | |
543 | qvm_detail | |
544 | { | |
545 | template <int D> | |
546 | struct mag_sqr_v_defined; | |
547 | ||
548 | template <> | |
549 | struct | |
550 | mag_sqr_v_defined<4> | |
551 | { | |
552 | static bool const value=true; | |
553 | }; | |
554 | } | |
555 | ||
556 | template <class A> | |
557 | BOOST_QVM_INLINE_OPERATIONS | |
558 | typename lazy_enable_if_c< | |
559 | vec_traits<A>::dim==4, | |
560 | deduce_vec<A> >::type | |
561 | normalized( A const & a ) | |
562 | { | |
563 | typedef typename vec_traits<A>::scalar_type T; | |
564 | T const a0=vec_traits<A>::template read_element<0>(a); | |
565 | T const a1=vec_traits<A>::template read_element<1>(a); | |
566 | T const a2=vec_traits<A>::template read_element<2>(a); | |
567 | T const a3=vec_traits<A>::template read_element<3>(a); | |
568 | T const m2=a0*a0+a1*a1+a2*a2+a3*a3; | |
569 | if( m2==scalar_traits<typename vec_traits<A>::scalar_type>::value(0) ) | |
570 | BOOST_QVM_THROW_EXCEPTION(zero_magnitude_error()); | |
571 | T const rm=scalar_traits<T>::value(1)/sqrt<T>(m2); | |
572 | typedef typename deduce_vec<A>::type R; | |
573 | R r; | |
574 | vec_traits<R>::template write_element<0>(r)=a0*rm; | |
575 | vec_traits<R>::template write_element<1>(r)=a1*rm; | |
576 | vec_traits<R>::template write_element<2>(r)=a2*rm; | |
577 | vec_traits<R>::template write_element<3>(r)=a3*rm; | |
578 | return r; | |
579 | } | |
580 | ||
581 | namespace | |
582 | sfinae | |
583 | { | |
584 | using ::boost::qvm::normalized; | |
585 | } | |
586 | ||
587 | template <class A> | |
588 | BOOST_QVM_INLINE_OPERATIONS | |
589 | typename enable_if_c< | |
590 | vec_traits<A>::dim==4, | |
591 | void>::type | |
592 | normalize( A & a ) | |
593 | { | |
594 | typedef typename vec_traits<A>::scalar_type T; | |
595 | T const a0=vec_traits<A>::template read_element<0>(a); | |
596 | T const a1=vec_traits<A>::template read_element<1>(a); | |
597 | T const a2=vec_traits<A>::template read_element<2>(a); | |
598 | T const a3=vec_traits<A>::template read_element<3>(a); | |
599 | T const m2=a0*a0+a1*a1+a2*a2+a3*a3; | |
600 | if( m2==scalar_traits<typename vec_traits<A>::scalar_type>::value(0) ) | |
601 | BOOST_QVM_THROW_EXCEPTION(zero_magnitude_error()); | |
602 | T const rm=scalar_traits<T>::value(1)/sqrt<T>(m2); | |
603 | vec_traits<A>::template write_element<0>(a)*=rm; | |
604 | vec_traits<A>::template write_element<1>(a)*=rm; | |
605 | vec_traits<A>::template write_element<2>(a)*=rm; | |
606 | vec_traits<A>::template write_element<3>(a)*=rm; | |
607 | } | |
608 | ||
609 | namespace | |
610 | sfinae | |
611 | { | |
612 | using ::boost::qvm::normalize; | |
613 | } | |
614 | ||
615 | namespace | |
616 | qvm_detail | |
617 | { | |
618 | template <int D> | |
619 | struct normalize_v_defined; | |
620 | ||
621 | template <> | |
622 | struct | |
623 | normalize_v_defined<4> | |
624 | { | |
625 | static bool const value=true; | |
626 | }; | |
627 | } | |
628 | ||
629 | template <class A,class B> | |
630 | BOOST_QVM_INLINE_OPERATIONS | |
631 | typename lazy_enable_if_c< | |
632 | vec_traits<A>::dim==4 && vec_traits<B>::dim==4, | |
633 | deduce_scalar<typename vec_traits<A>::scalar_type,typename vec_traits<B>::scalar_type> >::type | |
634 | dot( A const & a, B const & b ) | |
635 | { | |
636 | typedef typename vec_traits<A>::scalar_type Ta; | |
637 | typedef typename vec_traits<B>::scalar_type Tb; | |
638 | typedef typename deduce_scalar<Ta,Tb>::type Tr; | |
639 | Ta const a0=vec_traits<A>::template read_element<0>(a); | |
640 | Ta const a1=vec_traits<A>::template read_element<1>(a); | |
641 | Ta const a2=vec_traits<A>::template read_element<2>(a); | |
642 | Ta const a3=vec_traits<A>::template read_element<3>(a); | |
643 | Tb const b0=vec_traits<B>::template read_element<0>(b); | |
644 | Tb const b1=vec_traits<B>::template read_element<1>(b); | |
645 | Tb const b2=vec_traits<B>::template read_element<2>(b); | |
646 | Tb const b3=vec_traits<B>::template read_element<3>(b); | |
647 | Tr const dot=a0*b0+a1*b1+a2*b2+a3*b3; | |
648 | return dot; | |
649 | } | |
650 | ||
651 | namespace | |
652 | sfinae | |
653 | { | |
654 | using ::boost::qvm::dot; | |
655 | } | |
656 | ||
657 | namespace | |
658 | qvm_detail | |
659 | { | |
660 | template <int D> | |
661 | struct dot_vv_defined; | |
662 | ||
663 | template <> | |
664 | struct | |
665 | dot_vv_defined<4> | |
666 | { | |
667 | static bool const value=true; | |
668 | }; | |
669 | } | |
670 | ||
671 | } | |
672 | } | |
673 | ||
674 | #endif |