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;
|
SLList!(ArenaPool) pools;
|
||||||
u64 pool_length;
|
u64 pool_length;
|
||||||
u64 length;
|
u64 length;
|
||||||
};
|
}
|
||||||
|
|
||||||
|
struct TempArena
|
||||||
|
{
|
||||||
|
Arena* arena;
|
||||||
|
Node!(ArenaPool)* start_node;
|
||||||
|
u64 start_pos;
|
||||||
|
}
|
||||||
|
|
||||||
T*
|
T*
|
||||||
MAlloc(T)()
|
MAlloc(T)()
|
||||||
@ -93,7 +100,60 @@ CreateArena(u64 size)
|
|||||||
AddArenaPool(&arena);
|
AddArenaPool(&arena);
|
||||||
|
|
||||||
return 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
|
void
|
||||||
AddArenaPool(Arena* arena)
|
AddArenaPool(Arena* arena)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user