diff --git a/alloc.d b/alloc.d index bf04bb1..ab49ec9 100644 --- a/alloc.d +++ b/alloc.d @@ -31,7 +31,14 @@ struct Arena SLList!(ArenaPool) pools; u64 pool_length; u64 length; -}; +} + +struct TempArena +{ + Arena* arena; + Node!(ArenaPool)* start_node; + u64 start_pos; +} T* MAlloc(T)() @@ -93,7 +100,60 @@ CreateArena(u64 size) AddArenaPool(&arena); return arena; -}; +} + +TempArena +BeginTempArena(Arena* arena) +{ + TempArena t = { + arena: arena, + }; + + auto n = arena.pools.first; + for(;;) + { + if(n.next == null) + { + t.start_node = n; + t.start_pos = n.value.pos; + break; + } + + n = n.next; + } + + return t; +} + +void +End(TempArena* t) +{ + bool resetting = false; + for(auto n = t.arena.pools.first; n != null; n = n.next) + { + if(t.start_node == n) + { + n.value.pos = t.start_pos; + resetting = true; + } + else if(resetting) + { + n.value.pos = 0; + } + } +} + +T[] +AllocArray(T)(TempArena* t, u64 count) +{ + return AllocArray!(T)(t.arena, count); +} + +T* +Alloc(T)(TempArena* t) +{ + return Alloc!(T)(t.arena); +} void AddArenaPool(Arena* arena)