// vector.h #ifndef VECTOR_H #define VECTOR_H #include #include #include #define vector_header(name, type) \ struct { \ size_t size; \ size_t cap; \ type *data; \ } name \ #define vector_init(vec) \ do { \ (vec).size = 0, \ (vec).cap = 0, \ (vec).data = NULL; \ } while(0) #define vector_push(vec, value) \ do { \ if (vec.size >= vec.cap) { \ int cap = vec.cap ? vec.cap * 2 : 8; \ void* data = realloc(vec.data, cap * sizeof(*vec.data)); \ if (!data) { \ fprintf(stderr, "vector_push: realloc failed\n"); \ exit(1); \ } \ (vec).cap = cap; \ (vec).data = data; \ } \ (vec).data[(vec).size++] = value; \ } while(0) #define vector_pop(vec) \ ((vec).data[--(vec).size]) #define vector_at(vec, idx) \ (((vec).data)[idx]) #define vector_idx(vec, ptr) \ ((ptr) - (vec).data) #define vector_free(vec) \ do { \ free((vec).data); \ (vec).data = NULL; \ (vec).size = (vec).cap = 0; \ } while(0) #endif