#ifndef INCLUDED__CMMM__DYNAMIC_ARRAY__H #define INCLUDED__CMMM__DYNAMIC_ARRAY__H // #define CMMM__DYNAMIC_ARRAY__STRIP_VENDOR // #define CMMM__DYNAMIC_ARRAY__SHORT_NAMESPACE #ifndef CMMM__DYNAMIC_ARRAY__REALLOC void *realloc (void *__ptr, size_t __size); #define CMMM__DYNAMIC_ARRAY__REALLOC realloc #endif #ifndef CMMM__DYNAMIC_ARRAY__ASSERT #include #define CMMM__DYNAMIC_ARRAY__ASSERT assert #endif #ifndef CMMM__DYNAMIC_ARRAY__INIT_CAP #define CMMM__DYNAMIC_ARRAY__INIT_CAP 256 #endif #define CMMM__DYNAMIC_ARRAY__ENSURE_CAPACITY(DA, COUNT) \ ({ \ if ((DA).count + (COUNT) > (DA).capacity) { \ if ((DA).capacity == 0) \ (DA).capacity = CMMM__DYNAMIC_ARRAY__INIT_CAP; \ while ((DA).count + (COUNT) > (DA).capacity) \ (DA).capacity *= 2; \ (DA).items = CMMM__DYNAMIC_ARRAY__REALLOC((DA).items, \ (DA).capacity * \ sizeof (*(DA).items)); \ CMMM__DYNAMIC_ARRAY__ASSERT((DA).items); \ } \ }) #define CMMM__DYNAMIC_ARRAY__SHRINK(DA) \ ({ \ (DA).capacity = (DA).count; \ (DA).items = REALLOC((DA).items, \ (DA).capacity * \ sizeof (*(DA).items)); \ CMMM__DYNAMIC_ARRAY__ASSERT((DA).items); \ }) #define CMMM__DYNAMIC_ARRAY__APPEND(DA, ITEM) \ ({ \ CMMM__DYNAMIC_ARRAY__ENSURE_CAPACITY((DA), 1); \ (DA).items[(DA).count++] = (ITEM); \ }) #define CMMM__DYNAMIC_ARRAY__APPEND_MANY(DA, NEW_ITEMS, NEW_ITEMS_COUNT) \ ({ \ CMMM__DYNAMIC_ARRAY__ENSURE_CAPACITY((DA), (NEW_ITEMS_COUNT)); \ memcpy ((DA).items + (DA).count, (NEW_ITEMS), \ (NEW_ITEMS_COUNT)*sizeof (*(DA).items)); \ (DA).count += (NEW_ITEMS_COUNT); \ }) #define CMMM__DYNAMIC_ARRAY__LAST(DA) \ (DA).items[(DA).count - 1] #define CMMM__DYNAMIC_ARRAY__RESET(DA) ({ (DA).count = 0; }) #define CMMM__DYNAMIC_ARRAY__FREE(DA) \ CMMM__DYANMIC_ARRAY__REALLOC((DA).items, 0) #define CMMM__DYNAMIC_ARRAY__FOR_EACH(ITEM, DA) for ( \ typeof ((DA).items) ITEM = (DA).items; \ ITEM < (DA).items + (DA).count; ++ITEM) #ifdef CMMM__STRING_VIEW__SHORT_NAMESPACE #define CMMM__DA_STRIP_VENDOR CMMM__DYNAMIC_ARRAY__STRIP_VENDOR #define CMMM__DA_SHORT_NAMESPACE CMMM__DYNAMIC_ARRAY__SHORT_NAMESPACE #define CMMM__DA_REALLOC CMMM__DYNAMIC_ARRAY__REALLOC #define CMMM__DA_ASSERT CMMM__DYNAMIC_ARRAY__ASSERT #define CMMM__DA_INIT_CAP CMMM__DYNAMIC_ARRAY__INIT_CAP #define CMMM__DA_ENSURE_CAPACITY CMMM__DYNAMIC_ARRAY__ENSURE_CAPACITY #define CMMM__DA_SHRINK CMMM__DYNAMIC_ARRAY__SHRINK #define CMMM__DA_APPEND CMMM__DYNAMIC_ARRAY__APPEND #define CMMM__DA_APPEND_MANY CMMM__DYNAMIC_ARRAY__APPEND_MANY #define CMMM__DA_LAST CMMM__DYNAMIC_ARRAY__LAST #define CMMM__DA_RESET CMMM__DYNAMIC_ARRAY__RESET #define CMMM__DA_FREE CMMM__DYNAMIC_ARRAY__FREE #define CMMM__DA_FOR_EACH CMMM__DYNAMIC_ARRAY__FOR_EACH #endif // CMMM__STRING_VIEW__SHORT_NAMESPACE #ifdef CMMM__STRING_VIEW__STRIP_VENDOR #define DYNAMIC_ARRAY__STRIP_VENDOR CMMM__DYNAMIC_ARRAY__STRIP_VENDOR #define DYNAMIC_ARRAY__SHORT_NAMESPACE CMMM__DYNAMIC_ARRAY__SHORT_NAMESPACE #define DYNAMIC_ARRAY__REALLOC CMMM__DYNAMIC_ARRAY__REALLOC #define DYNAMIC_ARRAY__ASSERT CMMM__DYNAMIC_ARRAY__ASSERT #define DYNAMIC_ARRAY__INIT_CAP CMMM__DYNAMIC_ARRAY__INIT_CAP #define DYNAMIC_ARRAY__ENSURE_CAPACITY CMMM__DYNAMIC_ARRAY__ENSURE_CAPACITY #define DYNAMIC_ARRAY__SHRINK CMMM__DYNAMIC_ARRAY__SHRINK #define DYNAMIC_ARRAY__APPEND CMMM__DYNAMIC_ARRAY__APPEND #define DYNAMIC_ARRAY__APPEND_MANY CMMM__DYNAMIC_ARRAY__APPEND_MANY #define DYNAMIC_ARRAY__LAST CMMM__DYNAMIC_ARRAY__LAST #define DYNAMIC_ARRAY__RESET CMMM__DYNAMIC_ARRAY__RESET #define DYNAMIC_ARRAY__FREE CMMM__DYNAMIC_ARRAY__FREE #define DYNAMIC_ARRAY__FOR_EACH CMMM__DYNAMIC_ARRAY__FOR_EACH #ifdef CMMM__STRING_VIEW__SHORT_NAMESPACE #define DA_STRIP_VENDOR CMMM__DYNAMIC_ARRAY__STRIP_VENDOR #define DA_SHORT_NAMESPACE CMMM__DYNAMIC_ARRAY__SHORT_NAMESPACE #define DA_REALLOC CMMM__DYNAMIC_ARRAY__REALLOC #define DA_ASSERT CMMM__DYNAMIC_ARRAY__ASSERT #define DA_INIT_CAP CMMM__DYNAMIC_ARRAY__INIT_CAP #define DA_ENSURE_CAPACITY CMMM__DYNAMIC_ARRAY__ENSURE_CAPACITY #define DA_SHRINK CMMM__DYNAMIC_ARRAY__SHRINK #define DA_APPEND CMMM__DYNAMIC_ARRAY__APPEND #define DA_APPEND_MANY CMMM__DYNAMIC_ARRAY__APPEND_MANY #define DA_LAST CMMM__DYNAMIC_ARRAY__LAST #define DA_RESET CMMM__DYNAMIC_ARRAY__RESET #define DA_FREE CMMM__DYNAMIC_ARRAY__FREE #define DA_FOR_EACH CMMM__DYNAMIC_ARRAY__FOR_EACH #endif // CMMM__STRING_VIEW__SHORT_NAMESPACE #endif // CMMM__STRING_VIEW__STRIP_VENDOR #endif // INCLUDED__CMMM__DYNAMIC_ARRAY__H