source: libcfa/src/vec/vec2.hfa@ 0b3cdad

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 0b3cdad was 7799f79, checked in by Dmitry Kobets <dkobets@…>, 6 years ago

Add various mathematical operations to vec2 + tests

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