]> Nishi Git Mirror - gwion.git/commitdiff
:art: Equality Ops for special types
authorfennecdjay <astor.jeremie@wanadoo.fr>
Mon, 25 Nov 2019 00:32:10 +0000 (01:32 +0100)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Mon, 25 Nov 2019 00:32:10 +0000 (01:32 +0100)
examples/complex.gw
examples/polar.gw
examples/vec3.gw
examples/vec4.gw
include/import/oper.h
src/lib/complex.c
src/lib/vec.c

index 2d35de88215846bcfc8551758969de03412e349a..1a6bccb48d6832d02c888e58a26b8b45a3d96120 100644 (file)
@@ -2,6 +2,8 @@ complex a, b;
 a;
 a.re;
 a.im;
+a == b;
+a != b;
 a + b;
 
 <<< a - b >>>;
index 1343283c8df4fce5603f4f5241b03d4bda66f440..d4d0e6a5ad649093cba8aa496fc7be1c2599ccb1 100644 (file)
@@ -3,6 +3,8 @@ polar a;
 a.mod;
 a.phase;
 a;
+a == b;
+a != b;
 a + b;
 a - b;
 a * b;
index a1c1a201c7cfb1bfce1bc71166ce3b50b6aa3709..98dba0a8b2f46d15c07ffe040e306e7f8f90f532 100644 (file)
@@ -1,5 +1,7 @@
 Vec3 v, w;
 
+<<< v == >>>;
+
 <<< v + w >>>;
 <<< v - w >>>;
 <<< v * w >>>;
@@ -14,7 +16,7 @@ Vec3 v, w;
 <<<  -12 => v.z  >>>;
 <<<  @(.1, .2, .4) => v  >>>;
 <<< v >>>;
-<<<  "set ",       v.set(1,2,3)   >>>;  
+<<<  "set ",       v.set(1,2,3)   >>>;
 <<<  "setAll ",    v.setAll(1.2)  >>>;
 <<<  "should be 1.2 1.2 1.2 ", v  >>>;
 <<<  "Update ", v.update(2) >>>;
index 5e1862b8fc598f6afe7b1a4001cb5ca6cdc33164..e876c603a5ffdffc4e498722586a45c132196638 100644 (file)
@@ -1,6 +1,9 @@
 Vec4 v, w;
 <<< v >>>;
 
+<<< v == w>>>;
+<<< v != w>>>;
+
 <<< v + w>>>;
 <<< v - w>>>;
 <<< v * w>>>;
index b2322c40f920739d8d359c02feee487a34b77294..cf5bedcff388ed69e5b4b3121b7885e35403ac3b 100644 (file)
@@ -7,4 +7,13 @@ ANN m_int gwi_oper_emi(const Gwi gwi, const opem);
 ANN2(1) m_int gwi_oper_end(const Gwi gwi, const m_str op, const f_instr f);
 ANN m_int gwi_oper_cond(const Gwi, const m_str,  const f_instr, const f_instr);
 
+#define _EQUALITY_OPER(sz, sign)                                 \
+  POP_REG(shred, sz*2 - SZ_INT);                                 \
+  *(m_uint*)REG(-SZ_INT) = sign                                  \
+      memcmp(shred->reg + SZ_INT, shred->reg + SZ_INT + sz, sz); \
+
+#define EQUALITY_OPER(name, sz)                    \
+static INSTR(name##_eq) { _EQUALITY_OPER(sz,  !) } \
+static INSTR(name##_ne) { _EQUALITY_OPER(sz, !!) }
+
 #endif
index 41a83747170f7913e677c933b2664945721a9c77..31ca83055d0b1840a2114676c9a28f58dcb968c2 100644 (file)
@@ -121,6 +121,8 @@ static GACK(gack_polar) {
   printf("%%(%.4f, %.4f*pi)", *(m_float*)VALUE, *(m_float*)(VALUE + SZ_FLOAT) / M_PI);
 }
 
+EQUALITY_OPER(complex, SZ_COMPLEX)
+
 GWION_IMPORT(complex) {
 // should be special
   const Type t_complex = gwi_class_spe(gwi, "complex", SZ_COMPLEX);
@@ -140,6 +142,9 @@ GWION_IMPORT(complex) {
   GWI_BB(gwi_item_ini(gwi, "float", "phase"))
   GWI_BB(gwi_item_end(gwi,   ae_flag_member, NULL))
   GWI_BB(gwi_class_end(gwi))
+  GWI_BB(gwi_oper_ini(gwi, "complex", "complex", "bool"))
+  GWI_BB(gwi_oper_end(gwi, "==",          complex_eq))
+  GWI_BB(gwi_oper_end(gwi, "!=",          complex_ne))
   GWI_BB(gwi_oper_ini(gwi, "complex", "complex", "complex"))
   GWI_BB(gwi_oper_end(gwi, "+",          ComplexAdd))
   GWI_BB(gwi_oper_end(gwi, "-",         ComplexSub))
@@ -155,6 +160,9 @@ GWION_IMPORT(complex) {
   GWI_BB(gwi_oper_end(gwi, "*=>",   ComplexRMul))
   GWI_BB(gwi_oper_add(gwi, opck_rassign))
   GWI_BB(gwi_oper_end(gwi, "/=>",  ComplexRDiv))
+  GWI_BB(gwi_oper_ini(gwi, "polar", "polar", "bool"))
+  GWI_BB(gwi_oper_end(gwi, "==",          complex_eq))
+  GWI_BB(gwi_oper_end(gwi, "!=",          complex_ne))
   GWI_BB(gwi_oper_ini(gwi, "polar", "polar", "polar"))
   GWI_BB(gwi_oper_add(gwi, opck_rassign))
   GWI_BB(gwi_oper_end(gwi, "=>",         ComplexRAssign))
index e1a25bcbef6979f28ad4d276b59443bdf38b1251..3cc2e837cc568d77f44fe43a18abf6e6412df307 100644 (file)
@@ -160,6 +160,8 @@ static GACK(gack_vec3) {
   printf("%%(%.4f, %.4f, %.4f)", *(m_float*)VALUE, *(m_float*)(VALUE + SZ_FLOAT), *(m_float*)(VALUE + SZ_FLOAT*2));
 }
 
+EQUALITY_OPER(vec3, SZ_VEC3);
+
 GWION_IMPORT(vec3) {
   const Type t_vec3 = gwi_class_spe(gwi, "Vec3", SZ_VEC3);
   gwi->gwion->type[et_vec3] = t_vec3;
@@ -201,6 +203,9 @@ GWION_IMPORT(vec3) {
   GWI_BB(gwi_func_end(gwi, vec3_update_set_slew, ae_flag_none))
   GWI_BB(gwi_class_end(gwi))
 
+  GWI_BB(gwi_oper_ini(gwi, "Vec3", "Vec3", "bool"))
+  GWI_BB(gwi_oper_end(gwi, "==",          vec3_eq))
+  GWI_BB(gwi_oper_end(gwi, "!=",          vec3_ne))
   GWI_BB(gwi_oper_ini(gwi, "Vec3", "Vec3", "Vec3"))
   GWI_BB(gwi_oper_end(gwi, "+", Vec3Add))
   GWI_BB(gwi_oper_end(gwi, "-", Vec3Sub))
@@ -308,6 +313,8 @@ static GACK(gack_vec4) {
       *(m_float*)(VALUE + SZ_FLOAT*3));
 }
 
+EQUALITY_OPER(vec4, SZ_VEC4);
+
 GWION_IMPORT(vec4) {
   const Type t_vec4 = gwi_class_spe(gwi, "Vec4", SZ_VEC4);
   gwi->gwion->type[et_vec4] = t_vec4;
@@ -329,6 +336,9 @@ GWION_IMPORT(vec4) {
     gwi_func_ini(gwi, "void", "normalize");
   CHECK_BB(gwi_func_end(gwi, vec4_normalize, ae_flag_none))
   CHECK_BB(gwi_class_end(gwi))
+  GWI_BB(gwi_oper_ini(gwi, "Vec4", "Vec4", "bool"))
+  GWI_BB(gwi_oper_end(gwi, "==",          vec4_eq))
+  GWI_BB(gwi_oper_end(gwi, "!=",          vec4_ne))
   CHECK_BB(gwi_oper_ini(gwi, "Vec4", "Vec4", "Vec4"))
   CHECK_BB(gwi_oper_end(gwi, "+",  Vec4Add))
   CHECK_BB(gwi_oper_end(gwi, "-", Vec4Sub))