static Arena *CreateArena(rawptr buffer, isize length) { Arena *arena = (Arena *)buffer; buffer += ARENA_HEADER_SIZE; arena->buffer = buffer; arena->length = length; arena->pos = 0; return arena; } static rawptr ArenaAllocAlign(Arena *arena, isize size, isize align) { rawptr ptr; uintptr curr_ptr = (uintptr)arena->buffer + (uintptr)arena->pos; uintptr offset = AlignPow2(curr_ptr, align); offset -= (uintptr)arena->buffer; if (offset+size <= arena->length) { ptr = &arena->buffer[offset]; arena->pos = offset+size; } else { Printfln("Out of memory: %d", arena->init_line_no); Assert(0, "Memory Failure"); } return ptr; } static rawptr ArenaAlloc(Arena *arena, isize size) { return ArenaAllocAlign(arena, size, DEFAULT_ALIGNMENT); } static void ArenaFree(Arena *arena) { arena->pos = 0; } static void ArenaFreeZeroed(Arena *arena) { MemZero(arena->buffer, arena->pos); ArenaFree(arena); } static Arena * CreateArenaDebug(rawptr buffer, isize length, u32 init_line_no) { Arena *arena = CreateArena(buffer, length); arena->init_line_no = init_line_no; return arena; }