summaryrefslogtreecommitdiff
path: root/include/cmmm
diff options
context:
space:
mode:
Diffstat (limited to 'include/cmmm')
-rw-r--r--include/cmmm/dynamic-array.h119
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
8void *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