Files
Arena/include/arena.h
laentropia 6c91e1f681 refactor: init and destroy, alloc now first ensures cap
its better usability and is better that it ensures capacity in alloc
like that is what is supposed to be like damn, why i did it like that
2026-05-13 20:10:40 -06:00

64 lines
1.4 KiB
C

#ifndef ARENA_H
#define ARENA_H
#include <stdint.h>
#include <stdlib.h>
#include <inttypes.h>
#include <stdbool.h>
typedef struct Arena Arena;
typedef enum {
ARENA_OK = 0,
ARENA_BAD_ALLOC,
ARENA_OUT_OF_SPACE,
ARENA_NULL_ARG,
ARENA_INVALID_SIZE,
ARENA_INVALID_ALIGN,
ARENA_CAPACITY_OVERFLOW,
} ArenaErr;
typedef struct {
bool is_valid;
union {
ArenaErr err;
struct {
Arena *arena;
size_t offset;
};
};
} ArenaPointer;
typedef struct {
bool is_valid;
union {
ArenaErr err;
Arena *arena;
};
} ArenaResult;
typedef struct {
bool is_valid;
union {
ArenaErr err;
size_t val;
};
} ArenaSizeResult;
ArenaErr arena_init(Arena **arena, size_t capacity);
ArenaErr arena_destroy(Arena **arena);
ArenaPointer arena_alloc(Arena *arena, size_t size, size_t alignment);
ArenaPointer arena_push(Arena *arena, void *data, size_t size, size_t alignment);
ArenaErr arena_realloc(Arena *arena, size_t new_capacity);
void *arena_unwrap_pointer(ArenaPointer p);
ArenaSizeResult arena_get_align_padding(Arena *arena, size_t alignment);
// can take big sizes but of sourse there is a limit,
// its protected against SIZE_MAX but anything that
// is big may break it, still, is an edge case that
// I shouldn't cover.
ArenaErr arena_ensure_capacity(Arena *arena, size_t size, size_t alignment);
#endif // !ARENA_H