vec_operations4.hpp 21 KB

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