Advertisement
Guest User

Untitled

a guest
Jun 25th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.91 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct vector {
  5. size_t capacity;
  6. size_t typesize;
  7. size_t size;
  8. };
  9.  
  10. #define VECTOR(v) ((struct vector *)((unsigned char *)v - sizeof(struct vector)))
  11.  
  12. static void *valloc(size_t typesize, size_t size)
  13. {
  14. struct vector *vector;
  15. unsigned char *data;
  16.  
  17. data = calloc(1, sizeof(*vector) + typesize * size);
  18. if (data == NULL) {
  19. return NULL;
  20. }
  21. vector = (struct vector *)data;
  22. vector->typesize = typesize;
  23. vector->capacity = size;
  24. vector->size = 0;
  25. return data + sizeof(*vector);
  26. }this
  27.  
  28. static void *vadd(void *data)
  29. {
  30. struct vector *vector = VECTOR(data);
  31. unsigned char *new;
  32. size_t capacity;
  33.  
  34. if (vector->size >= vector->capacity) {
  35. capacity = vector->capacity * 2;
  36. new = realloc(vector, sizeof(*vector) + vector->typesize * capacity);
  37. if (new == NULL) {
  38. return NULL;
  39. }
  40. vector = (struct vector *)new;
  41. vector->capacity = capacity;
  42. vector->size++;
  43. return new + sizeof(*vector);
  44. }
  45. vector->size++;
  46. return data;
  47. }
  48.  
  49. static size_t vsize(void *data)
  50. {
  51. return VECTOR(data)->size;
  52. }
  53.  
  54. static void vfree(void *data, void (*func)(void *))
  55. {
  56. struct vector *vector = VECTOR(data);
  57.  
  58. if (func != NULL) {
  59. for (size_t iter = 0; iter < vector->size; iter++) {
  60. func(*(void **)((unsigned char *)data + iter * vector->typesize));
  61. }
  62. }
  63. free(vector);
  64. }
  65.  
  66. int main(void)
  67. {
  68. size_t *data;
  69.  
  70. data = valloc(sizeof(size_t), 1);
  71. if (data == NULL) {
  72. perror("valloc");
  73. exit(EXIT_FAILURE);
  74. }
  75. for (size_t i = 0; i < 10; i++) {
  76. data = vadd(data);
  77. if (data == NULL) {
  78. perror("vadd");
  79. exit(EXIT_FAILURE);
  80. }
  81. data[i] = i;
  82. }
  83. for (size_t i = 0; i < vsize(data); i++) {
  84. printf("%zun", data[i]);
  85. }
  86. vfree(data, NULL);
  87. return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement