ws

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

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