// common.h #ifndef _ZIG1_COMMON_H__ #define _ZIG1_COMMON_H__ #include #include #define SLICE_INIT(Type, initial_cap) ({ \ Type* arr = calloc(initial_cap, sizeof(Type)); \ if (!arr) \ exit(1); \ (__typeof__(Type*)) { arr }; \ }) #define SLICE_RESIZE(slice, Type, new_cap) ({ \ uint32_t cap = (new_cap); \ Type* new_arr = realloc((slice)->arr, cap * sizeof(Type)); \ if (!new_arr) \ exit(1); \ (slice)->arr = new_arr; \ (slice)->cap = cap; \ }) #define SLICE_ENSURE_CAPACITY(slice, Type, additional) ({ \ if ((slice)->len + (additional) > (slice)->cap) { \ SLICE_RESIZE(slice, Type, ((slice)->cap * 2 > (slice)->len + (additional)) ? (slice)->cap * 2 : (slice)->len + (additional)); \ } \ }) #endif