add temp arenas
This commit is contained in:
parent
cadb2b5f85
commit
235b077266
64
alloc.d
64
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)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user