|
6 | 6 | #define MAX(a, b) ((a) > (b) ? (a) : (b)) |
7 | 7 |
|
8 | 8 | #define VEC_RESIZE(vec, _cap) \ |
9 | | - void *tmp = realloc((vec).data, (_cap) * sizeof((vec).data[0])); \ |
10 | | - assert(tmp != NULL); \ |
11 | | - (vec).data = tmp; \ |
12 | | - (vec).cap = (_cap); |
| 9 | + do { \ |
| 10 | + void *tmp = realloc((vec).data, (_cap) * sizeof((vec).data[0])); \ |
| 11 | + assert(tmp != NULL); \ |
| 12 | + (vec).data = tmp; \ |
| 13 | + (vec).cap = (_cap); \ |
| 14 | + } while (0) |
13 | 15 |
|
14 | 16 | #define VEC_GROW(vec, _cap) \ |
15 | 17 | if ((vec).cap < (_cap)) { \ |
16 | 18 | VEC_RESIZE((vec), (_cap)); \ |
17 | 19 | } |
18 | 20 |
|
19 | 21 | #define VEC_PUSH(vec, el) \ |
20 | | - if ((vec).cap == (vec).len) { \ |
21 | | - VEC_RESIZE((vec), MAX(16, (vec).len * 2)); \ |
22 | | - } \ |
23 | | - (vec).data[(vec).len++] = (el); |
| 22 | + do { \ |
| 23 | + if ((vec).cap == (vec).len) { \ |
| 24 | + VEC_RESIZE((vec), MAX(16, (vec).len * 2)); \ |
| 25 | + } \ |
| 26 | + (vec).data[(vec).len++] = (el); \ |
| 27 | + } while (0) |
24 | 28 |
|
25 | 29 | #define VEC_POP(vec) (vec).len--; |
26 | 30 |
|
|
39 | 43 |
|
40 | 44 | #define QUEUE_RESIZE(queue, _cap) \ |
41 | 45 | do { \ |
42 | | - void *tmp = realloc((queue).data, (_cap) * sizeof((queue).data[0])); \ |
| 46 | + void *tmp = calloc((_cap), sizeof((queue).data[0])); \ |
43 | 47 | assert(tmp != NULL); \ |
| 48 | + uint32_t count = (queue).tail - (queue).head; \ |
| 49 | + for (uint32_t i = 0; i < count; i++) { \ |
| 50 | + ((uint16_t *)tmp)[i] = (queue).data[((queue).head + i) % (queue).cap]; \ |
| 51 | + } \ |
| 52 | + if ((queue).data != NULL) \ |
| 53 | + free((queue).data); \ |
44 | 54 | (queue).data = tmp; \ |
| 55 | + (queue).head = 0; \ |
| 56 | + (queue).tail = count; \ |
45 | 57 | (queue).cap = (_cap); \ |
46 | 58 | } while (0) |
47 | 59 |
|
|
0 commit comments