Skip to content

Instantly share code, notes, and snippets.

@zrbecker
Created July 11, 2012 01:45
Show Gist options
  • Select an option

  • Save zrbecker/3087420 to your computer and use it in GitHub Desktop.

Select an option

Save zrbecker/3087420 to your computer and use it in GitHub Desktop.
#include <stdlib.h>
#include <stdio.h>
#define max(x, y) ((x) > (y)) ? (x) : (y)
#define C_VECTOR(T) \
typedef struct _c_vector_##T { \
size_t capacity; \
size_t size; \
T *d; \
} c_vector_##T; \
\
c_vector_##T *c_vector_create_##T() { \
c_vector_##T *v = malloc(sizeof(c_vector_##T)); \
v->capacity = 0; \
v->size = 0; \
v->d = NULL; \
return v; \
} \
\
void c_vector_destroy_##T(c_vector_##T *v) { \
if (v->d != NULL) \
free(v->d); \
free(v); \
} \
\
void c_vector_append_##T(c_vector_##T *v, T value) { \
if (v->size >= v->capacity) { \
v->capacity = max(16, v->capacity * 2); \
v->d = realloc(v->d, v->capacity * sizeof(T)); \
} \
v->d[v->size++] = value; \
}
C_VECTOR(int)
C_VECTOR(double)
int main() {
c_vector_int *v = c_vector_create_int();
c_vector_append_int(v, 10);
c_vector_append_int(v, 20);
c_vector_append_int(v, 30);
c_vector_append_int(v, 40);
c_vector_append_int(v, 50);
printf("size: %lu capacity: %lu\n", v->size, v->capacity);
int i;
for (i = 0; i < v->size; ++i)
printf("%d\n", v->d[i]);
c_vector_destroy_int(v);
c_vector_double *v2 = c_vector_create_double();
c_vector_append_double(v2, 1.34);
c_vector_append_double(v2, 5.16);
c_vector_append_double(v2, 5.16);
c_vector_append_double(v2, 5.16);
c_vector_append_double(v2, 5.16);
c_vector_append_double(v2, 5.16);
c_vector_append_double(v2, 5.16);
c_vector_append_double(v2, 5.16);
c_vector_append_double(v2, 5.16);
c_vector_append_double(v2, 5.16);
c_vector_append_double(v2, 5.16);
c_vector_append_double(v2, 5.16);
c_vector_append_double(v2, 5.16);
c_vector_append_double(v2, 5.16);
c_vector_append_double(v2, 5.16);
c_vector_append_double(v2, 5.16);
c_vector_append_double(v2, 5.16);
printf("size: %lu capacity: %lu\n", v2->size, v2->capacity);
for (i = 0; i < v2->size; ++i)
printf("%f\n", v2->d[i]);
c_vector_destroy_double(v2);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment