type_vec1.inl 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  1. /// @ref core
  2. #include "./compute_vector_relational.hpp"
  3. namespace glm
  4. {
  5. // -- Implicit basic constructors --
  6. # if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE
  7. template<typename T, qualifier Q>
  8. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec()
  9. # if GLM_CONFIG_CTOR_INIT != GLM_CTOR_INIT_DISABLE
  10. : x(0)
  11. # endif
  12. {}
  13. template<typename T, qualifier Q>
  14. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<1, T, Q> const& v)
  15. : x(v.x)
  16. {}
  17. # endif
  18. template<typename T, qualifier Q>
  19. template<qualifier P>
  20. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<1, T, P> const& v)
  21. : x(v.x)
  22. {}
  23. // -- Explicit basic constructors --
  24. template<typename T, qualifier Q>
  25. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(T scalar)
  26. : x(scalar)
  27. {}
  28. // -- Conversion vector constructors --
  29. template<typename T, qualifier Q>
  30. template<typename U, qualifier P>
  31. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<1, U, P> const& v)
  32. : x(static_cast<T>(v.x))
  33. {}
  34. template<typename T, qualifier Q>
  35. template<typename U, qualifier P>
  36. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<2, U, P> const& v)
  37. : x(static_cast<T>(v.x))
  38. {}
  39. template<typename T, qualifier Q>
  40. template<typename U, qualifier P>
  41. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<3, U, P> const& v)
  42. : x(static_cast<T>(v.x))
  43. {}
  44. template<typename T, qualifier Q>
  45. template<typename U, qualifier P>
  46. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q>::vec(vec<4, U, P> const& v)
  47. : x(static_cast<T>(v.x))
  48. {}
  49. // -- Component accesses --
  50. template<typename T, qualifier Q>
  51. GLM_FUNC_QUALIFIER GLM_CONSTEXPR T & vec<1, T, Q>::operator[](typename vec<1, T, Q>::length_type)
  52. {
  53. return x;
  54. }
  55. template<typename T, qualifier Q>
  56. GLM_FUNC_QUALIFIER GLM_CONSTEXPR T const& vec<1, T, Q>::operator[](typename vec<1, T, Q>::length_type) const
  57. {
  58. return x;
  59. }
  60. // -- Unary arithmetic operators --
  61. # if GLM_CONFIG_DEFAULTED_FUNCTIONS == GLM_DISABLE
  62. template<typename T, qualifier Q>
  63. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator=(vec<1, T, Q> const& v)
  64. {
  65. this->x = v.x;
  66. return *this;
  67. }
  68. # endif
  69. template<typename T, qualifier Q>
  70. template<typename U>
  71. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator=(vec<1, U, Q> const& v)
  72. {
  73. this->x = static_cast<T>(v.x);
  74. return *this;
  75. }
  76. template<typename T, qualifier Q>
  77. template<typename U>
  78. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator+=(U scalar)
  79. {
  80. this->x += static_cast<T>(scalar);
  81. return *this;
  82. }
  83. template<typename T, qualifier Q>
  84. template<typename U>
  85. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator+=(vec<1, U, Q> const& v)
  86. {
  87. this->x += static_cast<T>(v.x);
  88. return *this;
  89. }
  90. template<typename T, qualifier Q>
  91. template<typename U>
  92. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator-=(U scalar)
  93. {
  94. this->x -= static_cast<T>(scalar);
  95. return *this;
  96. }
  97. template<typename T, qualifier Q>
  98. template<typename U>
  99. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator-=(vec<1, U, Q> const& v)
  100. {
  101. this->x -= static_cast<T>(v.x);
  102. return *this;
  103. }
  104. template<typename T, qualifier Q>
  105. template<typename U>
  106. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator*=(U scalar)
  107. {
  108. this->x *= static_cast<T>(scalar);
  109. return *this;
  110. }
  111. template<typename T, qualifier Q>
  112. template<typename U>
  113. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator*=(vec<1, U, Q> const& v)
  114. {
  115. this->x *= static_cast<T>(v.x);
  116. return *this;
  117. }
  118. template<typename T, qualifier Q>
  119. template<typename U>
  120. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator/=(U scalar)
  121. {
  122. this->x /= static_cast<T>(scalar);
  123. return *this;
  124. }
  125. template<typename T, qualifier Q>
  126. template<typename U>
  127. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator/=(vec<1, U, Q> const& v)
  128. {
  129. this->x /= static_cast<T>(v.x);
  130. return *this;
  131. }
  132. // -- Increment and decrement operators --
  133. template<typename T, qualifier Q>
  134. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator++()
  135. {
  136. ++this->x;
  137. return *this;
  138. }
  139. template<typename T, qualifier Q>
  140. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator--()
  141. {
  142. --this->x;
  143. return *this;
  144. }
  145. template<typename T, qualifier Q>
  146. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> vec<1, T, Q>::operator++(int)
  147. {
  148. vec<1, T, Q> Result(*this);
  149. ++*this;
  150. return Result;
  151. }
  152. template<typename T, qualifier Q>
  153. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> vec<1, T, Q>::operator--(int)
  154. {
  155. vec<1, T, Q> Result(*this);
  156. --*this;
  157. return Result;
  158. }
  159. // -- Unary bit operators --
  160. template<typename T, qualifier Q>
  161. template<typename U>
  162. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator%=(U scalar)
  163. {
  164. this->x %= static_cast<T>(scalar);
  165. return *this;
  166. }
  167. template<typename T, qualifier Q>
  168. template<typename U>
  169. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator%=(vec<1, U, Q> const& v)
  170. {
  171. this->x %= static_cast<T>(v.x);
  172. return *this;
  173. }
  174. template<typename T, qualifier Q>
  175. template<typename U>
  176. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator&=(U scalar)
  177. {
  178. this->x &= static_cast<T>(scalar);
  179. return *this;
  180. }
  181. template<typename T, qualifier Q>
  182. template<typename U>
  183. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator&=(vec<1, U, Q> const& v)
  184. {
  185. this->x &= static_cast<T>(v.x);
  186. return *this;
  187. }
  188. template<typename T, qualifier Q>
  189. template<typename U>
  190. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator|=(U scalar)
  191. {
  192. this->x |= static_cast<T>(scalar);
  193. return *this;
  194. }
  195. template<typename T, qualifier Q>
  196. template<typename U>
  197. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator|=(vec<1, U, Q> const& v)
  198. {
  199. this->x |= U(v.x);
  200. return *this;
  201. }
  202. template<typename T, qualifier Q>
  203. template<typename U>
  204. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator^=(U scalar)
  205. {
  206. this->x ^= static_cast<T>(scalar);
  207. return *this;
  208. }
  209. template<typename T, qualifier Q>
  210. template<typename U>
  211. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator^=(vec<1, U, Q> const& v)
  212. {
  213. this->x ^= static_cast<T>(v.x);
  214. return *this;
  215. }
  216. template<typename T, qualifier Q>
  217. template<typename U>
  218. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator<<=(U scalar)
  219. {
  220. this->x <<= static_cast<T>(scalar);
  221. return *this;
  222. }
  223. template<typename T, qualifier Q>
  224. template<typename U>
  225. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator<<=(vec<1, U, Q> const& v)
  226. {
  227. this->x <<= static_cast<T>(v.x);
  228. return *this;
  229. }
  230. template<typename T, qualifier Q>
  231. template<typename U>
  232. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator>>=(U scalar)
  233. {
  234. this->x >>= static_cast<T>(scalar);
  235. return *this;
  236. }
  237. template<typename T, qualifier Q>
  238. template<typename U>
  239. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> & vec<1, T, Q>::operator>>=(vec<1, U, Q> const& v)
  240. {
  241. this->x >>= static_cast<T>(v.x);
  242. return *this;
  243. }
  244. // -- Unary constant operators --
  245. template<typename T, qualifier Q>
  246. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator+(vec<1, T, Q> const& v)
  247. {
  248. return v;
  249. }
  250. template<typename T, qualifier Q>
  251. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator-(vec<1, T, Q> const& v)
  252. {
  253. return vec<1, T, Q>(
  254. -v.x);
  255. }
  256. // -- Binary arithmetic operators --
  257. template<typename T, qualifier Q>
  258. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator+(vec<1, T, Q> const& v, T scalar)
  259. {
  260. return vec<1, T, Q>(
  261. v.x + scalar);
  262. }
  263. template<typename T, qualifier Q>
  264. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator+(T scalar, vec<1, T, Q> const& v)
  265. {
  266. return vec<1, T, Q>(
  267. scalar + v.x);
  268. }
  269. template<typename T, qualifier Q>
  270. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator+(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
  271. {
  272. return vec<1, T, Q>(
  273. v1.x + v2.x);
  274. }
  275. //operator-
  276. template<typename T, qualifier Q>
  277. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator-(vec<1, T, Q> const& v, T scalar)
  278. {
  279. return vec<1, T, Q>(
  280. v.x - scalar);
  281. }
  282. template<typename T, qualifier Q>
  283. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator-(T scalar, vec<1, T, Q> const& v)
  284. {
  285. return vec<1, T, Q>(
  286. scalar - v.x);
  287. }
  288. template<typename T, qualifier Q>
  289. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator-(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
  290. {
  291. return vec<1, T, Q>(
  292. v1.x - v2.x);
  293. }
  294. template<typename T, qualifier Q>
  295. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator*(vec<1, T, Q> const& v, T scalar)
  296. {
  297. return vec<1, T, Q>(
  298. v.x * scalar);
  299. }
  300. template<typename T, qualifier Q>
  301. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator*(T scalar, vec<1, T, Q> const& v)
  302. {
  303. return vec<1, T, Q>(
  304. scalar * v.x);
  305. }
  306. template<typename T, qualifier Q>
  307. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator*(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
  308. {
  309. return vec<1, T, Q>(
  310. v1.x * v2.x);
  311. }
  312. template<typename T, qualifier Q>
  313. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator/(vec<1, T, Q> const& v, T scalar)
  314. {
  315. return vec<1, T, Q>(
  316. v.x / scalar);
  317. }
  318. template<typename T, qualifier Q>
  319. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator/(T scalar, vec<1, T, Q> const& v)
  320. {
  321. return vec<1, T, Q>(
  322. scalar / v.x);
  323. }
  324. template<typename T, qualifier Q>
  325. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator/(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
  326. {
  327. return vec<1, T, Q>(
  328. v1.x / v2.x);
  329. }
  330. // -- Binary bit operators --
  331. template<typename T, qualifier Q>
  332. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator%(vec<1, T, Q> const& v, T scalar)
  333. {
  334. return vec<1, T, Q>(
  335. v.x % scalar);
  336. }
  337. template<typename T, qualifier Q>
  338. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator%(T scalar, vec<1, T, Q> const& v)
  339. {
  340. return vec<1, T, Q>(
  341. scalar % v.x);
  342. }
  343. template<typename T, qualifier Q>
  344. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator%(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
  345. {
  346. return vec<1, T, Q>(
  347. v1.x % v2.x);
  348. }
  349. template<typename T, qualifier Q>
  350. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator&(vec<1, T, Q> const& v, T scalar)
  351. {
  352. return vec<1, T, Q>(
  353. v.x & scalar);
  354. }
  355. template<typename T, qualifier Q>
  356. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator&(T scalar, vec<1, T, Q> const& v)
  357. {
  358. return vec<1, T, Q>(
  359. scalar & v.x);
  360. }
  361. template<typename T, qualifier Q>
  362. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator&(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
  363. {
  364. return vec<1, T, Q>(
  365. v1.x & v2.x);
  366. }
  367. template<typename T, qualifier Q>
  368. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator|(vec<1, T, Q> const& v, T scalar)
  369. {
  370. return vec<1, T, Q>(
  371. v.x | scalar);
  372. }
  373. template<typename T, qualifier Q>
  374. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator|(T scalar, vec<1, T, Q> const& v)
  375. {
  376. return vec<1, T, Q>(
  377. scalar | v.x);
  378. }
  379. template<typename T, qualifier Q>
  380. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator|(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
  381. {
  382. return vec<1, T, Q>(
  383. v1.x | v2.x);
  384. }
  385. template<typename T, qualifier Q>
  386. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator^(vec<1, T, Q> const& v, T scalar)
  387. {
  388. return vec<1, T, Q>(
  389. v.x ^ scalar);
  390. }
  391. template<typename T, qualifier Q>
  392. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator^(T scalar, vec<1, T, Q> const& v)
  393. {
  394. return vec<1, T, Q>(
  395. scalar ^ v.x);
  396. }
  397. template<typename T, qualifier Q>
  398. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator^(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
  399. {
  400. return vec<1, T, Q>(
  401. v1.x ^ v2.x);
  402. }
  403. template<typename T, qualifier Q>
  404. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator<<(vec<1, T, Q> const& v, T scalar)
  405. {
  406. return vec<1, T, Q>(
  407. static_cast<T>(v.x << scalar));
  408. }
  409. template<typename T, qualifier Q>
  410. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator<<(T scalar, vec<1, T, Q> const& v)
  411. {
  412. return vec<1, T, Q>(
  413. scalar << v.x);
  414. }
  415. template<typename T, qualifier Q>
  416. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator<<(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
  417. {
  418. return vec<1, T, Q>(
  419. v1.x << v2.x);
  420. }
  421. template<typename T, qualifier Q>
  422. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator>>(vec<1, T, Q> const& v, T scalar)
  423. {
  424. return vec<1, T, Q>(
  425. v.x >> scalar);
  426. }
  427. template<typename T, qualifier Q>
  428. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator>>(T scalar, vec<1, T, Q> const& v)
  429. {
  430. return vec<1, T, Q>(
  431. scalar >> v.x);
  432. }
  433. template<typename T, qualifier Q>
  434. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator>>(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
  435. {
  436. return vec<1, T, Q>(
  437. v1.x >> v2.x);
  438. }
  439. template<typename T, qualifier Q>
  440. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, T, Q> operator~(vec<1, T, Q> const& v)
  441. {
  442. return vec<1, T, Q>(
  443. ~v.x);
  444. }
  445. // -- Boolean operators --
  446. template<typename T, qualifier Q>
  447. GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator==(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
  448. {
  449. return detail::compute_equal<T, std::numeric_limits<T>::is_iec559>::call(v1.x, v2.x);
  450. }
  451. template<typename T, qualifier Q>
  452. GLM_FUNC_QUALIFIER GLM_CONSTEXPR bool operator!=(vec<1, T, Q> const& v1, vec<1, T, Q> const& v2)
  453. {
  454. return !(v1 == v2);
  455. }
  456. template<qualifier Q>
  457. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, bool, Q> operator&&(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2)
  458. {
  459. return vec<1, bool, Q>(v1.x && v2.x);
  460. }
  461. template<qualifier Q>
  462. GLM_FUNC_QUALIFIER GLM_CONSTEXPR vec<1, bool, Q> operator||(vec<1, bool, Q> const& v1, vec<1, bool, Q> const& v2)
  463. {
  464. return vec<1, bool, Q>(v1.x || v2.x);
  465. }
  466. }//namespace glm