]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/qvm/include/boost/qvm/gen/vec_operations4.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / qvm / include / boost / qvm / gen / vec_operations4.hpp
CommitLineData
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
21namespace
22boost
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