aboutsummaryrefslogtreecommitdiff
path: root/src/dynamic-array.h
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