Ver código fonte

Implement min/max functions

rexim 4 anos atrás
pai
commit
40ad0e0104
2 arquivos alterados com 110 adições e 0 exclusões
  1. 66 0
      la.h
  2. 44 0
      lag.c

+ 66 - 0
la.h

@@ -9,6 +9,8 @@
 
 LADEF float lerpf(float a, float b, float t);
 LADEF double lerp(double a, double b, double t);
+LADEF int mini(int a, int b);
+LADEF int maxi(int a, int b);
 
 typedef struct { float x, y; } V2f;
 typedef struct { double x, y; } V2d;
@@ -92,6 +94,8 @@ LADEF V2i v2i_sum(V2i a, V2i b);
 LADEF V2i v2i_sub(V2i a, V2i b);
 LADEF V2i v2i_mul(V2i a, V2i b);
 LADEF V2i v2i_div(V2i a, V2i b);
+LADEF V2i v2i_min(V2i a, V2i b);
+LADEF V2i v2i_max(V2i a, V2i b);
 LADEF int v2i_sqrlen(V2i a);
 
 #define V3f_Fmt "v3f(%f, %f, %f)"
@@ -166,6 +170,8 @@ LADEF V3i v3i_sum(V3i a, V3i b);
 LADEF V3i v3i_sub(V3i a, V3i b);
 LADEF V3i v3i_mul(V3i a, V3i b);
 LADEF V3i v3i_div(V3i a, V3i b);
+LADEF V3i v3i_min(V3i a, V3i b);
+LADEF V3i v3i_max(V3i a, V3i b);
 LADEF int v3i_sqrlen(V3i a);
 
 #define V4f_Fmt "v4f(%f, %f, %f, %f)"
@@ -240,6 +246,8 @@ LADEF V4i v4i_sum(V4i a, V4i b);
 LADEF V4i v4i_sub(V4i a, V4i b);
 LADEF V4i v4i_mul(V4i a, V4i b);
 LADEF V4i v4i_div(V4i a, V4i b);
+LADEF V4i v4i_min(V4i a, V4i b);
+LADEF V4i v4i_max(V4i a, V4i b);
 LADEF int v4i_sqrlen(V4i a);
 
 #endif // LA_H_
@@ -256,6 +264,16 @@ LADEF double lerp(double a, double b, double t)
     return a + (b - a) * t;
 }
 
+LADEF int mini(int a, int b)
+{
+    return a < b ? a : b;
+}
+
+LADEF int maxi(int a, int b)
+{
+    return a < b ? b : a;
+}
+
 LADEF V2f v2f(float x, float y)
 {
     V2f v;
@@ -717,6 +735,20 @@ LADEF V2i v2i_div(V2i a, V2i b)
     return a;
 }
 
+LADEF V2i v2i_min(V2i a, V2i b)
+{
+    a.x = mini(a.x, b.x);
+    a.y = mini(a.y, b.y);
+    return a;
+}
+
+LADEF V2i v2i_max(V2i a, V2i b)
+{
+    a.x = maxi(a.x, b.x);
+    a.y = maxi(a.y, b.y);
+    return a;
+}
+
 LADEF int v2i_sqrlen(V2i a)
 {
     return a.x*a.x + a.y*a.y;
@@ -1240,6 +1272,22 @@ LADEF V3i v3i_div(V3i a, V3i b)
     return a;
 }
 
+LADEF V3i v3i_min(V3i a, V3i b)
+{
+    a.x = mini(a.x, b.x);
+    a.y = mini(a.y, b.y);
+    a.z = mini(a.z, b.z);
+    return a;
+}
+
+LADEF V3i v3i_max(V3i a, V3i b)
+{
+    a.x = maxi(a.x, b.x);
+    a.y = maxi(a.y, b.y);
+    a.z = maxi(a.z, b.z);
+    return a;
+}
+
 LADEF int v3i_sqrlen(V3i a)
 {
     return a.x*a.x + a.y*a.y + a.z*a.z;
@@ -1820,6 +1868,24 @@ LADEF V4i v4i_div(V4i a, V4i b)
     return a;
 }
 
+LADEF V4i v4i_min(V4i a, V4i b)
+{
+    a.x = mini(a.x, b.x);
+    a.y = mini(a.y, b.y);
+    a.z = mini(a.z, b.z);
+    a.w = mini(a.w, b.w);
+    return a;
+}
+
+LADEF V4i v4i_max(V4i a, V4i b)
+{
+    a.x = maxi(a.x, b.x);
+    a.y = maxi(a.y, b.y);
+    a.z = maxi(a.z, b.z);
+    a.w = maxi(a.w, b.w);
+    return a;
+}
+
 LADEF int v4i_sqrlen(V4i a)
 {
     return a.x*a.x + a.y*a.y + a.z*a.z + a.w*a.w;

+ 44 - 0
lag.c

@@ -278,6 +278,7 @@ Fun_Def fun_defs[COUNT_FUNS] = {
         .name_for_type = {
             [TYPE_FLOAT] = "fminf",
             [TYPE_DOUBLE] = "fmin",
+            [TYPE_INT] = "mini",
         },
         .arity = 2,
         .args = {"a", "b"},
@@ -287,6 +288,7 @@ Fun_Def fun_defs[COUNT_FUNS] = {
         .name_for_type = {
             [TYPE_FLOAT] = "fmaxf",
             [TYPE_DOUBLE] = "fmax",
+            [TYPE_INT] = "maxi",
         },
         .arity = 2,
         .args = {"a", "b"},
@@ -384,6 +386,42 @@ void gen_lerp_impl(FILE *stream, const char *name, const char *type)
     fprintf(stream, "}\n");
 }
 
+char *minmax_args[] = {"a", "b"};
+#define MINMAX_ARITY (sizeof(minmax_args) / sizeof(minmax_args[0]))
+
+void gen_minmax_sig(FILE *stream, const char *name, const char *type)
+{
+    gen_func_sig(stream, type, name, type, minmax_args, MINMAX_ARITY);
+}
+
+void gen_minmax_decl(FILE *stream, const char *name, const char *type)
+{
+    gen_minmax_sig(stream, name, type);
+    fprintf(stream, ";\n");
+}
+
+void gen_min_impl(FILE *stream, const char *name, const char *type)
+{
+    gen_minmax_sig(stream, name, type);
+    fprintf(stream, "\n");
+    fprintf(stream, "{\n");
+    static_assert(MINMAX_ARITY == 2, "Unexpected arity of min/max functions");
+    fprintf(stream, "    return %s < %s ? %s : %s;\n", 
+            minmax_args[0], minmax_args[1], minmax_args[0], minmax_args[1]);
+    fprintf(stream, "}\n");
+}
+
+void gen_max_impl(FILE *stream, const char *name, const char *type)
+{
+    gen_minmax_sig(stream, name, type);
+    fprintf(stream, "\n");
+    fprintf(stream, "{\n");
+    static_assert(MINMAX_ARITY == 2, "Unexpected arity of min/max functions");
+    fprintf(stream, "    return %s < %s ? %s : %s;\n", 
+            minmax_args[0], minmax_args[1], minmax_args[1], minmax_args[0]);
+    fprintf(stream, "}\n");
+}
+
 static char *sqrlen_arg_name = "a";
 
 void gen_vector_sqrlen_sig(FILE *stream, size_t n, Type_Def type_def)
@@ -530,6 +568,8 @@ int main()
         fprintf(stream, "\n");
         gen_lerp_decl(stream, "lerpf", "float");
         gen_lerp_decl(stream, "lerp", "double");
+        gen_minmax_decl(stream, "mini", "int");
+        gen_minmax_decl(stream, "maxi", "int");
         fprintf(stream, "\n");
         for (size_t n = VECTOR_MIN_SIZE; n <= VECTOR_MAX_SIZE; ++n) {
             for (Type type = 0; type < COUNT_TYPES; ++type) {
@@ -578,6 +618,10 @@ int main()
         fputc('\n', stream);
         gen_lerp_impl(stream, "lerp", "double");
         fputc('\n', stream);
+        gen_min_impl(stream, "mini", "int");
+        fputc('\n', stream);
+        gen_max_impl(stream, "maxi", "int");
+        fputc('\n', stream);
         for (size_t n = VECTOR_MIN_SIZE; n <= VECTOR_MAX_SIZE; ++n) {
             for (Type type = 0; type < COUNT_TYPES; ++type) {
                 gen_vector_ctor_impl(stream, n, type_defs[type]);