aboutsummaryrefslogtreecommitdiff
path: root/test/vec.h
blob: 810e663862664800d5c869edd9b3a77930472533 (plain) (blame)
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
#ifndef VEC_H
#define VEC_H

#include <stddef.h>
#include <assert.h>
#include <stdlib.h>

typedef any {};

typedef vec[any type]() {
	struct <> {
		size_t n;
		size_t s;
		type *buf;
	};

	static inline struct <> <>create()
	{
		return (struct <>){
			.n = 0,
			.s = 0,
			.buf = NULL
		};
	}

	static inline void <>append(struct <> *v, type n)
	{
		v->n++;
		if (v->n > v->s) {
			v->s = v->s == 0 ? 1 : 2 * v->s;
			v->buf = realloc(v->buf, v->s * sizeof(type));
		}

		v->buf[v->n - 1] = n;
	}

	static inline type *<>at(struct <> *v, size_t i)
	{
		assert(i < v->n);
		return &v->buf[i];
	}

	static inline void <>destroy(struct <> *v)
	{
		free(v->buf);
	}
}

#endif /* VEC_H */