arena.h (1047B)
1 #ifndef ARENA_H 2 #define ARENA_H 3 4 #include <stdalign.h> 5 #include <stddef.h> 6 #include <stdint.h> 7 8 #define IS_POWER_OF_2(v) (((v) & ((v) - 1)) == 0) 9 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 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 alignment) 27 { 28 uintptr_t cur_ptr = (uintptr_t) arena->ptr + arena->len; 29 uintptr_t end_ptr = (uintptr_t) arena->ptr + arena->cap; 30 31 uintptr_t aligned_ptr = ALIGN_NEXT(cur_ptr, alignment); 32 if (end_ptr < aligned_ptr + size) 33 return NULL; 34 35 arena->len = (aligned_ptr + size) - (uintptr_t) arena->ptr; 36 37 return (void *) aligned_ptr; 38 } 39 40 #define ARENA_ALLOC_ARRAY(arena, T, n) \ 41 arena_alloc((arena), sizeof(T) * (n), alignof(T)) 42 43 #define ARENA_ALLOC_SIZED(arena, T) \ 44 ARENA_ALLOC_ARRAY((arena), T, 1) 45 46 #endif /* ARENA_H */