#ifndef __VXGG_REWRITE___ARENA_H___25077218513438___ #define __VXGG_REWRITE___ARENA_H___25077218513438___ #include // Normal arena. Can expand in size beyond original allocation typedef struct arena arena; // A wrapper for the normal arena struct. Can not expand in size typedef arena simplearena; // Bitwise operation to check if a number is a power of 2 #define ISPOWOF2(x) (((x) & ((x) - 1)) == 0) // Variable for memory alignment static const size_t MEM_ALIGN_BYTES = (2 * sizeof(void*)); // Macro to get the remaining bytes necessary to be on a power of 2 #define MEM_ALIGN(x) ((x) + (((x) & (MEM_ALIGN_BYTES - 1)) != 0) * (MEM_ALIGN_BYTES - ((x) & (MEM_ALIGN_BYTES - 1)))) // Initialize an arena with `bytes` bytes of pre-allocated memory. Exits / returns NULL on error depending on the value of `___VXGG___USE_XALLOC_FOR_ARENAS___` arena * arena_init(size_t bytes); // Take `bytes` bytes of memory from `arena`'s memory pool. Exits / returns NULL on error depending on the value of `___VXGG___USE_XALLOC_FOR_ARENAS___` void * arena_alloc(arena * const arena, size_t bytes); // Free an arena its memory pool(s). Returns -1 and sets `errno` if the given arena is NULL void arena_free(void *a); // Initializes a simple arena. simplearena * simplearena_init(size_t bytes); // Grabs some memory from the simple arena's pool. Exits / returns NULL on error depending on the value of `___VXGG___USE_XALLOC_FOR_ARENAS___` void * simplearena_alloc(simplearena * const a, size_t bytes); // Free a simple arena. Exits / returns -1 on error depending on the value of `___VXGG___USE_XALLOC_FOR_ARENAS___` void simplearena_free(simplearena *a); #endif