common.h (2994B) - Raw
1 // common.h — must be included before any system headers. 2 #ifndef _ZIG0_COMMON_H__ 3 #define _ZIG0_COMMON_H__ 4 5 #include <stdint.h> 6 #include <stdlib.h> 7 8 #define SLICE(Type) \ 9 struct Type##Slice { \ 10 uint32_t len; \ 11 uint32_t cap; \ 12 Type* arr; \ 13 } 14 15 #define ARR_INIT(Type, initial_cap) \ 16 ({ \ 17 Type* arr = calloc(initial_cap, sizeof(Type)); \ 18 if (!arr) \ 19 exit(1); \ 20 arr; \ 21 }) 22 23 #define SLICE_INIT(Type, initial_cap) \ 24 { .len = 0, .cap = (initial_cap), .arr = ARR_INIT(Type, initial_cap) } 25 26 #define SLICE_RESIZE(Type, slice, new_cap) \ 27 ({ \ 28 const uint32_t cap = (new_cap); \ 29 Type* new_arr = realloc((slice)->arr, cap * sizeof(Type)); \ 30 if (new_arr == NULL) { \ 31 free((slice)->arr); \ 32 exit(1); \ 33 } \ 34 (slice)->arr = new_arr; \ 35 (slice)->cap = cap; \ 36 }) 37 38 #define SLICE_ENSURE_CAPACITY(Type, slice, additional) \ 39 ({ \ 40 if ((slice)->len + (additional) > (slice)->cap) { \ 41 SLICE_RESIZE(Type, slice, \ 42 ((slice)->cap * 2 > (slice)->len + (additional)) \ 43 ? (slice)->cap * 2 \ 44 : (slice)->len + (additional)); \ 45 } \ 46 }) 47 48 #define SLICE_APPEND(Type, slice, item) \ 49 ({ \ 50 SLICE_ENSURE_CAPACITY(Type, slice, 1); \ 51 (slice)->arr[(slice)->len++] = (item); \ 52 }) 53 54 #endif