vec_operations2.hpp 18 KB

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