kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

arena.h (1221B)


      1 #ifndef KIT_ARENA_H
      2 #define KIT_ARENA_H
      3 
      4 #include "core/core.h"
      5 #include "core/heap.h"
      6 
      7 typedef struct ArenaBlock ArenaBlock;
      8 
      9 struct Arena {
     10   Heap* heap;
     11   ArenaBlock* head; /* oldest block (allocation order); NULL until 1st alloc */
     12   ArenaBlock* cur_block; /* block currently being filled */
     13   u8* cur;               /* bump cursor within cur_block */
     14   u8* end;               /* end of cur_block's buffer */
     15   size_t block_size;     /* base / minimum block size */
     16   size_t next_size; /* geometric size for the next freshly allocated block */
     17 };
     18 
     19 void arena_init(Arena*, Heap*, size_t block_size);
     20 void arena_fini(Arena*);
     21 void arena_reset(Arena*);
     22 int arena_is_empty(const Arena*);
     23 void* arena_alloc(Arena*, size_t size, size_t align);
     24 void* arena_zalloc(Arena*, size_t size, size_t align); /* zeroed; NULL on OOM */
     25 char* arena_strdup(Arena*, const char* s, size_t len);
     26 
     27 #define arena_new(a, T) ((T*)arena_alloc((a), sizeof(T), _Alignof(T)))
     28 #define arena_znew(a, T) ((T*)arena_zalloc((a), sizeof(T), _Alignof(T)))
     29 #define arena_array(a, T, n) \
     30   ((T*)arena_alloc((a), sizeof(T) * (size_t)(n), _Alignof(T)))
     31 #define arena_zarray(a, T, n) \
     32   ((T*)arena_zalloc((a), sizeof(T) * (size_t)(n), _Alignof(T)))
     33 
     34 #endif