arena.h (1023B)
1 #ifndef ARENA_H 2 #define ARENA_H 3 4 #include <assert.h> 5 #include <stdalign.h> 6 #include <stddef.h> 7 #include <stdint.h> 8 9 #define ISPOW2(v) (((v) & ((v) - 1)) == 0) 10 #define IS_ALIGNED(v, align) ((v) & ((align) - 1)) 11 #define ALIGN_PREV(v, align) ((v) & ~((align) - 1)) 12 #define ALIGN_NEXT(v, align) ALIGN_PREV(((v) + ((align) - 1)), (align)) 13 14 struct arena { 15 void *ptr; 16 size_t cap, len; 17 }; 18 19 static inline void 20 arena_reset(struct arena *arena) 21 { 22 arena->len = 0; 23 } 24 25 static inline void * 26 arena_alloc(struct arena *arena, size_t size, size_t align) 27 { 28 assert(size); 29 assert(align); 30 assert(ISPOW2(align)); 31 32 uintptr_t ptr = (uintptr_t) arena->ptr; 33 uintptr_t aligned_ptr = ALIGN_NEXT(ptr + arena->len, align); 34 if (ptr + arena->cap < aligned_ptr + size) 35 return NULL; 36 37 arena->len = (aligned_ptr - ptr) + size; 38 39 return (void *) aligned_ptr; 40 } 41 42 #define ARENA_ALLOC_ARRAY(arena, T, n) \ 43 arena_alloc((arena), sizeof(T) * (n), alignof(T)) 44 45 #define ARENA_ALLOC_SIZED(arena, T) \ 46 ARENA_ALLOC_ARRAY((arena), T, 1) 47 48 #endif /* ARENA_H */