-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcvec.h
More file actions
85 lines (63 loc) · 2.72 KB
/
cvec.h
File metadata and controls
85 lines (63 loc) · 2.72 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
80
81
82
83
84
85
#ifndef CVEC_HDR
#define CVEC_HDR
#include <SDL.h>
typedef struct {
size_t allocated;
size_t used;
} vec_t;
/* Attempts to grow [VECTOR] by [MORE]*/
#define vec_try_grow(VECTOR, MORE) \
(((!(VECTOR) || vec_meta(VECTOR)->used + (MORE) >= vec_meta(VECTOR)->allocated)) ? \
(void)vec_grow(((void **)&(VECTOR)), (MORE), sizeof(*(VECTOR))) : (void)0)
/* Get the metadata block for [VECTOR] */
#define vec_meta(VECTOR) \
((vec_t *)(((unsigned char *)(VECTOR)) - sizeof(vec_t)))
/* Deletes [VECTOR] and sets it to NULL */
#define vec_free(VECTOR) \
((void)((VECTOR) ? (vec_delete((void *)(VECTOR)), (VECTOR) = NULL) : 0))
/* Pushes back [VALUE] into [VECTOR] */
#define vec_push(VECTOR, VALUE) \
(vec_try_grow((VECTOR), 1), (VECTOR)[vec_meta(VECTOR)->used++] = (VALUE))
/* returns a reference to a new element at the end of [VECTOR] */
#define vec_new(VECTOR) \
(vec_try_grow((VECTOR), 1), (VECTOR)+(vec_meta(VECTOR)->used++) )
/* Get the size of [VECTOR] */
#define vec_size(VECTOR) \
((VECTOR) ? vec_meta(VECTOR)->used : 0)
/* Get the capacity of [VECTOR] */
#define vec_capacity(VECTOR) \
((VECTOR) ? vec_meta(VECTOR)->allocated : 0)
/* Resize [VECTOR] to accomodate [SIZE] more elements */
#define vec_resize(VECTOR, SIZE) \
(vec_try_grow((VECTOR), (SIZE)), \
vec_meta(VECTOR)->used += (SIZE), \
&(VECTOR)[vec_meta(VECTOR)->used - (SIZE)])
/* Get the last element in [VECTOR] */
#define vec_last(VECTOR) \
((VECTOR)[vec_meta(VECTOR)->used - 1])
/* Pop an element off the back of [VECTOR] */
#define vec_pop(VECTOR) \
((void)(vec_meta(VECTOR)->used -= 1))
/* Shrink the size of [VECTOR] down to [SIZE] */
#define vec_shrinkto(VECTOR, SIZE) \
((void)(vec_meta(VECTOR)->used = (SIZE)))
/* Shrink [VECTOR] down by [AMOUNT] */
#define vec_shrinkby(VECTOR, AMOUNT) \
((void)(vec_meta(VECTOR)->used -= (AMOUNT)))
/* Append to [VECTOR], [COUNT] elements from [POINTER] */
#define vec_append(VECTOR, COUNT, POINTER) \
((void)(SDL_memcpy(vec_resize((VECTOR), (COUNT)), (POINTER), (COUNT) * sizeof(*(POINTER)))))
/* Remove from [VECTOR], [COUNT] elements starting from [INDEX] */
#define vec_remove(VECTOR, INDEX, COUNT) \
((void)(SDL_memmove((VECTOR) + (INDEX), (VECTOR) + (INDEX) + (COUNT), \
sizeof(*(VECTOR)) * (vec_meta(VECTOR)->used - (INDEX) - (COUNT))), \
vec_meta(VECTOR)->used -= (COUNT)))
#define vec_init( VECTOR, N ) \
vec_alloc(((void **)&(VECTOR)), (N), sizeof(*(VECTOR)))
#define vec_copy( DST, SRC ) \
vec_init( DST, vec_size( SRC ) ); \
for (int i = 0; i < vec_size( SRC ); ++i ){ DST[i] = SRC[i]; }
void vec_alloc( void **vector, int n, size_t s);
void vec_grow(void **vector, size_t i, size_t s);
void vec_delete(void *vector);
#endif