#ifndef VEC_H #define VEC_H #include #include #define DEFINE_VEC(TYPENAME, FN_PREFIX, TYPE) \ \ typedef struct { \ TYPE* data; \ size_t size; \ size_t capacity; \ } TYPENAME; \ \ [[maybe_unused]] static void FN_PREFIX##_construct(TYPENAME* vec) \ { \ *vec = (TYPENAME) {}; \ } \ \ [[maybe_unused]] static void FN_PREFIX##_destroy(TYPENAME* vec) \ { \ if (vec->data) { \ free(vec->data); \ } \ } \ \ [[maybe_unused]] static void FN_PREFIX##_push(TYPENAME* vec, TYPE value) \ { \ if (!vec->data || vec->capacity == 0) { \ vec->capacity = 4; \ vec->data = malloc(sizeof(TYPE) * vec->capacity); \ } else if (vec->size + 1 >= vec->capacity) { \ vec->capacity *= 2; \ vec->data = realloc(vec->data, sizeof(TYPE) * vec->capacity); \ } \ vec->data[vec->size] = value; \ vec->size += 1; \ } #endif