From a0b1fcf4e4205711dbcb922fa3fb32d35f917241 Mon Sep 17 00:00:00 2001 From: LeonardoBizzoni Date: Wed, 8 Oct 2025 11:30:30 +0200 Subject: [PATCH] Linear algebra function definition --- extra/code_generation.h | 24 ++++++++++++++----- extra/linear_algebra.h | 51 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 67 insertions(+), 8 deletions(-) diff --git a/extra/code_generation.h b/extra/code_generation.h index 9d7e37c..e46c282 100644 --- a/extra/code_generation.h +++ b/extra/code_generation.h @@ -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 diff --git a/extra/linear_algebra.h b/extra/linear_algebra.h index 4513b12..a772a41 100644 --- a/extra/linear_algebra.h +++ b/extra/linear_algebra.h @@ -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 -- 2.52.0