import "../mod/libfwdmem.so" import "../mod/libfwdutil.so" /* trait */ any = {} /* template */ vec[any type]() { <> { i64 s; i64 n; *[]type buf; } <>create((<>) next) { next((0 => s, 0 => n, * => buf)<>); } <>append(<> v, type n, (<>) next) { v.n = v.n + 1; if v.s == 0 { v.s = 1; } if v.n > v.s { if v.s == 0 { v.s = 1; } v.s = v.s * 2; fwdrealloc(v.buf, v.s as u64 * sizeof(type)) => ptr; v.buf = ptr; } /* in a real implementation this would be moved to after * fwdrealloc I guess, but this is fine for now */ nil v.buf {fwdpanic("no buf for vector");} => buf; buf*[v.n - 1] = n; next(v); } <>destroy(<> v) { fwdfree(v.buf); nil v; } } u8vec = vec[u8]()