blob: 58d4e64705a7165d6a984e2c506e72a6a7ff0f2b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
#ifndef INCLUDED_DYNAMIC_ARRAY_H
#define INCLUDED_DYNAMIC_ARRAY_H
#include <assert.h>
#define ASSERT assert
#define MALLOC malloc
#define REALLOC realloc
#define FREE free
#ifndef DYNAMIC_ARRAY_INIT_CAP
#define DYNAMIC_ARRAY_INIT_CAP 256
#endif
#define DYNAMIC_ARRAY_ENSURE_CAPACITY(DYNAMIC_ARRAY, COUNT) \
({ \
if ((DYNAMIC_ARRAY).count + (COUNT) > (DYNAMIC_ARRAY).capacity) { \
if ((DYNAMIC_ARRAY).capacity == 0) \
(DYNAMIC_ARRAY).capacity = DYNAMIC_ARRAY_INIT_CAP; \
while ((DYNAMIC_ARRAY).count + (COUNT) > (DYNAMIC_ARRAY).capacity) \
(DYNAMIC_ARRAY).capacity *= 2; \
(DYNAMIC_ARRAY).items = REALLOC( \
(DYNAMIC_ARRAY).items, \
(DYNAMIC_ARRAY).capacity*sizeof (*(DYNAMIC_ARRAY).items)); \
ASSERT((DYNAMIC_ARRAY).items); \
} \
})
#define DYNAMIC_ARRAY_APPEND(DYNAMIC_ARRAY, ITEM) \
({ \
DYNAMIC_ARRAY_ENSURE_CAPACITY((DYNAMIC_ARRAY), 1); \
(DYNAMIC_ARRAY).items[(DYNAMIC_ARRAY).count++] = (ITEM); \
})
#define DYNAMIC_ARRAY_APPEND_MANY(DYNAMIC_ARRAY, NEW_ITEMS, NEW_ITEMS_COUNT) \
({ \
DYNAMIC_ARRAY_ENSURE_CAPACITY((DYNAMIC_ARRAY), (NEW_ITEMS_COUNT)); \
memcpy ((DYNAMIC_ARRAY).items + (DYNAMIC_ARRAY).count, (NEW_ITEMS), \
(NEW_ITEMS_COUNT)*sizeof (*(DYNAMIC_ARRAY).items)); \
(DYNAMIC_ARRAY).count += (NEW_ITEMS_COUNT); \
})
#define DYNAMIC_ARRAY_RESET(DYNAMIC_ARRAY) ({ (DYNAMIC_ARRAY).count = 0; })
#define DYNAMIC_ARRAY_FREE(DYNAMIC_ARRAY) FREE((DYNAMIC_ARRAY).items)
#define DYNAMIC_ARRAY_FOREACH(ITEM, DYNAMIC_ARRAY) for ( \
typeof ((DYNAMIC_ARRAY).items) ITEM = (DYNAMIC_ARRAY).items; \
ITEM < (DYNAMIC_ARRAY).items + (DYNAMIC_ARRAY).count; ++ITEM)
#endif
|