#pragma once
#include "box3d/base.h"
#include "container.h"
#include <stdbool.h>
#include <stddef.h>
#define B3_MAX_STACK_ENTRIES 32
typedef struct b3StackEntry
{
char* data;
const char* name;
int size;
bool usedMalloc;
} b3StackEntry;
typedef struct b3Stack
{
char* memory;
int capacity;
int index;
int allocation;
int maxAllocation;
b3StackEntry entries[B3_MAX_STACK_ENTRIES];
int entryCount;
} b3Stack;
typedef struct b3OverflowBlock
{
char* data;
int size;
} b3OverflowBlock;
b3DeclareArray( b3OverflowBlock );
typedef struct b3ArenaSharedState
{
b3Array( b3OverflowBlock ) overflows;
int maxIndex; int overflowBytes; int peakDemand; } b3ArenaSharedState;
typedef struct b3Arena
{
char* memory;
int capacity;
int index;
b3ArenaSharedState* shared;
} b3Arena;
#define B3_ARENA_ALIGNMENT 16
b3Stack b3CreateStack( int capacity );
void b3DestroyStack( b3Stack* stack );
void* b3StackAlloc( b3Stack* stack, int size, const char* name );
void b3StackFree( b3Stack* stack, void* mem );
void b3GrowStack( b3Stack* stack );
int b3GetStackCapacity( b3Stack* stack );
int b3GetStackAllocation( b3Stack* stack );
int b3GetMaxStackAllocation( b3Stack* stack );
b3Arena b3CreateArena( int capacity );
void b3DestroyArena( b3Arena* arena );
void* b3ArenaOverflowAlloc( b3Arena* arena, int size );
void b3ArenaSync( b3Arena* arena );
static inline void* b3Bump( b3Arena* arena, int size )
{
if ( size == 0 )
{
return NULL;
}
int aligned = ( arena->index + ( B3_ARENA_ALIGNMENT - 1 ) ) & ~( B3_ARENA_ALIGNMENT - 1 );
if ( aligned + size > arena->capacity )
{
return b3ArenaOverflowAlloc( arena, size );
}
arena->index = aligned + size;
if ( arena->index > arena->shared->maxIndex )
{
arena->shared->maxIndex = arena->index;
}
return arena->memory + aligned;
}