41 lines
2.5 KiB
C
41 lines
2.5 KiB
C
#ifndef VEC_H
|
|
#define VEC_H
|
|
|
|
#include <stddef.h>
|
|
#include <stdlib.h>
|
|
|
|
#define DEFINE_VEC(TYPENAME, FN_PREFIX, TYPE) \
|
|
\
|
|
typedef struct { \
|
|
TYPE* data; \
|
|
size_t size; \
|
|
size_t capacity; \
|
|
} TYPENAME; \
|
|
\
|
|
[[maybe_unused]] static void FN_PREFIX##_construct(TYPENAME* vec) \
|
|
{ \
|
|
*vec = (TYPENAME) {}; \
|
|
} \
|
|
\
|
|
[[maybe_unused]] static void FN_PREFIX##_destroy(TYPENAME* vec) \
|
|
{ \
|
|
if (vec->data) { \
|
|
free(vec->data); \
|
|
} \
|
|
} \
|
|
\
|
|
[[maybe_unused]] static void FN_PREFIX##_push(TYPENAME* vec, TYPE value) \
|
|
{ \
|
|
if (!vec->data || vec->capacity == 0) { \
|
|
vec->capacity = 4; \
|
|
vec->data = malloc(sizeof(TYPE) * vec->capacity); \
|
|
} else if (vec->size + 1 >= vec->capacity) { \
|
|
vec->capacity *= 2; \
|
|
vec->data = realloc(vec->data, sizeof(TYPE) * vec->capacity); \
|
|
} \
|
|
vec->data[vec->size] = value; \
|
|
vec->size += 1; \
|
|
}
|
|
|
|
#endif
|