From b33ee6afa74ab1e83554d1b535d81c7df0b3fca5 Mon Sep 17 00:00:00 2001 From: lemon Date: Wed, 10 Aug 2022 04:12:33 +0200 Subject: many bugfix --- src/vec.hff | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/vec.hff (limited to 'src/vec.hff') 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 { + 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 } + } + } +] -- cgit v1.2.3