aboutsummaryrefslogtreecommitdiff
path: root/std
diff options
context:
space:
mode:
Diffstat (limited to 'std')
-rw-r--r--std/vector.cup40
1 files changed, 40 insertions, 0 deletions
diff --git a/std/vector.cup b/std/vector.cup
new file mode 100644
index 0000000..eb76155
--- /dev/null
+++ b/std/vector.cup
@@ -0,0 +1,40 @@
+import "std/common.cup"
+
+struct Vector {
+ size: int;
+ capacity: int;
+ data: void**;
+};
+
+fn vector_new_sized(capacity: int): Vector* {
+ let t: Vector* = malloc(sizeof(Vector));
+ t.size = 0;
+ t.capacity = capacity;
+ t.data = malloc(capacity * sizeof(void*));
+ return t;
+}
+
+fn vector_new(): Vector* {
+ const initial_default_capacity = 4;
+ return vector_new_sized(initial_default_capacity);
+}
+
+fn vector_push(vec: Vector*, item: void*) {
+ if (vec.size == vec.capacity) {
+ let new_capacity = vec.capacity * 2;
+ let new_data = malloc(new_capacity * sizeof(void*));
+ memcpy(new_data, vec.data, vec.capacity * sizeof(void*));
+ vec.data = new_data;
+ vec.capacity = new_capacity;
+ }
+ vec.data[vec.size] = item;
+ vec.size = vec.size + 1;
+}
+
+fn vector_pop(vec: Vector*): void* {
+ if (vec.size == 0)
+ die("Vector is empty, nothing to pop.");
+
+ vec.size = vec.size - 1;
+ return vec.data[vec.size];
+} \ No newline at end of file