#ifndef INCLUDED_DYNAMIC_ARRAY_H #define INCLUDED_DYNAMIC_ARRAY_H #include #define ASSERT assert #define MALLOC malloc #define REALLOC realloc #define FREE free #ifndef DYNAMIC_ARRAY_INIT_CAP #define DYNAMIC_ARRAY_INIT_CAP 256 #endif #define DYNAMIC_ARRAY_ENSURE_CAPACITY(DYNAMIC_ARRAY, COUNT) \ ({ \ if ((DYNAMIC_ARRAY).count + (COUNT) > (DYNAMIC_ARRAY).capacity) { \ if ((DYNAMIC_ARRAY).capacity == 0) \ (DYNAMIC_ARRAY).capacity = DYNAMIC_ARRAY_INIT_CAP; \ while ((DYNAMIC_ARRAY).count + (COUNT) > (DYNAMIC_ARRAY).capacity) \ (DYNAMIC_ARRAY).capacity *= 2; \ (DYNAMIC_ARRAY).items = REALLOC( \ (DYNAMIC_ARRAY).items, \ (DYNAMIC_ARRAY).capacity*sizeof (*(DYNAMIC_ARRAY).items)); \ ASSERT((DYNAMIC_ARRAY).items); \ } \ }) #define DYNAMIC_ARRAY_APPEND(DYNAMIC_ARRAY, ITEM) \ ({ \ DYNAMIC_ARRAY_ENSURE_CAPACITY((DYNAMIC_ARRAY), 1); \ (DYNAMIC_ARRAY).items[(DYNAMIC_ARRAY).count++] = (ITEM); \ }) #define DYNAMIC_ARRAY_APPEND_MANY(DYNAMIC_ARRAY, NEW_ITEMS, NEW_ITEMS_COUNT) \ ({ \ DYNAMIC_ARRAY_ENSURE_CAPACITY((DYNAMIC_ARRAY), (NEW_ITEMS_COUNT)); \ memcpy ((DYNAMIC_ARRAY).items + (DYNAMIC_ARRAY).count, (NEW_ITEMS), \ (NEW_ITEMS_COUNT)*sizeof (*(DYNAMIC_ARRAY).items)); \ (DYNAMIC_ARRAY).count += (NEW_ITEMS_COUNT); \ }) #define DYNAMIC_ARRAY_RESET(DYNAMIC_ARRAY) ({ (DYNAMIC_ARRAY).count = 0; }) #define DYNAMIC_ARRAY_FREE(DYNAMIC_ARRAY) FREE((DYNAMIC_ARRAY).items) #define DYNAMIC_ARRAY_FOREACH(ITEM, DYNAMIC_ARRAY) for ( \ typeof ((DYNAMIC_ARRAY).items) ITEM = (DYNAMIC_ARRAY).items; \ ITEM < (DYNAMIC_ARRAY).items + (DYNAMIC_ARRAY).count; ++ITEM) #endif