55 lines
1.2 KiB
C
55 lines
1.2 KiB
C
// vector.h
|
|
#ifndef VECTOR_H
|
|
#define VECTOR_H
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdint.h>
|
|
|
|
#define vector_header(name, type) \
|
|
struct { \
|
|
size_t size; \
|
|
size_t cap; \
|
|
type *data; \
|
|
} name \
|
|
|
|
#define vector_init(vec) \
|
|
do { \
|
|
(vec).size = 0, \
|
|
(vec).cap = 0, \
|
|
(vec).data = NULL; \
|
|
} while(0)
|
|
|
|
#define vector_push(vec, value) \
|
|
do { \
|
|
if (vec.size >= vec.cap) { \
|
|
int cap = vec.cap ? vec.cap * 2 : 8; \
|
|
void* data = realloc(vec.data, cap * sizeof(*vec.data)); \
|
|
if (!data) { \
|
|
fprintf(stderr, "vector_push: realloc failed\n"); \
|
|
exit(1); \
|
|
} \
|
|
(vec).cap = cap; \
|
|
(vec).data = data; \
|
|
} \
|
|
(vec).data[(vec).size++] = value; \
|
|
} while(0)
|
|
|
|
#define vector_pop(vec) \
|
|
((vec).data[--(vec).size])
|
|
|
|
#define vector_at(vec, idx) \
|
|
(((vec).data)[idx])
|
|
|
|
#define vector_idx(vec, ptr) \
|
|
((ptr) - (vec).data)
|
|
|
|
#define vector_free(vec) \
|
|
do { \
|
|
free((vec).data); \
|
|
(vec).data = NULL; \
|
|
(vec).size = (vec).cap = 0; \
|
|
} while(0)
|
|
|
|
#endif
|