// common.h #ifndef _ZIG0_COMMON_H__ #define _ZIG0_COMMON_H__ #include #include #define SLICE(Type) \ struct Type##Slice { \ uint32_t len; \ uint32_t cap; \ Type* arr; \ } #define ARR_INIT(Type, initial_cap) ({ \ Type* arr = calloc(initial_cap, sizeof(Type)); \ if (!arr) \ exit(1); \ arr; \ }) #define SLICE_INIT(Type, initial_cap) \ { \ .len = 0, \ .cap = (initial_cap), \ .arr = ARR_INIT(Type, initial_cap) \ } #define SLICE_RESIZE(Type, slice, new_cap) ({ \ const uint32_t cap = (new_cap); \ Type* new_arr = realloc((slice)->arr, cap * sizeof(Type)); \ if (new_arr == NULL) { \ free((slice)->arr); \ exit(1); \ } \ (slice)->arr = new_arr; \ (slice)->cap = cap; \ }) #define SLICE_ENSURE_CAPACITY(Type, slice, additional) ({ \ if ((slice)->len + (additional) > (slice)->cap) { \ SLICE_RESIZE(Type, \ slice, \ ((slice)->cap * 2 > (slice)->len + (additional)) ? (slice)->cap * 2 : (slice)->len + (additional)); \ } \ }) #define SLICE_APPEND(Type, slice, item) ({ \ SLICE_ENSURE_CAPACITY(Type, slice, 1); \ (slice)->arr[(slice)->len++] = (item); \ }) #endif