vec_operations3.hpp 19 KB

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