Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- struct vector {
- size_t capacity;
- size_t typesize;
- size_t size;
- };
- #define VECTOR(v) ((struct vector *)((unsigned char *)v - sizeof(struct vector)))
- static void *valloc(size_t typesize, size_t size)
- {
- struct vector *vector;
- unsigned char *data;
- data = calloc(1, sizeof(*vector) + typesize * size);
- if (data == NULL) {
- return NULL;
- }
- vector = (struct vector *)data;
- vector->typesize = typesize;
- vector->capacity = size;
- vector->size = 0;
- return data + sizeof(*vector);
- }this
- static void *vadd(void *data)
- {
- struct vector *vector = VECTOR(data);
- unsigned char *new;
- size_t capacity;
- if (vector->size >= vector->capacity) {
- capacity = vector->capacity * 2;
- new = realloc(vector, sizeof(*vector) + vector->typesize * capacity);
- if (new == NULL) {
- return NULL;
- }
- vector = (struct vector *)new;
- vector->capacity = capacity;
- vector->size++;
- return new + sizeof(*vector);
- }
- vector->size++;
- return data;
- }
- static size_t vsize(void *data)
- {
- return VECTOR(data)->size;
- }
- static void vfree(void *data, void (*func)(void *))
- {
- struct vector *vector = VECTOR(data);
- if (func != NULL) {
- for (size_t iter = 0; iter < vector->size; iter++) {
- func(*(void **)((unsigned char *)data + iter * vector->typesize));
- }
- }
- free(vector);
- }
- int main(void)
- {
- size_t *data;
- data = valloc(sizeof(size_t), 1);
- if (data == NULL) {
- perror("valloc");
- exit(EXIT_FAILURE);
- }
- for (size_t i = 0; i < 10; i++) {
- data = vadd(data);
- if (data == NULL) {
- perror("vadd");
- exit(EXIT_FAILURE);
- }
- data[i] = i;
- }
- for (size_t i = 0; i < vsize(data); i++) {
- printf("%zun", data[i]);
- }
- vfree(data, NULL);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement