I need to assure that capacity is enough, i mean, for something like an array just doubling size is good because you are storing things that are the same size but for something like an arena you could actually store anything so we need to make sure the growth factor stays cool while an overflow doesn't occur, that's why the change with arena_calculate_capacity and also changing signatrues to use results, A LOT of boilerplate but i guess is fine for me.
58 lines
1.1 KiB
C
58 lines
1.1 KiB
C
#ifndef ARENA_H
|
|
#define ARENA_H
|
|
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
#include <inttypes.h>
|
|
#include <stdbool.h>
|
|
|
|
typedef struct {
|
|
uint8_t *buffer;
|
|
size_t size;
|
|
size_t offset;
|
|
} Arena;
|
|
|
|
typedef enum {
|
|
ARENA_OK = 0,
|
|
ARENA_BAD_ALLOC,
|
|
ARENA_OUT_OF_SPACE,
|
|
ARENA_NULL_ARG,
|
|
ARENA_INVALID_SIZE,
|
|
} ArenaErr;
|
|
|
|
typedef struct {
|
|
bool is_valid;
|
|
union {
|
|
ArenaErr err;
|
|
uint8_t *address;
|
|
};
|
|
} ArenaPointer;
|
|
|
|
typedef struct {
|
|
bool is_valid;
|
|
union {
|
|
ArenaErr err;
|
|
Arena arena;
|
|
};
|
|
} ArenaResult;
|
|
|
|
typedef struct {
|
|
bool is_valid;
|
|
union {
|
|
ArenaErr err;
|
|
size_t val;
|
|
};
|
|
} SizeResult;
|
|
|
|
ArenaResult arena_init(size_t size);
|
|
void arena_destroy(Arena *arena);
|
|
|
|
ArenaPointer arena_alloc(Arena *arena, size_t size, size_t alignment);
|
|
ArenaErr arena_push(Arena *arena, void *data, size_t size, size_t alignment);
|
|
ArenaErr arena_realloc(Arena *arena, size_t new_size);
|
|
|
|
SizeResult align_arena_offset(Arena *arena, size_t alignment);
|
|
SizeResult arena_compute_necessary_capacity(size_t capacity, size_t elem_size);
|
|
|
|
#endif // !ARENA_H
|