arena.ha (746B)
1 use allocate; 2 3 export type arena = struct { 4 al: allocate::allocator, 5 heap: *[*]u8, 6 s: size, 7 pos: size 8 }; 9 10 const vtable = allocate::vtable { 11 create = &create, 12 destroy = &allocate::destroy_nothing, 13 finish = &finish 14 }; 15 16 fn create(al: *allocate::allocator, obj: *opaque, s: size) (*opaque | nomem) = { 17 let arena = al: *arena; 18 if (arena.pos + s > arena.s) return nomem; 19 20 allocate::copy(&arena.heap[arena.pos]: *[*]u8, obj: *[*]u8, s); 21 defer arena.pos += s; 22 return &arena.heap[arena.pos]: *opaque; 23 }; 24 25 fn finish(al: *allocate::allocator) void = { 26 let arena = al: *arena; 27 free(arena.heap); 28 }; 29 30 export fn new(s: size) (arena | nomem) = { 31 return arena{ 32 al = &vtable, 33 heap: *[*]u8 = alloc([0...], s)?: *[*]u8, 34 s = s, 35 pos = 0z 36 }; 37 };