From 1bb3a0b1963ee68a48550c718e5176c659608824 Mon Sep 17 00:00:00 2001 From: Abdelrahman Said Date: Sun, 31 Dec 2023 15:42:55 +0000 Subject: [PATCH] Add simple memory arena implementation --- mem_arena/arena.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ mem_arena/arena.h | 18 ++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 mem_arena/arena.c create mode 100644 mem_arena/arena.h diff --git a/mem_arena/arena.c b/mem_arena/arena.c new file mode 100644 index 0000000..248b643 --- /dev/null +++ b/mem_arena/arena.c @@ -0,0 +1,47 @@ +#include "arena.h" +#include "../aliases.h" +#include +#include + +bool arena_init(arena_t *arena, u64 capacity) { + arena->buf = (u8 *)malloc(capacity); + if (!(arena->buf)) { + return false; + } + + arena->capacity = capacity; + + arena->offset = arena->buf; + + return true; +} + +u8 *arena_alloc(arena_t *arena, u64 size) { + if (arena->offset + size >= arena->buf + arena->capacity) { + return NULL; + } + + u8 *output = arena->offset; + + arena->offset += size; + + return output; +} + +void arena_clear(arena_t *arena) { + memset(arena->buf, 0, arena->offset - arena->buf); + + arena->offset = arena->buf; +} + +void arena_free(arena_t *arena) { + arena->capacity = 0; + + arena->offset = NULL; + + if (arena->buf) { + free(arena->buf); + } + + arena->buf = NULL; +} diff --git a/mem_arena/arena.h b/mem_arena/arena.h new file mode 100644 index 0000000..509444e --- /dev/null +++ b/mem_arena/arena.h @@ -0,0 +1,18 @@ +#ifndef ARENA_H +#define ARENA_H + +#include "../aliases.h" +#include + +typedef struct { + u64 capacity; + u8 *buf; + u8 *offset; +} arena_t; + +bool arena_init(arena_t *arena, u64 capacity); +u8 *arena_alloc(arena_t *arena, u64 size); +void arena_clear(arena_t *arena); +void arena_free(arena_t *arena); + +#endif // !ARENA_H