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; } fn compact(vec *Vec) [#]T { if vec.dat { vec.cap = vec.len; vec.dat = realloc(vec.dat, vec.cap * sizeof T); } return vec.dat[0::vec.len]; } } defmacro vec_each(x, i, v, ...body) [ { let $v = v; for let i = 0; i < $v.len; ++i { let x = v.dat[i]; { body } } } ]