starfield

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

utils.h (629B)


      1 #ifndef UTILS_H
      2 #define UTILS_H
      3 
      4 #include "starfield/types.h"
      5 
      6 struct arena {
      7 	void *ptr;
      8 	u64 cap, len;
      9 };
     10 
     11 inline void
     12 arena_reset(struct arena *arena)
     13 {
     14 	arena->len = 0;
     15 }
     16 
     17 inline void *
     18 arena_alloc(struct arena *arena, u64 size, u64 alignment)
     19 {
     20 	u64 aligned_len = ALIGN_NEXT(arena->len, alignment);
     21 
     22 	if (arena->cap < aligned_len + size)
     23 		return NULL;
     24 
     25 	void *ptr = (u8 *) arena->ptr + aligned_len;
     26 	arena->len = aligned_len + size;
     27 
     28 	return ptr;
     29 }
     30 
     31 #define PUSH_SIZED(arena, T) arena_alloc(arena, sizeof(T), alignof(T))
     32 #define PUSH_ARRAY(arena, T, n) arena_alloc(arena, sizeof(T) * (n), alignof(T))
     33 
     34 #endif /* UTILS_H */