aboutsummaryrefslogtreecommitdiff
path: root/code/lib/vector.felan
diff options
context:
space:
mode:
Diffstat (limited to 'code/lib/vector.felan')
-rw-r--r--code/lib/vector.felan47
1 files changed, 47 insertions, 0 deletions
diff --git a/code/lib/vector.felan b/code/lib/vector.felan
new file mode 100644
index 0000000..61fe77c
--- /dev/null
+++ b/code/lib/vector.felan
@@ -0,0 +1,47 @@
+@import("operator.felan");
+@import("memory.felan");
+
+vector :: (comptime t:type)->type{
+ return struct {
+ ptr : *t;
+ size : u64;
+ capacity : u64;
+ };
+};
+
+vector_new :: (comptime t:type) -> (vector(t)) {
+ v : vector(t) = undefined;
+ v.ptr = malloc(0u64,@type_of(v.ptr.*));
+ v.size = 0u64;
+ v.capacity = 0u64;
+ return v;
+};
+
+__get_item__ :: (left:*vector(anytype),index:i64) -> (@type_of(left.*.ptr.*)) {
+ return (left.*.ptr + index).*;
+};
+
+__set_item__ :: (left:*vector(anytype),index:i64,item:@type_of(left.*.ptr.*)) -> (@type_of(left.*.ptr.*)) {
+ return (left.*.ptr + index).* = item;
+};
+
+__get_item_address__ :: (left:*vector(anytype),index:i64) -> (@type_of(left.*.ptr)) {
+ return (left.*.ptr + index);
+};
+
+push_back :: (vec:*vector(anytype),value:@type_of(vec.*[0])) -> void {
+ _grow_if_needed(vec);
+ vec.*[@cast(vec.*.size,i64)] = value;
+ vec.*.size += 1u64;
+};
+
+_grow_if_needed :: (vec:*vector(anytype)) -> void {
+ if vec.*.size == vec.*.capacity {
+ vec.*.capacity = vec.*.capacity + vec.*.capacity/2u64 + 1u64;
+ vec.*.ptr = realloc(vec.*.ptr,vec.*.capacity);
+ }
+};
+
+delete :: (vec:vector(anytype)) -> void {
+ free(vec.ptr);
+};