Advertisement
Guest User

Untitled

a guest
Apr 12th, 2018
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.29 KB | None | 0 0
  1. #include <stdlib.h>
  2. /*
  3.  * Compile time polymorphic vector implementation
  4.  */
  5. #define VECTOR_GEN(T)                                                          \
  6.     struct vector_##T;                                                     \
  7.     /*                                                                     \
  8.      * vmethod table                                                       \
  9.      */                                                                    \
  10.     struct vec_v_table_##T {                                               \
  11.         void (*free_vec)(struct vector_##T *);                         \
  12.         void (*push_back)(struct vector_##T *, T const);               \
  13.         T *(*at)(struct vector_##T *, size_t i);                       \
  14.         T *(*front)(struct vector_##T *);                              \
  15.         T *(*back)(struct vector_##T *);                               \
  16.     };                                                                     \
  17.     /*                                                                     \
  18.      * vector struct                                                       \
  19.      */                                                                    \
  20.     struct vector_##T {                                                    \
  21.         size_t capacity;                                               \
  22.         size_t size;                                                   \
  23.         T *data;                                                       \
  24.         struct vec_v_table_##T *m;                                     \
  25.     };                                                                     \
  26.     /*                                                                     \
  27.      * memory related methods                                              \
  28.      */                                                                    \
  29.     void free_v_##T(struct vector_##T *self) { free(self->data); }         \
  30.                                                                                \
  31.     void resize_v_##T(struct vector_##T *self)                             \
  32.     {                                                                      \
  33.         if (self->capacity == 0) {                                     \
  34.             self->capacity = 1;                                    \
  35.                                                                                \
  36.             self->data = malloc(sizeof(T));                        \
  37.         } else {                                                       \
  38.             self->capacity *= 2;                                   \
  39.                                                                                \
  40.             self->data =                                           \
  41.                 realloc(self->data, self->capacity * sizeof(T));   \
  42.         }                                                              \
  43.                                                                                \
  44.         if (self->data == NULL) {                                      \
  45.             puts("Error (re)allocating memory");                   \
  46.             exit(1);                                               \
  47.         }                                                              \
  48.     }                                                                      \
  49.                                                                                \
  50.     void push_back_v_##T(struct vector_##T *self, T const elem)            \
  51.     {                                                                      \
  52.         if (self->capacity == self->size)                              \
  53.             resize_v_##T(self);                                    \
  54.                                                                                \
  55.         self->data[self->size] = elem;                                 \
  56.         self->size++;                                                  \
  57.     }                                                                      \
  58.     /*                                                                     \
  59.      * index methods                                                       \
  60.      */                                                                    \
  61.     T *at_v_##T(struct vector_##T *self, size_t i)                         \
  62.     {                                                                      \
  63.         if (i >= self->size) {                                         \
  64.             puts("Error out of bounds");                           \
  65.             exit(1);                                               \
  66.         }                                                              \
  67.                                                                                \
  68.         return &self->data[i];                                         \
  69.     }                                                                      \
  70.                                                                                \
  71.     T *front_v_##T(struct vector_##T *self)                                \
  72.     {                                                                      \
  73.         return self->m->at(self, 0);                                   \
  74.     }                                                                      \
  75.                                                                                \
  76.     T *back_v_##T(struct vector_##T *self)                                 \
  77.     {                                                                      \
  78.         return self->m->at(self, self->size - 1);                      \
  79.     }                                                                      \
  80.     /*                                                                     \
  81.      *  Initialize v table                                                 \
  82.      */                                                                    \
  83.     struct vec_v_table_##T vec_v_t_##T = {                                 \
  84.         free_v_##T, push_back_v_##T, at_v_##T, front_v_##T, back_v_##T};   \
  85.     /*                                                                     \
  86.      * vector init                                                         \
  87.      */                                                                    \
  88.     void init_vec_##T(struct vector_##T *self)                             \
  89.     {                                                                      \
  90.         self->m        = &vec_v_t_##T;                                 \
  91.         self->capacity = 0;                                            \
  92.         self->size     = 0;                                            \
  93.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement