#ifndef DA_H #define DA_H #include #define DA_DEF_STRUCT(type, name) \ struct name { \ type *items; \ size_t size; \ size_t cap; \ } #define DA_DEF_STRUCT_ITEM(type, name) \ struct { \ type *items; \ size_t size; \ size_t cap; \ } name #define DA_CREATE(da, item_size) \ do { \ da.cap = 16; \ da.size = 0; \ da.items = calloc(da.cap, item_size); \ } while(0) #define DA_DESTROY(da) \ do { \ free(da.items); \ } while(0) #define DA_CLEAR(da) \ do { \ da.size = 0; \ } while(0) #define DA_DELETE(da, index) \ do { \ if ( index > da.size ) { \ break; \ } \ for ( size_t i = index; i < da.size - 1; ++i ) { \ da.items[i] = da.items[i+1]; \ } \ --da.size; \ } while(0) #define DA_APPEND(da, item) \ do { \ if ( da.size == da.cap ) { \ da.cap *= 2; \ da.items = realloc(da.items, da.cap * sizeof(*da.items)); \ } \ da.items[da.size++] = item; \ } while(0) #endif