summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2023-02-06 20:10:05 -0800
committerKai Stevenson <kai@kaistevenson.com>2023-02-06 20:10:05 -0800
commit0d8e3fb79c4de063991b923adcc599a86d2c8cb6 (patch)
treec1c0f3979401d4bd9a697fa5c8d4b2e948a9fc43
parentb7f491a50f55c4175b0b5072a0f07e4f71b0e7ae (diff)
add vector.h
-rw-r--r--vector.c57
-rw-r--r--vector.h30
2 files changed, 87 insertions, 0 deletions
diff --git a/vector.c b/vector.c
new file mode 100644
index 0000000..846b361
--- /dev/null
+++ b/vector.c
@@ -0,0 +1,57 @@
+#include <stdlib.h>
+#include "vector.h"
+vector_t init_vector(int mx, int my) {
+ vector_t vector;
+ vector.mx = mx;
+ vector.my = my;
+ return vector;
+}
+vectorp_t init_vectorp(vector_t* vectors, int length) {
+ vectorp_t vectorP;
+ vectorP.vectors = vectors;
+ vectorP.length = length;
+ return vectorP;
+}
+bool vector_equals(vector_t v1, vector_t v2) {
+ return v1.mx == v2.mx && v1.my == v2.my;
+}
+vector_t vector_add(vector_t v1, vector_t v2) {
+ return init_vector(v1.mx + v2.mx, v1.my + v2.my);
+}
+vector_t vector_sub(vector_t v1, vector_t v2) {
+ return init_vector(v1.mx - v2.mx, v1.my - v2.my);
+}
+vectorp_t remove_vector(vectorp_t vectorp, int index) {
+ vector_t* vectors = malloc((vectorp.length - 1) * sizeof(vector_t));
+ for(int i = 0; i < vectorp.length - 1; i++) {
+ int correctedIndex = i > index ? i - 1 : i;
+ if(i != index) {
+ vectors[correctedIndex] = vectorp.vectors[i];
+ }
+ }
+ return init_vectorp(vectors, vectorp.length - 1);
+}
+vectorp_t remove_vectors(vectorp_t vectorp, int* indexes, int indexCount) {
+ vector_t* vectors = malloc((vectorp.length - indexCount) * sizeof(vector_t));
+ int correctedIndex = 0;
+ for(int i = 0; i < vectorp.length - indexCount; i++) {
+ int toRemove = 0;
+ for(int j = 0; j < indexCount; j++) {
+ if(i == indexes[j]) {
+ toRemove = 1;
+ break;
+ }
+ }
+ if(!toRemove) {
+ vectors[correctedIndex] = vectorp.vectors[i];
+ correctedIndex++;
+ }
+ }
+ return init_vectorp(vectors, vectorp.length - indexCount);
+}
+vectorpp_t init_vectorpp(vectorp_t* vectorps, int length) {
+ vectorpp_t vectorPP;
+ vectorPP.vectorps = vectorps;
+ vectorPP.length = length;
+ return vectorPP;
+}
diff --git a/vector.h b/vector.h
new file mode 100644
index 0000000..b4558a1
--- /dev/null
+++ b/vector.h
@@ -0,0 +1,30 @@
+#ifndef VECTOR
+#define VECTOR
+typedef struct Vector {
+ int mx;
+ int my;
+} vector_t;
+
+vector_t init_vector(int mx, int my);
+bool vector_equals(vector_t v1, vector_t v2);
+vector_t vector_add(vector_t v1, vector_t v2);
+vector_t vector_sub(vector_t v1, vector_t v2);
+
+typedef struct VectorP {
+ vector_t* vectors;
+ int length;
+} vectorp_t;
+
+vectorp_t init_vectorp(vector_t* vectors, int length);
+
+/* removes a vector from vectorp */
+vectorp_t remove_vector(vectorp_t vectorp, int index);
+vectorp_t remove_vectors(vectorp_t vectorp, int* indexes, int indexCount);
+typedef struct VectorPP {
+ vectorp_t* vectorps;
+ int length;
+} vectorpp_t;
+
+vectorpp_t init_vectorpp(vectorp_t* vectorps, int length);
+
+#endif