region
This commit is contained in:
parent
df60b5f76f
commit
4ebbaaa462
2 changed files with 54 additions and 14 deletions
44
src/arena.c
44
src/arena.c
|
|
@ -1,23 +1,27 @@
|
|||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
|
||||
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
|
||||
|
|
|
|||
24
src/main.c
24
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();
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue