feat(arena.c): Added arena init and added ArenaResult
Want to handle errors with results, even if it meas boilerplate
This commit is contained in:
@@ -17,6 +17,7 @@ typedef enum {
|
|||||||
ARENA_BAD_ALLOC,
|
ARENA_BAD_ALLOC,
|
||||||
ARENA_OUT_OF_SPACE,
|
ARENA_OUT_OF_SPACE,
|
||||||
ARENA_NULL_ARG,
|
ARENA_NULL_ARG,
|
||||||
|
ARENA_INVALID_SIZE,
|
||||||
} ArenaErr;
|
} ArenaErr;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -27,11 +28,19 @@ typedef struct {
|
|||||||
};
|
};
|
||||||
} ArenaPointer;
|
} ArenaPointer;
|
||||||
|
|
||||||
Arena arena_init(void *buffer, size_t size);
|
typedef struct {
|
||||||
|
bool is_valid;
|
||||||
|
union {
|
||||||
|
ArenaErr err;
|
||||||
|
Arena arena;
|
||||||
|
};
|
||||||
|
} ArenaResult;
|
||||||
|
|
||||||
|
ArenaResult arena_init(void *buffer, size_t size);
|
||||||
void arena_destroy(Arena *arena);
|
void arena_destroy(Arena *arena);
|
||||||
|
|
||||||
ArenaPointer arena_alloc(Arena *arena, size_t size, size_t alignment);
|
ArenaPointer arena_alloc(Arena *arena, size_t size, size_t alignment);
|
||||||
ArenaPointer arena_push(Arena *arena, void *data);
|
ArenaErr arena_push(Arena *arena, void *data, size_t size);
|
||||||
ArenaErr arena_realloc(Arena *arena, size_t new_size);
|
ArenaErr arena_realloc(Arena *arena, size_t new_size);
|
||||||
|
|
||||||
size_t align_arena_offset(Arena *arena, size_t alignment);
|
size_t align_arena_offset(Arena *arena, size_t alignment);
|
||||||
|
|||||||
33
src/arena.c
33
src/arena.c
@@ -1 +1,34 @@
|
|||||||
#include "arena.h"
|
#include "arena.h"
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
ArenaResult arena_init(void *buffer, size_t size) {
|
||||||
|
if (buffer == NULL) {
|
||||||
|
ArenaResult err = {
|
||||||
|
.is_valid = false,
|
||||||
|
.err = ARENA_NULL_ARG,
|
||||||
|
};
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size < 1) {
|
||||||
|
ArenaResult err = {
|
||||||
|
.is_valid = false,
|
||||||
|
.err = ARENA_INVALID_SIZE,
|
||||||
|
};
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
Arena new_arena = {
|
||||||
|
.data = buffer,
|
||||||
|
.size = size,
|
||||||
|
.offset = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
ArenaResult val = {
|
||||||
|
.is_valid = true,
|
||||||
|
.arena = new_arena,
|
||||||
|
};
|
||||||
|
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user