#ifndef DYNARR_H #define DYNARR_H #include #include #include typedef struct { size_t count, capacity; } DynArrHeader; #define DYNARR(type) type * #define DA_HEADER(da) ((DynArrHeader*)(da) - 1) #define DA_INIT_CAP 16 #define DA_INIT(da) {\ char *da_init_ptr = ((char*)malloc(sizeof(DynArrHeader) + DA_INIT_CAP * sizeof(*da)));\ if (!da_init_ptr) err(1, "dynamic array allocation failed");\ da = (void *)(da_init_ptr + sizeof(DynArrHeader));\ *DA_HEADER(da) = (DynArrHeader) { 0, DA_INIT_CAP };\ } #define DA_FREE(da)\ free(DA_HEADER(da)) #define DA_LEN(da) (DA_HEADER(da)->count) #define DA_FIT(da, count)\ if (count >= DA_HEADER(da)->capacity) {\ while (count >= DA_HEADER(da)->capacity) DA_HEADER(da)->capacity <<= 1;\ char *da_fit_ptr = realloc(DA_HEADER(da), sizeof(DynArrHeader) + DA_HEADER(da)->capacity * sizeof(*da));\ if (!da_fit_ptr) err(1, "dynamic array reallocation failed");\ (da) = (void *)(da_fit_ptr + sizeof(DynArrHeader));\ } #define DA_PUSH(da, item) {\ DA_FIT(da, DA_LEN(da) + 1);\ (da)[DA_HEADER(da)->count++] = item;\ } #define DA_FOR(da, type, name)\ for (type *name = (da); name < &(da)[DA_LEN(da)]; name++) #define DA_FORVAL(da, type, name)\ for (volatile type *da_iter = (da), name; da_iter < &(da)[DA_LEN(da)] && (name = *da_iter, 1); da_iter++) #endif