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