55 if (
arena ==
nullptr) {
88 while (current !=
nullptr) {
118 if (
arena ==
nullptr)
122 if (alignment == 0 || (alignment & (alignment - 1)) != 0) {
138 uintptr_t aligned_ptr = (current_ptr + (alignment - 1)) & ~(alignment - 1);
141 size_t padding = (size_t)(aligned_ptr - current_ptr);
144 size_t total_needed = size + padding;
148 void * ret = (
void *)aligned_ptr;
161 if (next_cap < size + alignment)
162 next_cap = size + alignment;
190 if (size > 0 && num > SIZE_MAX / size) {
196 size_t total_size = num * size;
199 memset(ptr, 0, total_size);
208 if (
arena ==
nullptr)
214 mark.
block = current;
224 if (
arena ==
nullptr || mark.
block ==
nullptr)
233 while (current !=
nullptr) {
235 current->
error =
false;
infix_arena_t * arena
Definition 005_layouts.c:62
#define c23_nodiscard
Internal alias for the public INFIX_NODISCARD macro.
Definition compat_c23.h:92
INFIX_API void infix_arena_rewind(infix_arena_t *arena, infix_arena_mark_t mark)
Rewinds an arena chain back to a previously captured mark, resetting all secondary blocks for immedia...
Definition arena.c:223
INFIX_API c23_nodiscard infix_arena_mark_t infix_arena_get_mark(infix_arena_t *arena)
Captures the current allocation state of an arena chain.
Definition arena.c:206
@ INFIX_CODE_INVALID_ALIGNMENT
Definition infix.h:1424
@ INFIX_CODE_INTEGER_OVERFLOW
Definition infix.h:1431
@ INFIX_CODE_OUT_OF_MEMORY
Definition infix.h:1421
@ INFIX_CATEGORY_ALLOCATION
Definition infix.h:1405
@ INFIX_CATEGORY_GENERAL
Definition infix.h:1404
size_t offset
Definition infix.h:1563
infix_arena_t * block
Definition infix.h:1562
INFIX_API c23_nodiscard void * infix_arena_alloc(infix_arena_t *arena, size_t size, size_t alignment)
Allocates a block of memory from an arena.
Definition arena.c:117
#define infix_calloc(nelem, size)
A macro that can be defined to override infix's allocator at compile time.
Definition infix.h:427
#define infix_free(ptr)
A macro that can be defined to override infix's allocator at compile time.
Definition infix.h:435
INFIX_API c23_nodiscard infix_arena_t * infix_arena_create(size_t initial_size)
Creates a new memory arena.
Definition arena.c:52
INFIX_API c23_nodiscard void * infix_arena_calloc(infix_arena_t *arena, size_t num, size_t size, size_t alignment)
Allocates and zero-initializes a block of memory from an arena.
Definition arena.c:188
INFIX_API void infix_arena_destroy(infix_arena_t *arena)
Destroys an arena and frees all memory allocated from it.
Definition arena.c:83
#define INFIX_API
Symbol visibility macro.
Definition infix.h:114
Internal data structures, function prototypes, and constants.
INFIX_INTERNAL void _infix_set_error(infix_error_category_t category, infix_error_code_t code, size_t position)
Sets the thread-local error state with detailed information.
Definition error.c:175
Internal definition of a memory arena.
Definition infix_internals.h:143
char * buffer
Definition infix_internals.h:144
bool error
Definition infix_internals.h:147
size_t capacity
Definition infix_internals.h:145
size_t block_size
Definition infix_internals.h:149
size_t current_offset
Definition infix_internals.h:146
struct infix_arena_t * next_block
Definition infix_internals.h:148