source: libcfa/src/vec/vec2.hfa@ 8af5776

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 8af5776 was 250dbae, checked in by Dmitry Kobets <dkobets@…>, 6 years ago

Refactor vector library classes

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