diff options
| author | spl3g <spleefer6@yandex.ru> | 2025-03-11 22:37:43 +0300 |
|---|---|---|
| committer | spl3g <spleefer6@yandex.ru> | 2025-03-11 22:37:43 +0300 |
| commit | a854e4cfa450590753171fbbe4dde8da4f504abd (patch) | |
| tree | fb1d91910e5a86a6460654af289fbb4b3ef707b7 /lib/arena.h | |
| parent | 74ab2f6b89ceb2af34524386d6003746570d2b03 (diff) | |
Move everything to the lib folder
Diffstat (limited to 'lib/arena.h')
| -rw-r--r-- | lib/arena.h | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/lib/arena.h b/lib/arena.h new file mode 100644 index 0000000..1ddddac --- /dev/null +++ b/lib/arena.h @@ -0,0 +1,40 @@ +#ifndef ARENA_H_ +#define ARENA_H_ + +#include <stdlib.h> +#include <stddef.h> +#include <stdint.h> +#include <assert.h> +#include <string.h> + +typedef struct region region; + +struct region { + region *next; + size_t cap; + size_t len; + uintptr_t data[]; +}; + +typedef struct { + region *beg; + region *end; +} arena; + +void *arena_alloc(arena *a, size_t size); +void arena_free(arena *a); +void grow_da(void *slice, size_t size, arena *arena); + + +#define new(a, t, c) (t *)arena_alloc(a, sizeof(t)*c) + +#define ARENA_REGION_DEFAULT_CAPACITY (8*1024); + +// from nullprogram +#define push(slice, arena) \ + ((slice)->len >= (slice)->cap \ + ? grow_da(slice, sizeof(*(slice)->data), arena), \ + (slice)->data + (slice)->len++ \ + : (slice)->data + (slice)->len++) + +#endif //ARENA_H_ |
