source: libcfa/src/vec/vec4.hfa@ 94df8de

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

Add extended mathematical operations for vec4 + tests

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