diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/cmmm/dynamic-array.h | 119 |
1 files changed, 119 insertions, 0 deletions
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 @@ | |||
| 1 | #ifndef INCLUDED__CMMM__DYNAMIC_ARRAY__H | ||
| 2 | #define INCLUDED__CMMM__DYNAMIC_ARRAY__H | ||
| 3 | |||
| 4 | // #define CMMM__DYNAMIC_ARRAY__STRIP_VENDOR | ||
| 5 | // #define CMMM__DYNAMIC_ARRAY__SHORT_NAMESPACE | ||
| 6 | |||
| 7 | #ifndef CMMM__DYNAMIC_ARRAY__REALLOC | ||
| 8 | void *realloc (void *__ptr, size_t __size); | ||
| 9 | #define CMMM__DYNAMIC_ARRAY__REALLOC realloc | ||
| 10 | #endif | ||
| 11 | |||
| 12 | #ifndef CMMM__DYNAMIC_ARRAY__ASSERT | ||
| 13 | #include <assert.h> | ||
| 14 | #define CMMM__DYNAMIC_ARRAY__ASSERT assert | ||
| 15 | #endif | ||
| 16 | |||
| 17 | #ifndef CMMM__DYNAMIC_ARRAY__INIT_CAP | ||
| 18 | #define CMMM__DYNAMIC_ARRAY__INIT_CAP 256 | ||
| 19 | #endif | ||
| 20 | |||
| 21 | #define CMMM__DYNAMIC_ARRAY__ENSURE_CAPACITY(DA, COUNT) \ | ||
| 22 | ({ \ | ||
| 23 | if ((DA).count + (COUNT) > (DA).capacity) { \ | ||
| 24 | if ((DA).capacity == 0) \ | ||
| 25 | (DA).capacity = CMMM__DYNAMIC_ARRAY__INIT_CAP; \ | ||
| 26 | while ((DA).count + (COUNT) > (DA).capacity) \ | ||
| 27 | (DA).capacity *= 2; \ | ||
| 28 | (DA).items = CMMM__DYNAMIC_ARRAY__REALLOC((DA).items, \ | ||
| 29 | (DA).capacity * \ | ||
| 30 | sizeof (*(DA).items)); \ | ||
| 31 | CMMM__DYNAMIC_ARRAY__ASSERT((DA).items); \ | ||
| 32 | } \ | ||
| 33 | }) | ||
| 34 | |||
| 35 | #define CMMM__DYNAMIC_ARRAY__SHRINK(DA) \ | ||
| 36 | ({ \ | ||
| 37 | (DA).capacity = (DA).count; \ | ||
| 38 | (DA).items = REALLOC((DA).items, \ | ||
| 39 | (DA).capacity * \ | ||
| 40 | sizeof (*(DA).items)); \ | ||
| 41 | CMMM__DYNAMIC_ARRAY__ASSERT((DA).items); \ | ||
| 42 | }) | ||
| 43 | |||
| 44 | #define CMMM__DYNAMIC_ARRAY__APPEND(DA, ITEM) \ | ||
| 45 | ({ \ | ||
| 46 | CMMM__DYNAMIC_ARRAY__ENSURE_CAPACITY((DA), 1); \ | ||
| 47 | (DA).items[(DA).count++] = (ITEM); \ | ||
| 48 | }) | ||
| 49 | |||
| 50 | #define CMMM__DYNAMIC_ARRAY__APPEND_MANY(DA, NEW_ITEMS, NEW_ITEMS_COUNT) \ | ||
| 51 | ({ \ | ||
| 52 | CMMM__DYNAMIC_ARRAY__ENSURE_CAPACITY((DA), (NEW_ITEMS_COUNT)); \ | ||
| 53 | memcpy ((DA).items + (DA).count, (NEW_ITEMS), \ | ||
| 54 | (NEW_ITEMS_COUNT)*sizeof (*(DA).items)); \ | ||
| 55 | (DA).count += (NEW_ITEMS_COUNT); \ | ||
| 56 | }) | ||
| 57 | |||
| 58 | #define CMMM__DYNAMIC_ARRAY__LAST(DA) \ | ||
| 59 | (DA).items[(DA).count - 1] | ||
| 60 | |||
| 61 | #define CMMM__DYNAMIC_ARRAY__RESET(DA) ({ (DA).count = 0; }) | ||
| 62 | |||
| 63 | #define CMMM__DYNAMIC_ARRAY__FREE(DA) \ | ||
| 64 | CMMM__DYANMIC_ARRAY__REALLOC((DA).items, 0) | ||
| 65 | |||
| 66 | #define CMMM__DYNAMIC_ARRAY__FOR_EACH(ITEM, DA) for ( \ | ||
| 67 | typeof ((DA).items) ITEM = (DA).items; \ | ||
| 68 | ITEM < (DA).items + (DA).count; ++ITEM) | ||
| 69 | |||
| 70 | #ifdef CMMM__STRING_VIEW__SHORT_NAMESPACE | ||
| 71 | #define CMMM__DA_STRIP_VENDOR CMMM__DYNAMIC_ARRAY__STRIP_VENDOR | ||
| 72 | #define CMMM__DA_SHORT_NAMESPACE CMMM__DYNAMIC_ARRAY__SHORT_NAMESPACE | ||
| 73 | #define CMMM__DA_REALLOC CMMM__DYNAMIC_ARRAY__REALLOC | ||
| 74 | #define CMMM__DA_ASSERT CMMM__DYNAMIC_ARRAY__ASSERT | ||
| 75 | #define CMMM__DA_INIT_CAP CMMM__DYNAMIC_ARRAY__INIT_CAP | ||
| 76 | #define CMMM__DA_ENSURE_CAPACITY CMMM__DYNAMIC_ARRAY__ENSURE_CAPACITY | ||
| 77 | #define CMMM__DA_SHRINK CMMM__DYNAMIC_ARRAY__SHRINK | ||
| 78 | #define CMMM__DA_APPEND CMMM__DYNAMIC_ARRAY__APPEND | ||
| 79 | #define CMMM__DA_APPEND_MANY CMMM__DYNAMIC_ARRAY__APPEND_MANY | ||
| 80 | #define CMMM__DA_LAST CMMM__DYNAMIC_ARRAY__LAST | ||
| 81 | #define CMMM__DA_RESET CMMM__DYNAMIC_ARRAY__RESET | ||
| 82 | #define CMMM__DA_FREE CMMM__DYNAMIC_ARRAY__FREE | ||
| 83 | #define CMMM__DA_FOR_EACH CMMM__DYNAMIC_ARRAY__FOR_EACH | ||
| 84 | #endif // CMMM__STRING_VIEW__SHORT_NAMESPACE | ||
| 85 | |||
| 86 | #ifdef CMMM__STRING_VIEW__STRIP_VENDOR | ||
| 87 | #define DYNAMIC_ARRAY__STRIP_VENDOR CMMM__DYNAMIC_ARRAY__STRIP_VENDOR | ||
| 88 | #define DYNAMIC_ARRAY__SHORT_NAMESPACE CMMM__DYNAMIC_ARRAY__SHORT_NAMESPACE | ||
| 89 | #define DYNAMIC_ARRAY__REALLOC CMMM__DYNAMIC_ARRAY__REALLOC | ||
| 90 | #define DYNAMIC_ARRAY__ASSERT CMMM__DYNAMIC_ARRAY__ASSERT | ||
| 91 | #define DYNAMIC_ARRAY__INIT_CAP CMMM__DYNAMIC_ARRAY__INIT_CAP | ||
| 92 | #define DYNAMIC_ARRAY__ENSURE_CAPACITY CMMM__DYNAMIC_ARRAY__ENSURE_CAPACITY | ||
| 93 | #define DYNAMIC_ARRAY__SHRINK CMMM__DYNAMIC_ARRAY__SHRINK | ||
| 94 | #define DYNAMIC_ARRAY__APPEND CMMM__DYNAMIC_ARRAY__APPEND | ||
| 95 | #define DYNAMIC_ARRAY__APPEND_MANY CMMM__DYNAMIC_ARRAY__APPEND_MANY | ||
| 96 | #define DYNAMIC_ARRAY__LAST CMMM__DYNAMIC_ARRAY__LAST | ||
| 97 | #define DYNAMIC_ARRAY__RESET CMMM__DYNAMIC_ARRAY__RESET | ||
| 98 | #define DYNAMIC_ARRAY__FREE CMMM__DYNAMIC_ARRAY__FREE | ||
| 99 | #define DYNAMIC_ARRAY__FOR_EACH CMMM__DYNAMIC_ARRAY__FOR_EACH | ||
| 100 | |||
| 101 | #ifdef CMMM__STRING_VIEW__SHORT_NAMESPACE | ||
| 102 | #define DA_STRIP_VENDOR CMMM__DYNAMIC_ARRAY__STRIP_VENDOR | ||
| 103 | #define DA_SHORT_NAMESPACE CMMM__DYNAMIC_ARRAY__SHORT_NAMESPACE | ||
| 104 | #define DA_REALLOC CMMM__DYNAMIC_ARRAY__REALLOC | ||
| 105 | #define DA_ASSERT CMMM__DYNAMIC_ARRAY__ASSERT | ||
| 106 | #define DA_INIT_CAP CMMM__DYNAMIC_ARRAY__INIT_CAP | ||
| 107 | #define DA_ENSURE_CAPACITY CMMM__DYNAMIC_ARRAY__ENSURE_CAPACITY | ||
| 108 | #define DA_SHRINK CMMM__DYNAMIC_ARRAY__SHRINK | ||
| 109 | #define DA_APPEND CMMM__DYNAMIC_ARRAY__APPEND | ||
| 110 | #define DA_APPEND_MANY CMMM__DYNAMIC_ARRAY__APPEND_MANY | ||
| 111 | #define DA_LAST CMMM__DYNAMIC_ARRAY__LAST | ||
| 112 | #define DA_RESET CMMM__DYNAMIC_ARRAY__RESET | ||
| 113 | #define DA_FREE CMMM__DYNAMIC_ARRAY__FREE | ||
| 114 | #define DA_FOR_EACH CMMM__DYNAMIC_ARRAY__FOR_EACH | ||
| 115 | #endif // CMMM__STRING_VIEW__SHORT_NAMESPACE | ||
| 116 | |||
| 117 | #endif // CMMM__STRING_VIEW__STRIP_VENDOR | ||
| 118 | |||
| 119 | #endif // INCLUDED__CMMM__DYNAMIC_ARRAY__H | ||
