diff --git a/01_no_metaprogramming/main.c b/01_no_metaprogramming/main.c new file mode 100644 index 0000000..4b7c3b1 --- /dev/null +++ b/01_no_metaprogramming/main.c @@ -0,0 +1,16 @@ +#include "vec.h" +#include + +int main(int argc, char *argv[]) { + vec2i_t v1 = (vec2i_t){2, 3}; + vec2i_t v2 = (vec2i_t){4, 5}; + + vec_print(vec2i_t, vec_add(vec2i_t, v1, v2)); + vec_print(vec2i_t, vec_sub(vec2i_t, v1, v2)); + vec_print(vec2i_t, vec_mul(vec2i_t, v1, v2)); + printf("%d\n", vec_dot(vec2i_t, v1, v2)); + printf("%d\n", vec_magnitude(vec2i_t, v1)); + printf("%d\n", vec_magnitude(vec2i_t, v2)); + + return 0; +} diff --git a/01_no_metaprogramming/vec.c b/01_no_metaprogramming/vec.c new file mode 100644 index 0000000..7c9c078 --- /dev/null +++ b/01_no_metaprogramming/vec.c @@ -0,0 +1,96 @@ +#include "vec.h" +#include "../aliases.h" +#include +#include + +void vec_print_vec2i_t(vec2i_t v) { printf("{%d, %d}\n", v.x, v.y); } + +vec2i_t vec_add_vec2i_t(vec2i_t v1, vec2i_t v2) { + return (vec2i_t){.x = v1.x + v2.x, .y = v1.y + v2.y}; +} + +vec2i_t vec_sub_vec2i_t(vec2i_t v1, vec2i_t v2) { + return (vec2i_t){.x = v1.x - v2.x, .y = v1.y - v2.y}; +} + +vec2i_t vec_mul_vec2i_t(vec2i_t v1, vec2i_t v2) { + return (vec2i_t){.x = v1.x * v2.x, .y = v1.y * v2.y}; +} + +i32 vec_dot_vec2i_t(vec2i_t v1, vec2i_t v2) { + return v1.x * v2.x + v1.y * v2.y; +} + +i32 vec_magnitude_vec2i_t(vec2i_t v) { + i32 dot_product = vec_dot_vec2i_t(v, v); + return (i32)sqrtf((f32)dot_product); +} + +void vec_print_vec2f_t(vec2f_t v) { printf("{%f, %f}\n", v.x, v.y); } + +vec2f_t vec_add_vec2f_t(vec2f_t v1, vec2f_t v2) { + return (vec2f_t){.x = v1.x + v2.x, .y = v1.y + v2.y}; +} + +vec2f_t vec_sub_vec2f_t(vec2f_t v1, vec2f_t v2) { + return (vec2f_t){.x = v1.x - v2.x, .y = v1.y - v2.y}; +} + +vec2f_t vec_mul_vec2f_t(vec2f_t v1, vec2f_t v2) { + return (vec2f_t){.x = v1.x * v2.x, .y = v1.y * v2.y}; +} + +f32 vec_dot_vec2f_t(vec2f_t v1, vec2f_t v2) { + return v1.x * v2.x + v1.y * v2.y; +} + +f32 vec_magnitude_vec2f_t(vec2f_t v) { + f32 dot_product = vec_dot_vec2f_t(v, v); + return sqrtf(dot_product); +} + +void vec_print_vec3i_t(vec3i_t v) { printf("{%d, %d, %d}\n", v.x, v.y, v.z); } + +vec3i_t vec_add_vec3i_t(vec3i_t v1, vec3i_t v2) { + return (vec3i_t){.x = v1.x + v2.x, .y = v1.y + v2.y, .z = v1.z + v2.z}; +} + +vec3i_t vec_sub_vec3i_t(vec3i_t v1, vec3i_t v2) { + return (vec3i_t){.x = v1.x - v2.x, .y = v1.y - v2.y, .z = v1.z - v2.z}; +} + +vec3i_t vec_mul_vec3i_t(vec3i_t v1, vec3i_t v2) { + return (vec3i_t){.x = v1.x * v2.x, .y = v1.y * v2.y, .z = v1.z * v2.z}; +} + +i32 vec_dot_vec3i_t(vec3i_t v1, vec3i_t v2) { + return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z; +} + +i32 vec_magnitude_vec3i_t(vec3i_t v) { + i32 dot_product = vec_dot_vec3i_t(v, v); + return (i32)sqrtf((f32)dot_product); +} + +void vec_print_vec3f_t(vec3f_t v) { printf("{%f, %f, %f}\n", v.x, v.y, v.z); } + +vec3f_t vec_add_vec3f_t(vec3f_t v1, vec3f_t v2) { + return (vec3f_t){.x = v1.x + v2.x, .y = v1.y + v2.y, .z = v1.z + v2.z}; +} + +vec3f_t vec_sub_vec3f_t(vec3f_t v1, vec3f_t v2) { + return (vec3f_t){.x = v1.x - v2.x, .y = v1.y - v2.y, .z = v1.z - v2.z}; +} + +vec3f_t vec_mul_vec3f_t(vec3f_t v1, vec3f_t v2) { + return (vec3f_t){.x = v1.x * v2.x, .y = v1.y * v2.y, .z = v1.z * v2.z}; +} + +f32 vec_dot_vec3f_t(vec3f_t v1, vec3f_t v2) { + return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z; +} + +f32 vec_magnitude_vec3f_t(vec3f_t v) { + f32 dot_product = vec_dot_vec3f_t(v, v); + return sqrtf(dot_product); +} diff --git a/01_no_metaprogramming/vec.h b/01_no_metaprogramming/vec.h new file mode 100644 index 0000000..3b46653 --- /dev/null +++ b/01_no_metaprogramming/vec.h @@ -0,0 +1,63 @@ +#ifndef VEC_H +#define VEC_H + +#include "../aliases.h" + +typedef struct { + i32 x; + i32 y; +} vec2i_t; + +typedef struct { + f32 x; + f32 y; +} vec2f_t; + +typedef struct { + i32 x; + i32 y; + i32 z; +} vec3i_t; + +typedef struct { + f32 x; + f32 y; + f32 z; +} vec3f_t; + +#define vec_print(T, v1) vec_print_##T(v1) +#define vec_add(T, v1, v2) vec_add_##T(v1, v2) +#define vec_sub(T, v1, v2) vec_sub_##T(v1, v2) +#define vec_mul(T, v1, v2) vec_mul_##T(v1, v2) +#define vec_dot(T, v1, v2) vec_dot_##T(v1, v2) +#define vec_magnitude(T, v) vec_magnitude_##T(v) + +void vec_print_vec2i_t(vec2i_t v); +vec2i_t vec_add_vec2i_t(vec2i_t v1, vec2i_t v2); +vec2i_t vec_sub_vec2i_t(vec2i_t v1, vec2i_t v2); +vec2i_t vec_mul_vec2i_t(vec2i_t v1, vec2i_t v2); +i32 vec_dot_vec2i_t(vec2i_t v1, vec2i_t v2); +i32 vec_magnitude_vec2i_t(vec2i_t v); + +void vec_print_vec2f_t(vec2f_t v); +vec2f_t vec_add_vec2f_t(vec2f_t v1, vec2f_t v2); +vec2f_t vec_sub_vec2f_t(vec2f_t v1, vec2f_t v2); +vec2f_t vec_mul_vec2f_t(vec2f_t v1, vec2f_t v2); +f32 vec_dot_vec2f_t(vec2f_t v1, vec2f_t v2); +f32 vec_magnitude_vec2f_t(vec2f_t v); + +void vec_print_vec3i_t(vec3i_t v); +vec3i_t vec_add_vec3i_t(vec3i_t v1, vec3i_t v2); +vec3i_t vec_sub_vec3i_t(vec3i_t v1, vec3i_t v2); +vec3i_t vec_mul_vec3i_t(vec3i_t v1, vec3i_t v2); +i32 vec_dot_vec3i_t(vec3i_t v1, vec3i_t v2); +i32 vec_magnitude_vec3i_t(vec3i_t v); + +void vec_print_vec3f_t(vec3f_t v); +vec3f_t vec_add_vec3f_t(vec3f_t v1, vec3f_t v2); +vec3f_t vec_sub_vec3f_t(vec3f_t v1, vec3f_t v2); +vec3f_t vec_mul_vec3f_t(vec3f_t v1, vec3f_t v2); +f32 vec_dot_vec3f_t(vec3f_t v1, vec3f_t v2); +f32 vec_magnitude_vec3f_t(vec3f_t v); + +#endif // !VEC_H