master
ブランチ master
VulkanExample / dep / include / glm / detail / _vectorize.hpp
7.9 KB、230行 生 Blame 履歴
1#pragma once
2
3namespace glm{
4namespace detail
5{
6 template<template<length_t L, typename T, qualifier Q> class vec, length_t L, typename R, typename T, qualifier Q>
7 struct functor1{};
8
9 template<template<length_t L, typename T, qualifier Q> class vec, typename R, typename T, qualifier Q>
10 struct functor1<vec, 1, R, T, Q>
11 {
12 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<1, R, Q> call(R (*Func) (T x), vec<1, T, Q> const& v)
13 {
14 return vec<1, R, Q>(Func(v.x));
15 }
16 };
17
18 template<template<length_t L, typename T, qualifier Q> class vec, typename R, typename T, qualifier Q>
19 struct functor1<vec, 2, R, T, Q>
20 {
21 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<2, R, Q> call(R (*Func) (T x), vec<2, T, Q> const& v)
22 {
23 return vec<2, R, Q>(Func(v.x), Func(v.y));
24 }
25 };
26
27 template<template<length_t L, typename T, qualifier Q> class vec, typename R, typename T, qualifier Q>
28 struct functor1<vec, 3, R, T, Q>
29 {
30 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<3, R, Q> call(R (*Func) (T x), vec<3, T, Q> const& v)
31 {
32 return vec<3, R, Q>(Func(v.x), Func(v.y), Func(v.z));
33 }
34 };
35
36 template<template<length_t L, typename T, qualifier Q> class vec, typename R, typename T, qualifier Q>
37 struct functor1<vec, 4, R, T, Q>
38 {
39 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, R, Q> call(R (*Func) (T x), vec<4, T, Q> const& v)
40 {
41 return vec<4, R, Q>(Func(v.x), Func(v.y), Func(v.z), Func(v.w));
42 }
43 };
44
45 template<template<length_t L, typename T, qualifier Q> class vec, length_t L, typename T, qualifier Q>
46 struct functor2{};
47
48 template<template<length_t L, typename T, qualifier Q> class vec, typename T, qualifier Q>
49 struct functor2<vec, 1, T, Q>
50 {
51 GLM_FUNC_QUALIFIER static vec<1, T, Q> call(T (*Func) (T x, T y), vec<1, T, Q> const& a, vec<1, T, Q> const& b)
52 {
53 return vec<1, T, Q>(Func(a.x, b.x));
54 }
55
56 template<typename Fct>
57 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<1, T, Q> call(Fct Func, vec<1, T, Q> const& a, vec<1, T, Q> const& b)
58 {
59 return vec<1, T, Q>(Func(a.x, b.x));
60 }
61 };
62
63 template<template<length_t L, typename T, qualifier Q> class vec, typename T, qualifier Q>
64 struct functor2<vec, 2, T, Q>
65 {
66 GLM_FUNC_QUALIFIER static vec<2, T, Q> call(T (*Func) (T x, T y), vec<2, T, Q> const& a, vec<2, T, Q> const& b)
67 {
68 return vec<2, T, Q>(Func(a.x, b.x), Func(a.y, b.y));
69 }
70
71 template<typename Fct>
72 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<2, T, Q> call(Fct Func, vec<2, T, Q> const& a, vec<2, T, Q> const& b)
73 {
74 return vec<2, T, Q>(Func(a.x, b.x), Func(a.y, b.y));
75 }
76 };
77
78 template<template<length_t L, typename T, qualifier Q> class vec, typename T, qualifier Q>
79 struct functor2<vec, 3, T, Q>
80 {
81 GLM_FUNC_QUALIFIER static vec<3, T, Q> call(T (*Func) (T x, T y), vec<3, T, Q> const& a, vec<3, T, Q> const& b)
82 {
83 return vec<3, T, Q>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z));
84 }
85
86 template<class Fct>
87 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<3, T, Q> call(Fct Func, vec<3, T, Q> const& a, vec<3, T, Q> const& b)
88 {
89 return vec<3, T, Q>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z));
90 }
91 };
92
93 template<template<length_t L, typename T, qualifier Q> class vec, typename T, qualifier Q>
94 struct functor2<vec, 4, T, Q>
95 {
96 GLM_FUNC_QUALIFIER static vec<4, T, Q> call(T (*Func) (T x, T y), vec<4, T, Q> const& a, vec<4, T, Q> const& b)
97 {
98 return vec<4, T, Q>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z), Func(a.w, b.w));
99 }
100
101 template<class Fct>
102 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(Fct Func, vec<4, T, Q> const& a, vec<4, T, Q> const& b)
103 {
104 return vec<4, T, Q>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z), Func(a.w, b.w));
105 }
106 };
107
108 template<template<length_t L, typename T, qualifier Q> class vec, length_t L, typename T, qualifier Q>
109 struct functor2_vec_sca{};
110
111 template<template<length_t L, typename T, qualifier Q> class vec, typename T, qualifier Q>
112 struct functor2_vec_sca<vec, 1, T, Q>
113 {
114 GLM_FUNC_QUALIFIER static vec<1, T, Q> call(T (*Func) (T x, T y), vec<1, T, Q> const& a, T b)
115 {
116 return vec<1, T, Q>(Func(a.x, b));
117 }
118 template<class Fct>
119 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<1, T, Q> call(Fct Func, vec<1, T, Q> const& a, T b)
120 {
121 return vec<1, T, Q>(Func(a.x, b));
122 }
123 };
124
125 template<template<length_t L, typename T, qualifier Q> class vec, typename T, qualifier Q>
126 struct functor2_vec_sca<vec, 2, T, Q>
127 {
128 GLM_FUNC_QUALIFIER static vec<2, T, Q> call(T (*Func) (T x, T y), vec<2, T, Q> const& a, T b)
129 {
130 return vec<2, T, Q>(Func(a.x, b), Func(a.y, b));
131 }
132
133 template<class Fct>
134 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<2, T, Q> call(Fct Func, vec<2, T, Q> const& a, T b)
135 {
136 return vec<2, T, Q>(Func(a.x, b), Func(a.y, b));
137 }
138 };
139
140 template<template<length_t L, typename T, qualifier Q> class vec, typename T, qualifier Q>
141 struct functor2_vec_sca<vec, 3, T, Q>
142 {
143 GLM_FUNC_QUALIFIER static vec<3, T, Q> call(T (*Func) (T x, T y), vec<3, T, Q> const& a, T b)
144 {
145 return vec<3, T, Q>(Func(a.x, b), Func(a.y, b), Func(a.z, b));
146 }
147
148 template<class Fct>
149 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<3, T, Q> call(Fct Func, vec<3, T, Q> const& a, T b)
150 {
151 return vec<3, T, Q>(Func(a.x, b), Func(a.y, b), Func(a.z, b));
152 }
153 };
154
155 template<template<length_t L, typename T, qualifier Q> class vec, typename T, qualifier Q>
156 struct functor2_vec_sca<vec, 4, T, Q>
157 {
158 GLM_FUNC_QUALIFIER static vec<4, T, Q> call(T (*Func) (T x, T y), vec<4, T, Q> const& a, T b)
159 {
160 return vec<4, T, Q>(Func(a.x, b), Func(a.y, b), Func(a.z, b), Func(a.w, b));
161 }
162 template<class Fct>
163 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, T, Q> call(Fct Func, vec<4, T, Q> const& a, T b)
164 {
165 return vec<4, T, Q>(Func(a.x, b), Func(a.y, b), Func(a.z, b), Func(a.w, b));
166 }
167 };
168
169 template<length_t L, typename T, qualifier Q>
170 struct functor2_vec_int {};
171
172 template<typename T, qualifier Q>
173 struct functor2_vec_int<1, T, Q>
174 {
175 GLM_FUNC_QUALIFIER static vec<1, int, Q> call(int (*Func) (T x, int y), vec<1, T, Q> const& a, vec<1, int, Q> const& b)
176 {
177 return vec<1, int, Q>(Func(a.x, b.x));
178 }
179
180 template<class Fct>
181 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<1, int, Q> call(Fct Func, vec<1, T, Q> const& a, vec<1, int, Q> const& b)
182 {
183 return vec<1, int, Q>(Func(a.x, b.x));
184 }
185 };
186
187 template<typename T, qualifier Q>
188 struct functor2_vec_int<2, T, Q>
189 {
190 GLM_FUNC_QUALIFIER static vec<2, int, Q> call(int (*Func) (T x, int y), vec<2, T, Q> const& a, vec<2, int, Q> const& b)
191 {
192 return vec<2, int, Q>(Func(a.x, b.x), Func(a.y, b.y));
193 }
194 template<class Fct>
195 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<2, int, Q> call(Fct Func, vec<2, T, Q> const& a, vec<2, int, Q> const& b)
196 {
197 return vec<2, int, Q>(Func(a.x, b.x), Func(a.y, b.y));
198 }
199 };
200
201 template<typename T, qualifier Q>
202 struct functor2_vec_int<3, T, Q>
203 {
204 GLM_FUNC_QUALIFIER static vec<3, int, Q> call(int (*Func) (T x, int y), vec<3, T, Q> const& a, vec<3, int, Q> const& b)
205 {
206 return vec<3, int, Q>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z));
207 }
208 template<class Fct>
209 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<3, int, Q> call(Fct Func, vec<3, T, Q> const& a, vec<3, int, Q> const& b)
210 {
211 return vec<3, int, Q>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z));
212 }
213 };
214
215 template<typename T, qualifier Q>
216 struct functor2_vec_int<4, T, Q>
217 {
218 GLM_FUNC_QUALIFIER static vec<4, int, Q> call(int (*Func) (T x, int y), vec<4, T, Q> const& a, vec<4, int, Q> const& b)
219 {
220 return vec<4, int, Q>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z), Func(a.w, b.w));
221 }
222
223 template<class Fct>
224 GLM_FUNC_QUALIFIER GLM_CONSTEXPR static vec<4, int, Q> call(Fct Func, vec<4, T, Q> const& a, vec<4, int, Q> const& b)
225 {
226 return vec<4, int, Q>(Func(a.x, b.x), Func(a.y, b.y), Func(a.z, b.z), Func(a.w, b.w));
227 }
228 };
229}//namespace detail
230}//namespace glm