aboutsummaryrefslogtreecommitdiff
path: root/src/vec.hff
diff options
context:
space:
mode:
Diffstat (limited to 'src/vec.hff')
-rw-r--r--src/vec.hff38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/vec.hff b/src/vec.hff
new file mode 100644
index 0000000..8f794c9
--- /dev/null
+++ b/src/vec.hff
@@ -0,0 +1,38 @@
+import "all.hff";
+
+extern fn malloc(n usize) *void;
+struct Vec<T> {
+ dat *T,
+ len uint,
+ cap uint,
+
+ fn push(vec *Vec, x T) void {
+ if vec.len >= vec.cap {
+ vec.cap = (vec.len + 1) > 8 ? (vec.len + 1) * 2 : 8;
+ if vec.dat == #null {
+ vec.dat = malloc(vec.cap * sizeof T);
+ assert(vec.dat != #null, "malloc");
+ } else {
+ vec.dat = realloc(vec.dat, vec.cap * sizeof T);
+ assert(vec.dat != #null, "realloc");
+ }
+ }
+ vec.dat[vec.len++] = x;
+ }
+
+ fn clear(vec *Vec) void {
+ free(vec.dat);
+ vec.len = 0;
+ vec.cap = 0;
+ }
+}
+
+defmacro vec_each(x, i, v, ...body) [
+ {
+ let $v = v;
+ for let i = 0; i < $v.len; ++i {
+ let x = v.dat[i];
+ { body }
+ }
+ }
+]