diff options
| author | 2022-08-10 04:12:33 +0200 | |
|---|---|---|
| committer | 2022-08-10 04:12:33 +0200 | |
| commit | b33ee6afa74ab1e83554d1b535d81c7df0b3fca5 (patch) | |
| tree | d5fb52a1529bf35658468adae796757e664bc792 /src/vec.hff | |
| parent | 769aa95cf3374117c86ec652117dcbab97497eec (diff) | |
many bugfix
Diffstat (limited to 'src/vec.hff')
| -rw-r--r-- | src/vec.hff | 38 |
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 } + } + } +] |