2019-06-12 18:53:50 +02:00
|
|
|
//---
|
|
|
|
// vector: Simple vectors that only grow
|
2019-06-18 03:27:04 +02:00
|
|
|
// Preprocessing is a bit ugly here, but it makes it really easy to use.
|
2019-06-12 18:53:50 +02:00
|
|
|
//---
|
|
|
|
|
|
|
|
#ifndef TEX_VECTOR
|
|
|
|
#define TEX_VECTOR
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <stddef.h>
|
|
|
|
|
2019-06-18 03:27:04 +02:00
|
|
|
/* Declare three variables for every vector */
|
|
|
|
#define vector_type(type, name) \
|
|
|
|
type * name; \
|
|
|
|
short name ## _len; \
|
|
|
|
short name ## _size;
|
|
|
|
|
|
|
|
/* Trivial initialization */
|
|
|
|
#define vector_init(name) { \
|
|
|
|
name = NULL; \
|
|
|
|
name ## _len = 0; \
|
|
|
|
name ## _size = 0; \
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Extension */
|
|
|
|
#define vector_extend(name) { \
|
|
|
|
if(name ## _len >= name ## _size) \
|
|
|
|
name = realloc(name, sizeof *name * \
|
|
|
|
(name ## _size += 8)); \
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Append */
|
|
|
|
#define vector_append(name, value) { \
|
|
|
|
vector_extend(name); \
|
|
|
|
(name)[name ## _len++] = (value); \
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Last elements */
|
|
|
|
#define vector_last(name) ((name)[name ## _len - 1])
|
2019-06-12 18:53:50 +02:00
|
|
|
|
|
|
|
#endif /* TEX_VECTOR */
|