Advertisement
Guest User

Simple Vector in C

a guest
Apr 27th, 2024
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.07 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <assert.h>
  3. #include <string.h>
  4.  
  5. struct vector {
  6.     void (*val_free)(void *);
  7.     uintptr_t *data;
  8.     int cap;
  9.     int len;
  10. };
  11.  
  12. /*********************************************************************
  13.  *                                                                   *
  14.  *                    constructor / destructor                       *
  15.  *                                                                   *
  16.  *********************************************************************/
  17.  
  18. /*************
  19.  * vec_alloc *
  20.  *************/
  21.  
  22. struct vector *
  23. vec_alloc(int cap, void (*val_free)(void *))
  24. {
  25.     struct vector *vec;
  26.     uintptr_t *data;
  27.    
  28.     vec = malloc(sizeof(struct vector));
  29.     data = malloc(cap * sizeof(uintptr_t));
  30.  
  31.     vec->val_free = val_free;
  32.     vec->data = data;
  33.     vec->cap = cap;
  34.     vec->len = 0;
  35.  
  36.     return vec;
  37. }
  38.  
  39. /************
  40.  * vec_free *
  41.  ************/
  42.  
  43. void
  44. vec_free(struct vector *vec)
  45. {
  46.     if (vec->val_free) {
  47.         for (int i = 0; i < vec->len; i++) {
  48.             if (vec->data[i])
  49.                 vec->val_free((void *)vec->data[i]);
  50.         }
  51.     }
  52.  
  53.     free(vec->data);
  54.     free(vec);
  55. }
  56.  
  57. /*********************************************************************
  58.  *                                                                   *
  59.  *                            insertion                              *
  60.  *                                                                   *
  61.  *********************************************************************/
  62.  
  63. /************
  64.  * vec_push *
  65.  ************/
  66.  
  67. /* pushes item to the back of the vector */
  68.  
  69. void
  70. vec_push(struct vector *vec, uintptr_t src)
  71. {
  72.     if (vec->len == vec->cap)
  73.         resize(vec, vec->cap * 2);
  74.  
  75.     vec->len++;
  76.     vec->data[vec->len - 1] = src;
  77. }
  78.  
  79. /*********************************************************************
  80.  *                                                                   *
  81.  *                             deletion                              *
  82.  *                                                                   *
  83.  *********************************************************************/
  84.  
  85. /***********
  86.  * vec_pop *
  87.  ***********/
  88.  
  89. /* removes the last item in the vector, copies it to dst */
  90.  
  91. uintptr_t
  92. vec_pop(struct vector *vec)
  93. {
  94.     uintptr_t res;
  95.  
  96.     if (vec->len < 3 * vec->cap / 4)
  97.         resize(vec, 3 * vec->cap / 4);
  98.    
  99.     res = vec->data[vec->len - 1];
  100.    
  101.     vec->len--;
  102.  
  103.     return res;
  104. }
  105.  
  106. /*********************************************************************
  107.  *                                                                   *
  108.  *                            retrieval                              *
  109.  *                                                                   *
  110.  *********************************************************************/
  111.  
  112. /************
  113.  * vec_peek *
  114.  ************/
  115.  
  116. /* copies the item at an index to dst */
  117.  
  118. uintptr_t
  119. vec_peek(struct vector *vec)
  120. {
  121.     if (vec->len > 0)
  122.         return vec->data[vec->len - 1];
  123.     return 0;    
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement