source: libcfa/src/vec/vec4.hfa@ aefb247

ADT arm-eh ast-experimental enum forall-pointer-decay jacob/cs343-translation new-ast-unique-expr pthread-emulation qualifiedEnum
Last change on this file since aefb247 was 250dbae, checked in by Dmitry Kobets <dkobets@…>, 6 years ago

Refactor vector library classes

  • Property mode set to 100644
File size: 6.2 KB
Line 
1#pragma once
2
3#include <iostream.hfa>
4#include "vec.hfa"
5
6forall (otype T) {
7 struct vec4 {
8 T x, y, z, w;
9 };
10}
11
12forall (otype T) {
13 static inline {
14
15 void ?{}(vec4(T)& v, T x, T y, T z, T w) {
16 v.[x, y, z, w] = [x, y, z, w];
17 }
18
19 forall(| zero_assign(T))
20 void ?{}(vec4(T)& vec, zero_t) with (vec) {
21 x = y = z = w = 0;
22 }
23
24 void ?{}(vec4(T)& vec, T val) with (vec) {
25 x = y = z = w = val;
26 }
27
28 void ?{}(vec4(T)& vec, vec4(T) other) with (vec) {
29 [x,y,z,w] = other.[x,y,z,w];
30 }
31
32 void ?=?(vec4(T)& vec, vec4(T) other) with (vec) {
33 [x,y,z,w] = other.[x,y,z,w];
34 }
35 forall(| zero_assign(T))
36 void ?=?(vec4(T)& vec, zero_t) with (vec) {
37 x = y = z = w = 0;
38 }
39
40 // Primitive mathematical operations
41
42 // -
43 forall(| subtract(T)) {
44 vec4(T) ?-?(vec4(T) u, vec4(T) v) {
45 return [u.x - v.x, u.y - v.y, u.z - v.z, u.w - v.w];
46 }
47 vec4(T)& ?-=?(vec4(T)& u, vec4(T) v) {
48 u = u - v;
49 return u;
50 }
51 }
52 forall(| negate(T)) {
53 vec4(T) -?(vec4(T) v) with (v) {
54 return [-x, -y, -z, -w];
55 }
56 }
57 forall(| { T --?(T&); }) {
58 vec4(T)& --?(vec4(T)& v) {
59 --v.x;
60 --v.y;
61 --v.z;
62 --v.w;
63 return v;
64 }
65 vec4(T) ?--(vec4(T)& v) {
66 vec4(T) copy = v;
67 --v;
68 return copy;
69 }
70 }
71
72 // +
73 forall(| add(T)) {
74 vec4(T) ?+?(vec4(T) u, vec4(T) v) {
75 return [u.x + v.x, u.y + v.y, u.z + v.z, u.w + v.w];
76 }
77 vec4(T)& ?+=?(vec4(T)& u, vec4(T) v) {
78 u = u + v;
79 return u;
80 }
81 }
82
83 forall(| { T ++?(T&); }) {
84 vec4(T)& ++?(vec4(T)& v) {
85 ++v.x;
86 ++v.y;
87 ++v.z;
88 ++v.w;
89 return v;
90 }
91 vec4(T) ?++(vec4(T)& v) {
92 vec4(T) copy = v;
93 ++v;
94 return copy;
95 }
96 }
97
98 // *
99 forall(| multiply(T)) {
100 vec4(T) ?*?(vec4(T) v, T scalar) with (v) {
101 return [x * scalar, y * scalar, z * scalar, w * scalar];
102 }
103 vec4(T) ?*?(T scalar, vec4(T) v) {
104 return v * scalar;
105 }
106 vec4(T) ?*?(vec4(T) u, vec4(T) v) {
107 return [u.x * v.x, u.y * v.y, u.z * v.z, u.w * v.w];
108 }
109 vec4(T)& ?*=?(vec4(T)& v, T scalar) {
110 v = v * scalar;
111 return v;
112 }
113 vec4(T)& ?*=?(vec4(T)& u, vec4(T) v) {
114 u = u * v;
115 return u;
116 }
117 }
118
119 // /
120 forall(| divide(T)) {
121 vec4(T) ?/?(vec4(T) v, T scalar) with (v) {
122 return [x / scalar, y / scalar, z / scalar, w / scalar];
123 }
124 vec4(T) ?/?(vec4(T) u, vec4(T) v) {
125 return [u.x / v.x, u.y / v.y, u.z / v.z, u.w / v.w];
126 }
127 vec4(T)& ?/=?(vec4(T)& v, T scalar) {
128 v = v / scalar;
129 return v;
130 }
131 vec4(T)& ?/=?(vec4(T)& u, vec4(T) v) {
132 u = u / v;
133 return u;
134 }
135 }
136
137 // %
138 forall(| { T ?%?(T,T); }) {
139 vec4(T) ?%?(vec4(T) v, T scalar) with (v) {
140 return [x % scalar, y % scalar, z % scalar, w % scalar];
141 }
142 vec4(T)& ?%=?(vec4(T)& u, T scalar) {
143 u = u % scalar;
144 return u;
145 }
146 vec4(T) ?%?(vec4(T) u, vec4(T) v) {
147 return [u.x % v.x, u.y % v.y, u.z % v.z, u.w % v.w];
148 }
149 vec4(T)& ?%=?(vec4(T)& u, vec4(T) v) {
150 u = u % v;
151 return u;
152 }
153 }
154
155 // &
156 forall(| { T ?&?(T,T); }) {
157 vec4(T) ?&?(vec4(T) v, T scalar) with (v) {
158 return [x & scalar, y & scalar, z & scalar, w & scalar];
159 }
160 vec4(T)& ?&=?(vec4(T)& u, T scalar) {
161 u = u & scalar;
162 return u;
163 }
164 vec4(T) ?&?(vec4(T) u, vec4(T) v) {
165 return [u.x & v.x, u.y & v.y, u.z & v.z, u.w & v.w];
166 }
167 vec4(T)& ?&=?(vec4(T)& u, vec4(T) v) {
168 u = u & v;
169 return u;
170 }
171 }
172
173 // |
174 forall(| { T ?|?(T,T); }) {
175 vec4(T) ?|?(vec4(T) v, T scalar) with (v) {
176 return [x | scalar, y | scalar, z | scalar, w | scalar];
177 }
178 vec4(T)& ?|=?(vec4(T)& u, T scalar) {
179 u = u | scalar;
180 return u;
181 }
182 vec4(T) ?|?(vec4(T) u, vec4(T) v) {
183 return [u.x | v.x, u.y | v.y, u.z | v.z, u.w | v.w];
184 }
185 vec4(T)& ?|=?(vec4(T)& u, vec4(T) v) {
186 u = u | v;
187 return u;
188 }
189 }
190
191 // ^
192 forall(| { T ?^?(T,T); }) {
193 vec4(T) ?^?(vec4(T) v, T scalar) with (v) {
194 return [x ^ scalar, y ^ scalar, z ^ scalar, w ^ scalar];
195 }
196 vec4(T)& ?^=?(vec4(T)& u, T scalar) {
197 u = u ^ scalar;
198 return u;
199 }
200 vec4(T) ?^?(vec4(T) u, vec4(T) v) {
201 return [u.x ^ v.x, u.y ^ v.y, u.z ^ v.z, u.w ^ v.w];
202 }
203 vec4(T)& ?^=?(vec4(T)& u, vec4(T) v) {
204 u = u ^ v;
205 return u;
206 }
207 }
208
209 // <<
210 forall(| { T ?<<?(T,T); }) {
211 vec4(T) ?<<?(vec4(T) v, T scalar) with (v) {
212 return [x << scalar, y << scalar, z << scalar, w << scalar];
213 }
214 vec4(T)& ?<<=?(vec4(T)& u, T scalar) {
215 u = u << scalar;
216 return u;
217 }
218 vec4(T) ?<<?(vec4(T) u, vec4(T) v) {
219 return [u.x << v.x, u.y << v.y, u.z << v.z, u.w << v.w];
220 }
221 vec4(T)& ?<<=?(vec4(T)& u, vec4(T) v) {
222 u = u << v;
223 return u;
224 }
225 }
226
227 // >>
228 forall(| { T ?>>?(T,T); }) {
229 vec4(T) ?>>?(vec4(T) v, T scalar) with (v) {
230 return [x >> scalar, y >> scalar, z >> scalar, w >> scalar];
231 }
232 vec4(T)& ?>>=?(vec4(T)& u, T scalar) {
233 u = u >> scalar;
234 return u;
235 }
236 vec4(T) ?>>?(vec4(T) u, vec4(T) v) {
237 return [u.x >> v.x, u.y >> v.y, u.z >> v.z, u.w >> v.w];
238 }
239 vec4(T)& ?>>=?(vec4(T)& u, vec4(T) v) {
240 u = u >> v;
241 return u;
242 }
243 }
244
245 // ~
246 forall(| { T ~?(T); })
247 vec4(T) ~?(vec4(T) v) with (v) {
248 return [~x, ~y, ~z, ~w];
249 }
250
251 // relational
252 forall(| equality(T)) {
253 bool ?==?(vec4(T) u, vec4(T) v) with (u) {
254 return x == v.x && y == v.y && z == v.z && w == v.w;
255 }
256 bool ?!=?(vec4(T) u, vec4(T) v) {
257 return !(u == v);
258 }
259 }
260
261 // Geometric functions
262 forall(| add(T) | multiply(T))
263 T dot(vec4(T) u, vec4(T) v) {
264 return u.x * v.x + u.y * v.y + u.z * v.z + u.w * v.w;
265 }
266
267 } // static inline
268}
269
270forall(dtype ostype, otype T | writeable(T, ostype)) {
271 ostype & ?|?(ostype & os, vec4(T) v) with (v) {
272 return os | '<' | x | ',' | y | ',' | z | ',' | w | '>';
273 }
274 void ?|?(ostype & os, vec4(T) v ) with (v) {
275 (ostype &)(os | v); ends(os);
276 }
277}
278
Note: See TracBrowser for help on using the repository browser.