// vector.h #ifndef __SMCC_DS_VECTOR_H__ #define __SMCC_DS_VECTOR_H__ #include #define vector_header(name, type) \ struct { \ rt_size_t size; \ rt_size_t cap; \ type *data; \ } name \ #define vector_init(vec) \ do { \ (vec).size = 0, \ (vec).cap = 0, \ (vec).data = 0; \ } while(0) #define vector_push(vec, value) \ do { \ if (vec.size >= vec.cap) { \ int cap = vec.cap ? vec.cap * 2 : 8; \ void* data = salloc_realloc(vec.data, cap * sizeof(*vec.data)); \ if (!data) { \ LOG_FATAL("vector_push: rt_realloc failed\n"); \ } \ (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 { \ salloc_free((vec).data); \ (vec).data = NULL; \ (vec).size = (vec).cap = 0; \ } while(0) #endif