45 lines
1.2 KiB
C
45 lines
1.2 KiB
C
#pragma once
|
|
// base_arena.h - Linear arena allocator
|
|
// Simplified from raddebugger's virtual-memory-backed arena to a malloc-based one.
|
|
// Suitable for per-frame scratch allocations and persistent state.
|
|
|
|
#include "base/base_core.h"
|
|
|
|
////////////////////////////////
|
|
// Arena type
|
|
|
|
typedef struct Arena {
|
|
U8 *base;
|
|
U64 pos;
|
|
U64 cap;
|
|
} Arena;
|
|
|
|
// Temporary scope (save/restore position)
|
|
typedef struct Temp {
|
|
Arena *arena;
|
|
U64 pos;
|
|
} Temp;
|
|
|
|
////////////////////////////////
|
|
// Arena functions
|
|
|
|
Arena *arena_alloc(U64 cap);
|
|
void arena_release(Arena *arena);
|
|
void *arena_push(Arena *arena, U64 size);
|
|
void *arena_push_no_zero(Arena *arena, U64 size);
|
|
U64 arena_pos(Arena *arena);
|
|
void arena_pop_to(Arena *arena, U64 pos);
|
|
void arena_clear(Arena *arena);
|
|
|
|
////////////////////////////////
|
|
// Temporary scope helpers
|
|
|
|
static inline Temp temp_begin(Arena *arena) { Temp t = {arena, arena->pos}; return t; }
|
|
static inline void temp_end(Temp temp) { arena_pop_to(temp.arena, temp.pos); }
|
|
|
|
////////////////////////////////
|
|
// Push helper macros
|
|
|
|
#define push_array(arena, T, count) ((T *)arena_push((arena), sizeof(T) * (count)))
|
|
#define push_array_no_zero(arena, T, count) ((T *)arena_push_no_zero((arena), sizeof(T) * (count)))
|