zpy

A lisp like language written in hare
Log | Files | Refs

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 };