Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- /*
- * Compile time polymorphic vector implementation
- */
- #define VECTOR_GEN(T) \
- struct vector_##T; \
- /* \
- * vmethod table \
- */ \
- struct vec_v_table_##T { \
- void (*free_vec)(struct vector_##T *); \
- void (*push_back)(struct vector_##T *, T const); \
- T *(*at)(struct vector_##T *, size_t i); \
- T *(*front)(struct vector_##T *); \
- T *(*back)(struct vector_##T *); \
- }; \
- /* \
- * vector struct \
- */ \
- struct vector_##T { \
- size_t capacity; \
- size_t size; \
- T *data; \
- struct vec_v_table_##T *m; \
- }; \
- /* \
- * memory related methods \
- */ \
- void free_v_##T(struct vector_##T *self) { free(self->data); } \
- \
- void resize_v_##T(struct vector_##T *self) \
- { \
- if (self->capacity == 0) { \
- self->capacity = 1; \
- \
- self->data = malloc(sizeof(T)); \
- } else { \
- self->capacity *= 2; \
- \
- self->data = \
- realloc(self->data, self->capacity * sizeof(T)); \
- } \
- \
- if (self->data == NULL) { \
- puts("Error (re)allocating memory"); \
- exit(1); \
- } \
- } \
- \
- void push_back_v_##T(struct vector_##T *self, T const elem) \
- { \
- if (self->capacity == self->size) \
- resize_v_##T(self); \
- \
- self->data[self->size] = elem; \
- self->size++; \
- } \
- /* \
- * index methods \
- */ \
- T *at_v_##T(struct vector_##T *self, size_t i) \
- { \
- if (i >= self->size) { \
- puts("Error out of bounds"); \
- exit(1); \
- } \
- \
- return &self->data[i]; \
- } \
- \
- T *front_v_##T(struct vector_##T *self) \
- { \
- return self->m->at(self, 0); \
- } \
- \
- T *back_v_##T(struct vector_##T *self) \
- { \
- return self->m->at(self, self->size - 1); \
- } \
- /* \
- * Initialize v table \
- */ \
- struct vec_v_table_##T vec_v_t_##T = { \
- free_v_##T, push_back_v_##T, at_v_##T, front_v_##T, back_v_##T}; \
- /* \
- * vector init \
- */ \
- void init_vec_##T(struct vector_##T *self) \
- { \
- self->m = &vec_v_t_##T; \
- self->capacity = 0; \
- self->size = 0; \
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement