pak

pak.git
git clone git://git.lenczewski.org/pak.git
Log | Files | Refs | README | LICENSE

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 */