From 36913bf365ea92624da2c53dab00525d09282522 Mon Sep 17 00:00:00 2001
From: Abdelrahman Said <said.abdelrahman89@gmail.com>
Date: Wed, 20 Dec 2023 00:05:27 +0000
Subject: [PATCH] Add vector types and functions

---
 include/vector/vec.h | 53 ++++++++++++++++++++++++++++++++++++
 src/vector/vec.c     | 65 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 118 insertions(+)
 create mode 100644 include/vector/vec.h
 create mode 100644 src/vector/vec.c

diff --git a/include/vector/vec.h b/include/vector/vec.h
new file mode 100644
index 0000000..fd1637d
--- /dev/null
+++ b/include/vector/vec.h
@@ -0,0 +1,53 @@
+#ifndef VEC_H
+#define VEC_H
+
+#include "c_cpp_aliases/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_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)
+
+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);
+
+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);
+
+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);
+
+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);
+
+#endif // !VEC_H
diff --git a/src/vector/vec.c b/src/vector/vec.c
new file mode 100644
index 0000000..7ecedf7
--- /dev/null
+++ b/src/vector/vec.c
@@ -0,0 +1,65 @@
+#include "vector/vec.h"
+
+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;
+}
+
+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;
+}
+
+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;
+}
+
+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;
+}