add temp arenas

This commit is contained in:
Matthew 2025-09-27 19:02:52 +10:00
parent cadb2b5f85
commit 235b077266

62
alloc.d
View File

@ -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,8 +100,61 @@ 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)
{