Is to make it more consistent, i need to change also later arraylist the init function so its also more consistent, next is making alloc ensure capacity first so no using it first or some shit.
64 lines
1.4 KiB
C
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);
|
|
void 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
|