16#ifndef PS_DYNARR_INITIAL_CAP
17 #define PS_DYNARR_INITIAL_CAP 4
20#ifndef PS_DYNARR_GROWTH_FACTOR
21 #define PS_DYNARR_GROWTH_FACTOR 2
24#define _ps_dynarr_ptr(arr) ((char*)arr + sizeof((arr)->header))
25#define _ps_dynarr_size(arr, cap) \
26 sizeof(*arr) + (cap) * sizeof(*(arr)->contents)
35#define ps_dynarr_new(T) \
37 T* arr = malloc(_ps_dynarr_size(arr, PS_DYNARR_INITIAL_CAP)); \
38 if (!arr) PS_NO_MEMORY(); \
41 arr->capacity = PS_DYNARR_INITIAL_CAP; \
46#define ps_push(__arrptr, __new_elem) \
48 __arrptr, $(__elem) in { *(__elem) = (__new_elem); })
50#define ps_add(__arrptr, __capture) \
52 auto_t __arr = *(__arrptr); \
53 if (__arr->length + 1 > __arr->capacity) { \
54 __arr->capacity *= PS_DYNARR_GROWTH_FACTOR; \
55 __arr = realloc(__arr, _ps_dynarr_size(__arr, __arr->capacity)); \
58 $run(__capture, &__arr->contents[__arr->length++]); \
62 *(__arrptr) = __arr; \
65#define ps_dynarr_free(__arr) free(__arr)
67#define $arr(__arr) ((__arr)->contents)
69#define $for(__arr, __capture) \
71 for (usize i = 0; i < (__arr)->length; i++) { \
72 $run(__capture, ($arr(__arr)[i])); \
Defines assertion and abortion functionality.
Syntactic sugar for capture blocks.