From f6e9aa1f489f2aa052e2caa5748f8d081346b8b1 Mon Sep 17 00:00:00 2001 From: Martin Michalec Date: Sun, 22 Feb 2026 02:45:25 +0300 Subject: add implementation --- include/cmmm/dynamic-array.h | 119 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 include/cmmm/dynamic-array.h (limited to 'include/cmmm') diff --git a/include/cmmm/dynamic-array.h b/include/cmmm/dynamic-array.h new file mode 100644 index 0000000..afd7d0a --- /dev/null +++ b/include/cmmm/dynamic-array.h @@ -0,0 +1,119 @@ +#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 -- cgit v1.3