]> git.leonardobizzoni.com Git - CBuild/commitdiff
Linear algebra function definition
authorLeonardoBizzoni <leo2002714@gmail.com>
Wed, 8 Oct 2025 09:30:30 +0000 (11:30 +0200)
committerLeonardoBizzoni <leo2002714@gmail.com>
Wed, 8 Oct 2025 09:30:30 +0000 (11:30 +0200)
extra/code_generation.h
extra/linear_algebra.h

index 9d7e37c826db079d87afe08bb612885ea45af30f..e46c282c6aec67670000d82b8124479e34bb2734 100644 (file)
@@ -5,9 +5,12 @@ typedef struct {
   char **values;
   size_t count;
   size_t capacity;
-  size_t total_length;
 
-  bool has_args;
+  size_t total_length;
+  struct {
+    int32_t has_args;
+    int32_t spacing;
+  } signature;
 } CB_Generator;
 
 // ======================================================================
@@ -25,7 +28,10 @@ static void cb_gen_write(CB_Generator *gen, char *filepath, bool append_mode) {
   free(full_string);
   cb_handle_close(file);
   cb_dyn_free(gen);
-  gen->has_args = false;
+
+  gen->signature.has_args = 0;
+  gen->signature.spacing = 0;
+  gen->total_length = 0;
 }
 
 static void cb_gen_push(CB_Generator *gen, char *string) {
@@ -35,24 +41,30 @@ static void cb_gen_push(CB_Generator *gen, char *string) {
 
 static void cb_gen_sig_begin(CB_Generator *gen, char *signature_no_args) {
   cb_gen_push(gen, cb_format("%s(", signature_no_args));
+  gen->signature.spacing = strlen(signature_no_args) + 1;
 }
 
 static void cb_gen_sig_arg(CB_Generator *gen, char *argument) {
-  if (gen->has_args) {
+  if (gen->signature.has_args > 0 && gen->signature.has_args % 4 == 0) {
+    cb_gen_push(gen, ",\n");
+    cb_gen_push(gen, cb_format("%*s", gen->signature.spacing, ""));
+  } else if (gen->signature.has_args) {
     cb_gen_push(gen, ", ");
   }
-  gen->has_args = true;
+  gen->signature.has_args += 1;
   cb_gen_push(gen, argument);
 }
 
 static void cb_gen_sig_end(CB_Generator *gen, bool implementation) {
-  if (!gen->has_args) {
+  if (!gen->signature.has_args) {
     cb_gen_push(gen, "void");
   }
   cb_gen_push(gen, ")");
   if (!implementation) {
     cb_gen_push(gen, ";\n");
   }
+  gen->signature.has_args = 0;
+  gen->signature.spacing = 0;
 }
 
 #endif
index 4513b126727174928de1b4e603e3c68dcd6e81f2..a772a41ef8897292e9aed49f495791e032572129 100644 (file)
@@ -1,8 +1,16 @@
 #ifndef CBUILD_EXTRA_LINEAR_ALGEBRA_H
 #define CBUILD_EXTRA_LINEAR_ALGEBRA_H
 
-static void cb_linagen_define_vecn(CB_Generator *gen, char *type,
-                                   char *suffix, int32_t n) {
+static char char_toupper(char ch) {
+  if (ch >= 'a' && ch <= 'z') {
+    return ch - ('a' - 'A');
+  }
+  return ch;
+}
+
+static void cb_linagen_define_vecn(CB_Generator *gen, char *type, int32_t n) {
+  char *suffix = strdup(type);
+  *suffix = char_toupper(*type);
   cb_gen_push(gen, cb_format("typedef union {"
                              "\n  %s values[%d];"
                              "\n  struct {",
@@ -19,4 +27,43 @@ static void cb_linagen_define_vecn(CB_Generator *gen, char *type,
                              n, suffix));
 }
 
+static void cb_linagen_defun_vecn_add(CB_Generator *gen, char *type,
+                                      int32_t n, bool implementation) {
+  char *vec_suffix = strdup(type);
+  *vec_suffix = char_toupper(*type);
+  cb_gen_sig_begin(gen, cb_format("linagen_fn Vec%d%s vec%d%s_add",
+                                  n, vec_suffix, n, type));
+    cb_gen_sig_arg(gen, cb_format("Vec%d%s v1", n, vec_suffix));
+    cb_gen_sig_arg(gen, cb_format("Vec%d%s v2", n, vec_suffix));
+  cb_gen_sig_end(gen, implementation);
+  if (!implementation) { return; }
+
+  cb_gen_push(gen, cb_format(" {"
+                             "\n  Vec%d%s res = {0};",
+                             n, vec_suffix));
+  for (int32_t i = 0; i < n; ++i) {
+    cb_gen_push(gen, cb_format("\n  res._%d = v1._%d + v2._%d;", i, i, i));
+  }
+  cb_gen_push(gen, "\n  return res;"
+                   "\n}\n\n");
+}
+
+static void cb_linagen_defun_vecn_add_assign(CB_Generator *gen, char *type,
+                                             int32_t n, bool implementation) {
+  char *vec_suffix = strdup(type);
+  *vec_suffix = char_toupper(*type);
+  cb_gen_sig_begin(gen, cb_format("linagen_fn void vec%d%s_add_assign",
+                                  n, type));
+    cb_gen_sig_arg(gen, cb_format("Vec%d%s *v1", n, vec_suffix));
+    cb_gen_sig_arg(gen, cb_format("Vec%d%s v2", n, vec_suffix));
+  cb_gen_sig_end(gen, implementation);
+  if (!implementation) { return; }
+
+  cb_gen_push(gen, " {");
+  for (int32_t i = 0; i < n; ++i) {
+    cb_gen_push(gen, cb_format("\n  v1->_%d += v2._%d;", i, i));
+  }
+  cb_gen_push(gen, "\n}\n\n");
+}
+
 #endif