From 4ebbaaa4625577ac112691445db8472b5e658b44 Mon Sep 17 00:00:00 2001 From: Judah Caruso Date: Wed, 18 Feb 2026 23:31:03 -0700 Subject: [PATCH] region --- src/arena.c | 44 +++++++++++++++++++++++++++++++++++++------- src/main.c | 24 +++++++++++++++++------- 2 files changed, 54 insertions(+), 14 deletions(-) diff --git a/src/arena.c b/src/arena.c index 432a871..eb5bf0b 100644 --- a/src/arena.c +++ b/src/arena.c @@ -1,23 +1,27 @@ #include #include +#include -typedef enum { arena__alloc, arena__reset, arena__release } arena__action; +typedef enum { arena__alloc, arena__reset, arena__save, arena__restore, arena__release } arena__action; -typedef void* (^Arena)(arena__action, usize, usize, usize*, const char*, sreg); +typedef void* (^Arena)(arena__action, usize, usize, void*, const char*, sreg); -#define arena_new(A, T) cast(T*, A(arena__alloc, sizeof(T), alignof(T), 0, __FILE__, __LINE__)) -#define arena_reset(A) A(arena__reset, 0, 0, 0, __FILE__, __LINE__) -#define arena_release(A) A(arena__release, 0, 0, 0, __FILE__, __LINE__) +#define arena_new(A, T) cast(T*, A(arena__alloc, sizeof(T), alignof(T), 0, __FILE__, __LINE__)) +#define arena_make(A, C, T) cast(T*, A(arena__alloc, sizeof(T) * (C), alignof(T), 0, __FILE__, __LINE__)) +#define arena_reset(A) A(arena__reset, 0, 0, 0, __FILE__, __LINE__) +#define arena_release(A) A(arena__release, 0, 0, 0, __FILE__, __LINE__) +#define arena_save(A, SP) A(arena__save, 0, 0, (SP), __FILE__, __LINE__) +#define arena_restore(A, SP) A(arena__restore, 0, 0, (SP), __FILE__, __LINE__) // just a nice macro to make these easier to write -#define func(a1, a2, a3, a4, a5, a6) ^void* (arena__action a1, usize a2, usize a3, usize* a4, const char* a5, sreg a6) +#define func(a1, a2, a3, a4, a5, a6) ^void* (arena__action a1, usize a2, usize a3, void* a4, const char* a5, sreg a6) static Arena Static(u8* data, usize count) { memset(data, 0, count); capture usize offset = 0; - return closure(func(action, size, align, _1, _2, _3) { + return closure(func(action, size, align, savepoint, _2, _3) { switch (action) { default: { } break; @@ -35,6 +39,16 @@ Static(u8* data, usize count) { case arena__reset: { offset = 0; } break; + + case arena__save: { + assert(savepoint != NULL && "Static: savepoint was null"); + *cast(usize*, savepoint) = offset; + } break; + + case arena__restore: { + assert(savepoint != NULL && "Static: savepoint was null"); + offset = *cast(usize*, savepoint); + } break; } return 0; @@ -63,6 +77,8 @@ Logger(Arena arena) { case arena__alloc: action_str = "alloc"; break; case arena__reset: action_str = "reset"; break; case arena__release: action_str = "release"; break; + case arena__save: action_str = "save"; break; + case arena__restore: action_str = "restore"; break; } printf("[ARENA] %s:%zd: %s (%zu, %zu)\n", file, line, action_str, size, align); @@ -70,4 +86,18 @@ Logger(Arena arena) { }); } +static Arena +Region(Arena arena) { + capture usize savepoint = 0; + arena_save(arena, &savepoint); + + return closure(func(action, size, align, _, file, line) { + if (action == arena__reset || action == arena__restore) { + return arena(arena__restore, size, align, &savepoint, file, line); + } + + return arena(action, size, align, &savepoint, file, line); + }); +} + #undef func diff --git a/src/main.c b/src/main.c index 8b5d6f2..ffcb2b5 100644 --- a/src/main.c +++ b/src/main.c @@ -2,7 +2,6 @@ #include "base.c" #include "arena.c" -#define SOKOL_IMPL #ifdef PLATFORM_WINDOWS #define SOKOL_D3D11 @@ -14,6 +13,7 @@ #error "unsupported platform" #endif +#define SOKOL_IMPL #include "sokol/sokol_app.h" #include "sokol/sokol_gfx.h" #include "sokol/sokol_glue.h" @@ -64,6 +64,16 @@ init(void) { sreg* a = arena_new(arena, sreg); sreg* b = arena_new(arena, sreg); + + { + auto region = Region(arena); + scope_exit { arena_reset(region); }; + + arena_make(region, 10, sreg); + arena_make(region, 10, f32); + arena_make(region, 10, bool); + } + sreg* c = arena_new(arena, sreg); *a = 1024; @@ -96,14 +106,14 @@ frame(void) { }); sdtx_origin(0, 0); - sdtx_canvas(sapp_widthf(), sapp_heightf()); + sdtx_canvas(sapp_widthf(), sapp_heightf()); - sdtx_font(3); - sdtx_pos(1, 1); - sdtx_color3b(0, 0xFF, 0); - sdtx_puts("press escape to quit"); + sdtx_font(3); + sdtx_pos(1, 1); + sdtx_color3b(0, 0xFF, 0); + sdtx_puts("press escape to quit"); - sdtx_draw(); + sdtx_draw(); sg_end_pass(); sg_commit(); }