forked from cunha/dstructs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
dvec.h
68 lines (55 loc) · 1.72 KB
/
dvec.h
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#pragma once
#include <assert.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include "log.h"
/**
* A dynamically allocated vector data structure.
*
* dvec_struct(int) vec;
* dvec_init(vec, 16);
* dvec_append(vec, 1);
* for(int i = 0; i < vec.sz; i++) {
* printf("vec.data[%d] = %d\n", i, vec.data[i]);
* }
* dvec_freedata(vec);
**/
#define dvec_declare(name, type) struct name { size_t sz; size_t max; type *data; }
dvec_declare(i32vec, int32_t);
dvec_declare(u32vec, uint32_t);
#define dvec_struct(type) struct { size_t sz; size_t max; type *data; }
#define dvec_init(_v1) { \
(_v1).sz = 0; \
(_v1).max = 2; \
(_v1).data = malloc((_v1).max * sizeof((_v1).data[0])); \
if(!(_v1).data) logea(__FILE__, __LINE__, NULL); \
}
#define dvec_append(_v1, _value) { \
dvec_reserve(_v1, 1); \
(_v1).data[(_v1).sz] = _value; \
(_v1).sz++; \
}
#define dvec_insert(_v1, _value, _idx) { \
dvec_reserve(_v1, 1); \
(_v1).sz++; \
memmove((_v1).data + (_idx) + 1, (_v1).data + (_idx), \
((_v1).sz - (_idx) - 1)*sizeof((_v1).data[0])); \
(_v1).data[_idx] = _value; \
}
#define dvec_delete(_v1, _idx) { \
(_v1).sz--; \
memmove((_v1).data + (_idx), (_v1).data + (_idx) + 1, \
((_v1).sz - (_idx))*sizeof((_v1).data[0])); \
}
#define dvec_reserve(_v1, _space) \
if((_v1).sz + (_space) >= (_v1).max) { \
while((_v1).sz + (_space) >= ((_v1).max)) (_v1).max <<= 1; \
(_v1).data = realloc((_v1).data, \
(_v1).max * sizeof((_v1).data[0])); \
if(!(_v1).data) logea(__FILE__, __LINE__, NULL); \
} \
#define dvec_memcmp(_v1, _v2) ((_v1).sz != ((_v2).sz) ? \
((_v1).sz > (_v2).sz) - ((_v1).sz < (_v2).sz) : \
memcmp((_v1).data, (_v2).data, (_v1).sz * sizeof((_v1).data[0])))
#define dvec_freedata(_v1) free((_v1).data)