aboutsummaryrefslogtreecommitdiff
path: root/src/dynamic-array.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/dynamic-array.h')
-rw-r--r--src/dynamic-array.h51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/dynamic-array.h b/src/dynamic-array.h
new file mode 100644
index 0000000..58d4e64
--- /dev/null
+++ b/src/dynamic-array.h
@@ -0,0 +1,51 @@
1#ifndef INCLUDED_DYNAMIC_ARRAY_H
2#define INCLUDED_DYNAMIC_ARRAY_H
3
4#include <assert.h>
5#define ASSERT assert
6
7#define MALLOC malloc
8#define REALLOC realloc
9#define FREE free
10
11#ifndef DYNAMIC_ARRAY_INIT_CAP
12#define DYNAMIC_ARRAY_INIT_CAP 256
13#endif
14
15#define DYNAMIC_ARRAY_ENSURE_CAPACITY(DYNAMIC_ARRAY, COUNT) \
16 ({ \
17 if ((DYNAMIC_ARRAY).count + (COUNT) > (DYNAMIC_ARRAY).capacity) { \
18 if ((DYNAMIC_ARRAY).capacity == 0) \
19 (DYNAMIC_ARRAY).capacity = DYNAMIC_ARRAY_INIT_CAP; \
20 while ((DYNAMIC_ARRAY).count + (COUNT) > (DYNAMIC_ARRAY).capacity) \
21 (DYNAMIC_ARRAY).capacity *= 2; \
22 (DYNAMIC_ARRAY).items = REALLOC( \
23 (DYNAMIC_ARRAY).items, \
24 (DYNAMIC_ARRAY).capacity*sizeof (*(DYNAMIC_ARRAY).items)); \
25 ASSERT((DYNAMIC_ARRAY).items); \
26 } \
27 })
28
29#define DYNAMIC_ARRAY_APPEND(DYNAMIC_ARRAY, ITEM) \
30 ({ \
31 DYNAMIC_ARRAY_ENSURE_CAPACITY((DYNAMIC_ARRAY), 1); \
32 (DYNAMIC_ARRAY).items[(DYNAMIC_ARRAY).count++] = (ITEM); \
33 })
34
35#define DYNAMIC_ARRAY_APPEND_MANY(DYNAMIC_ARRAY, NEW_ITEMS, NEW_ITEMS_COUNT) \
36 ({ \
37 DYNAMIC_ARRAY_ENSURE_CAPACITY((DYNAMIC_ARRAY), (NEW_ITEMS_COUNT)); \
38 memcpy ((DYNAMIC_ARRAY).items + (DYNAMIC_ARRAY).count, (NEW_ITEMS), \
39 (NEW_ITEMS_COUNT)*sizeof (*(DYNAMIC_ARRAY).items)); \
40 (DYNAMIC_ARRAY).count += (NEW_ITEMS_COUNT); \
41 })
42
43#define DYNAMIC_ARRAY_RESET(DYNAMIC_ARRAY) ({ (DYNAMIC_ARRAY).count = 0; })
44
45#define DYNAMIC_ARRAY_FREE(DYNAMIC_ARRAY) FREE((DYNAMIC_ARRAY).items)
46
47#define DYNAMIC_ARRAY_FOREACH(ITEM, DYNAMIC_ARRAY) for ( \
48 typeof ((DYNAMIC_ARRAY).items) ITEM = (DYNAMIC_ARRAY).items; \
49 ITEM < (DYNAMIC_ARRAY).items + (DYNAMIC_ARRAY).count; ++ITEM)
50
51#endif