-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathvec.h
More file actions
79 lines (75 loc) · 5.65 KB
/
vec.h
File metadata and controls
79 lines (75 loc) · 5.65 KB
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
69
70
71
72
73
74
75
76
77
78
79
#pragma once
#include <stdio.h>
#include <stdlib.h>
#define vec_for(vec_name, var) for (int var = 0; var < vec_name->len; ++var)
#define vec_decl(name, T) \
struct name##_vec { \
int capacity; \
int len; \
T *data; \
}; \
struct name##_vec *name##_vec_new(int capacity); \
void name##_vec_free(struct name##_vec *v); \
void name##_vec_push(struct name##_vec *v, T n); \
T name##_vec_get(struct name##_vec *v, int i); \
T name##_vec_get_unsafe(struct name##_vec *v, int i); \
void name##_vec_reset(struct name##_vec *v); \
void name##_vec_remove_at(struct name##_vec *v, int i);
#define vec_def(name, T) \
struct name##_vec *name##_vec_new(int capacity) { \
struct name##_vec *v = \
(struct name##_vec *)malloc(sizeof(struct name##_vec)); \
v->capacity = capacity; \
v->len = 0; \
v->data = (T *)malloc(capacity * sizeof(T)); \
return v; \
} \
\
void name##_vec_free(struct name##_vec *v) { \
if (v == NULL) \
return; \
free(v->data); \
free(v); \
} \
\
void name##_vec_push(struct name##_vec *v, T n) { \
if (v->len >= v->capacity) { \
v->capacity += 8; \
T *grow = (T *)realloc(v->data, v->capacity * sizeof(T)); \
if (grow == NULL) { \
free(v->data); \
fprintf(stderr, "Capacity growing failed\n"); \
exit(EXIT_FAILURE); \
} \
v->data = grow; \
} \
\
v->data[v->len++] = n; \
} \
\
T name##_vec_get(struct name##_vec *v, int i) { \
if (i < 0 || v->len <= i) { \
fprintf(stderr, "Attempt to index name##_vec out of bounds: %d\n", i); \
exit(EXIT_FAILURE); \
} \
\
return v->data[i]; \
} \
T name##_vec_get_unsafe(struct name##_vec *v, int i) { return v->data[i]; } \
\
void name##_vec_reset(struct name##_vec *v) { \
v->capacity = 0; \
v->len = 0; \
} \
\
void name##_vec_remove_at(struct name##_vec *v, int i) { \
if (i < 0 || v->len <= i) { \
fprintf(stderr, "Attempt to index name##_vec out of bounds: %d\n", i); \
exit(EXIT_FAILURE); \
} \
\
--v->len; \
for (; i < v->len; ++i) { \
v->data[i] = v->data[i + 1]; \
} \
}