4.4 KB、134行 生 Blame 履歴
1
2#pragma once
3#include <functional>
4#include "_vectorize.hpp"
5
6namespace glm {
7 namespace detail
8 {
9 template<length_t L, typename T, qualifier Q, bool UseSimd>
10 struct compute_vec_add {
11 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
12 {
13 return detail::functor2<vec, L, T, Q>::call(std::plus<T>(), a, b);
14 }
15 };
16
17 template<length_t L, typename T, qualifier Q, bool UseSimd>
18 struct compute_vec_sub {
19 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
20 {
21 return detail::functor2<vec, L, T, Q>::call(std::minus<T>(), a, b);
22 }
23 };
24
25 template<length_t L, typename T, qualifier Q, bool UseSimd>
26 struct compute_vec_mul {
27 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
28 {
29 return detail::functor2<vec, L, T, Q>::call(std::multiplies<T>(), a, b);
30 }
31 };
32
33 template<length_t L, typename T, qualifier Q, bool UseSimd>
34 struct compute_vec_div {
35 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
36 {
37 return detail::functor2<vec, L, T, Q>::call(std::divides<T>(), a, b);
38 }
39 };
40
41 template<length_t L, typename T, qualifier Q, bool UseSimd>
42 struct compute_vec_mod {
43 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
44 {
45 return detail::functor2<vec, L, T, Q>::call(std::modulus<T>(), a, b);
46 }
47 };
48
49 template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
50 struct compute_vec_and {
51 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
52 {
53 vec<L, T, Q> v(a);
54 for (length_t i = 0; i < L; ++i)
55 v[i] &= static_cast<T>(b[i]);
56 return v;
57 }
58 };
59
60 template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
61 struct compute_vec_or {
62 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
63 {
64 vec<L, T, Q> v(a);
65 for (length_t i = 0; i < L; ++i)
66 v[i] |= static_cast<T>(b[i]);
67 return v;
68 }
69 };
70
71 template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
72 struct compute_vec_xor {
73 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
74 {
75 vec<L, T, Q> v(a);
76 for (length_t i = 0; i < L; ++i)
77 v[i] ^= static_cast<T>(b[i]);
78 return v;
79 }
80 };
81
82 template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
83 struct compute_vec_shift_left {
84 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
85 {
86 vec<L, T, Q> v(a);
87 for (length_t i = 0; i < L; ++i)
88 v[i] <<= static_cast<T>(b[i]);
89 return v;
90 }
91 };
92
93 template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
94 struct compute_vec_shift_right {
95 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a, vec<L, T, Q> const& b)
96 {
97 vec<L, T, Q> v(a);
98 for (length_t i = 0; i < L; ++i)
99 v[i] >>= static_cast<T>(b[i]);
100 return v;
101 }
102 };
103
104 template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
105 struct compute_vec_equal {
106 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static bool call(vec<L, T, Q> const& v1, vec<L, T, Q> const& v2)
107 {
108 bool b = true;
109 for (length_t i = 0; b && i < L; ++i)
110 b = detail::compute_equal<T, std::numeric_limits<T>::is_iec559>::call(v1[i], v2[i]);
111 return b;
112 }
113 };
114
115 template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
116 struct compute_vec_nequal {
117 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static bool call(vec<4, T, Q> const& v1, vec<4, T, Q> const& v2)
118 {
119 return !compute_vec_equal<L, T, Q, detail::is_int<T>::value, sizeof(T) * 8, detail::is_aligned<Q>::value>::call(v1, v2);
120 }
121 };
122
123 template<length_t L, typename T, qualifier Q, int IsInt, std::size_t Size, bool UseSimd>
124 struct compute_vec_bitwise_not {
125 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<L, T, Q> call(vec<L, T, Q> const& a)
126 {
127 vec<L, T, Q> v(a);
128 for (length_t i = 0; i < L; ++i)
129 v[i] = ~v[i];
130 return v;
131 }
132 };
133 }
134}