1 //Copyright (c) 2008-2017 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_BF14D67E2DDC8E6683EF574961FF698F 7 #define BOOST_QVM_BF14D67E2DDC8E6683EF574961FF698F 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/error.hpp> 14 #include <boost/qvm/gen/vec_assign4.hpp> 15 #include <boost/qvm/math.hpp> 16 #include <boost/qvm/static_assert.hpp> 17 #include <boost/qvm/throw_exception.hpp> 18 19 namespace 20 boost 21 { 22 namespace 23 qvm 24 { 25 template <class A,class B> 26 BOOST_QVM_INLINE_OPERATIONS 27 typename lazy_enable_if_c< 28 vec_traits<A>::dim==4 && vec_traits<B>::dim==4, 29 deduce_vec2<A,B,4> >::type operator +(A const & a,B const & b)30 operator+( A const & a, B const & b ) 31 { 32 typedef typename deduce_vec2<A,B,4>::type R; 33 BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==4); 34 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); 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); 37 vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)+vec_traits<B>::template read_element<2>(b); 38 vec_traits<R>::template write_element<3>(r)=vec_traits<A>::template read_element<3>(a)+vec_traits<B>::template read_element<3>(b); 39 return r; 40 } 41 42 namespace 43 sfinae 44 { 45 using ::boost::qvm::operator+; 46 } 47 48 namespace 49 qvm_detail 50 { 51 template <int D> 52 struct plus_vv_defined; 53 54 template <> 55 struct 56 plus_vv_defined<4> 57 { 58 static bool const value=true; 59 }; 60 } 61 62 template <class A,class B> 63 BOOST_QVM_INLINE_OPERATIONS 64 typename lazy_enable_if_c< 65 vec_traits<A>::dim==4 && vec_traits<B>::dim==4, 66 deduce_vec2<A,B,4> >::type operator -(A const & a,B const & b)67 operator-( A const & a, B const & b ) 68 { 69 typedef typename deduce_vec2<A,B,4>::type R; 70 BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==4); 71 R r; 72 vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)-vec_traits<B>::template read_element<0>(b); 73 vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)-vec_traits<B>::template read_element<1>(b); 74 vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)-vec_traits<B>::template read_element<2>(b); 75 vec_traits<R>::template write_element<3>(r)=vec_traits<A>::template read_element<3>(a)-vec_traits<B>::template read_element<3>(b); 76 return r; 77 } 78 79 namespace 80 sfinae 81 { 82 using ::boost::qvm::operator-; 83 } 84 85 namespace 86 qvm_detail 87 { 88 template <int D> 89 struct minus_vv_defined; 90 91 template <> 92 struct 93 minus_vv_defined<4> 94 { 95 static bool const value=true; 96 }; 97 } 98 99 template <class A,class B> 100 BOOST_QVM_INLINE_OPERATIONS 101 typename enable_if_c< 102 vec_traits<A>::dim==4 && vec_traits<B>::dim==4, 103 A &>::type operator +=(A & a,B const & b)104 operator+=( A & a, B const & b ) 105 { 106 vec_traits<A>::template write_element<0>(a)+=vec_traits<B>::template read_element<0>(b); 107 vec_traits<A>::template write_element<1>(a)+=vec_traits<B>::template read_element<1>(b); 108 vec_traits<A>::template write_element<2>(a)+=vec_traits<B>::template read_element<2>(b); 109 vec_traits<A>::template write_element<3>(a)+=vec_traits<B>::template read_element<3>(b); 110 return a; 111 } 112 113 namespace 114 sfinae 115 { 116 using ::boost::qvm::operator+=; 117 } 118 119 namespace 120 qvm_detail 121 { 122 template <int D> 123 struct plus_eq_vv_defined; 124 125 template <> 126 struct 127 plus_eq_vv_defined<4> 128 { 129 static bool const value=true; 130 }; 131 } 132 133 template <class A,class B> 134 BOOST_QVM_INLINE_OPERATIONS 135 typename enable_if_c< 136 vec_traits<A>::dim==4 && vec_traits<B>::dim==4, 137 A &>::type operator -=(A & a,B const & b)138 operator-=( A & a, B const & b ) 139 { 140 vec_traits<A>::template write_element<0>(a)-=vec_traits<B>::template read_element<0>(b); 141 vec_traits<A>::template write_element<1>(a)-=vec_traits<B>::template read_element<1>(b); 142 vec_traits<A>::template write_element<2>(a)-=vec_traits<B>::template read_element<2>(b); 143 vec_traits<A>::template write_element<3>(a)-=vec_traits<B>::template read_element<3>(b); 144 return a; 145 } 146 147 namespace 148 sfinae 149 { 150 using ::boost::qvm::operator-=; 151 } 152 153 namespace 154 qvm_detail 155 { 156 template <int D> 157 struct minus_eq_vv_defined; 158 159 template <> 160 struct 161 minus_eq_vv_defined<4> 162 { 163 static bool const value=true; 164 }; 165 } 166 167 template <class A,class B> 168 BOOST_QVM_INLINE_OPERATIONS 169 typename lazy_enable_if_c< 170 vec_traits<A>::dim==4 && is_scalar<B>::value, 171 deduce_vec<A> >::type operator *(A const & a,B b)172 operator*( A const & a, B b ) 173 { 174 typedef typename deduce_vec<A>::type R; 175 R r; 176 vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)*b; 177 vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)*b; 178 vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)*b; 179 vec_traits<R>::template write_element<3>(r)=vec_traits<A>::template read_element<3>(a)*b; 180 return r; 181 } 182 183 namespace 184 sfinae 185 { 186 using ::boost::qvm::operator*; 187 } 188 189 namespace 190 qvm_detail 191 { 192 template <int D> 193 struct mul_vs_defined; 194 195 template <> 196 struct 197 mul_vs_defined<4> 198 { 199 static bool const value=true; 200 }; 201 } 202 203 template <class A,class B> 204 BOOST_QVM_INLINE_OPERATIONS 205 typename lazy_enable_if_c< 206 is_scalar<A>::value && vec_traits<B>::dim==4, 207 deduce_vec<B> >::type operator *(A a,B const & b)208 operator*( A a, B const & b ) 209 { 210 typedef typename deduce_vec<B>::type R; 211 R r; 212 vec_traits<R>::template write_element<0>(r)=a*vec_traits<B>::template read_element<0>(b); 213 vec_traits<R>::template write_element<1>(r)=a*vec_traits<B>::template read_element<1>(b); 214 vec_traits<R>::template write_element<2>(r)=a*vec_traits<B>::template read_element<2>(b); 215 vec_traits<R>::template write_element<3>(r)=a*vec_traits<B>::template read_element<3>(b); 216 return r; 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_sv_defined; 230 231 template <> 232 struct 233 mul_sv_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 enable_if_c< 242 vec_traits<A>::dim==4 && is_scalar<B>::value, 243 A &>::type operator *=(A & a,B b)244 operator*=( A & a, B b ) 245 { 246 vec_traits<A>::template write_element<0>(a)*=b; 247 vec_traits<A>::template write_element<1>(a)*=b; 248 vec_traits<A>::template write_element<2>(a)*=b; 249 vec_traits<A>::template write_element<3>(a)*=b; 250 return a; 251 } 252 253 namespace 254 sfinae 255 { 256 using ::boost::qvm::operator*=; 257 } 258 259 namespace 260 qvm_detail 261 { 262 template <int D> 263 struct mul_eq_vs_defined; 264 265 template <> 266 struct 267 mul_eq_vs_defined<4> 268 { 269 static bool const value=true; 270 }; 271 } 272 273 template <class A,class B> 274 BOOST_QVM_INLINE_OPERATIONS 275 typename lazy_enable_if_c< 276 vec_traits<A>::dim==4 && is_scalar<B>::value, 277 deduce_vec<A> >::type operator /(A const & a,B b)278 operator/( A const & a, B b ) 279 { 280 typedef typename deduce_vec<A>::type R; 281 R r; 282 vec_traits<R>::template write_element<0>(r)=vec_traits<A>::template read_element<0>(a)/b; 283 vec_traits<R>::template write_element<1>(r)=vec_traits<A>::template read_element<1>(a)/b; 284 vec_traits<R>::template write_element<2>(r)=vec_traits<A>::template read_element<2>(a)/b; 285 vec_traits<R>::template write_element<3>(r)=vec_traits<A>::template read_element<3>(a)/b; 286 return r; 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_vs_defined; 300 301 template <> 302 struct 303 div_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 && is_scalar<B>::value, 313 A &>::type operator /=(A & a,B b)314 operator/=( A & a, B b ) 315 { 316 vec_traits<A>::template write_element<0>(a)/=b; 317 vec_traits<A>::template write_element<1>(a)/=b; 318 vec_traits<A>::template write_element<2>(a)/=b; 319 vec_traits<A>::template write_element<3>(a)/=b; 320 return a; 321 } 322 323 namespace 324 sfinae 325 { 326 using ::boost::qvm::operator/=; 327 } 328 329 namespace 330 qvm_detail 331 { 332 template <int D> 333 struct div_eq_vs_defined; 334 335 template <> 336 struct 337 div_eq_vs_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 convert_to(A const & a)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 operator ==(A const & a,B const & b)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 operator !=(A const & a,B const & b)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 operator -(A const & a)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 mag(A const & a)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 mag_sqr(A const & a)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 normalized(A const & a)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 normalize(A & a)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 dot(A const & a,B const & b)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 675