alloc.h (1221B)
1 #ifndef ALLOC_H 2 #define ALLOC_H 3 4 #include <assert.h> 5 #include <stdalign.h> 6 #include <stdint.h> 7 #include <stddef.h> 8 9 #define IS_POW2(v) (((v) & ((v) - 1)) == 0) 10 #define IS_ALIGNED(v, align) (((v) & ((align) - 1)) == 0) 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 uint64_t cap, len; 17 }; 18 19 inline void 20 arena_reset(struct arena *arena) 21 { 22 arena->len = 0; 23 } 24 25 inline void * 26 arena_alloc(struct arena *arena, size_t size, size_t align) 27 { 28 assert(size); 29 assert(align); 30 assert(IS_POW2(align)); 31 32 uintptr_t aligned_ptr = ALIGN_NEXT((uintptr_t) arena->ptr + arena->len, align); 33 if (aligned_ptr + size > (uintptr_t) arena->ptr + arena->cap) 34 return NULL; 35 36 arena->len = (aligned_ptr - (uintptr_t) arena->ptr) + size; 37 38 return (void *) aligned_ptr; 39 } 40 41 #define ARENA_ALLOC_ARRAY(arena, T, n) \ 42 (T *) arena_alloc((arena), sizeof(T) * (n), alignof(T)) 43 44 #define ARENA_ALLOC_SIZED(arena, T) ARENA_ALLOC_ARRAY((arena), T, 1) 45 46 #endif /* ALLOC_H */ 47 48 #ifdef HEADER_IMPL 49 50 extern inline void 51 arena_reset(struct arena *arena); 52 53 54 extern inline void * 55 arena_alloc(struct arena *arena, size_t size, size_t align); 56 57 #endif /* HEADER_IMPL */