Advertisement
tim_ryspekov

Vector C lang.

Jul 19th, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.85 KB | None | 0 0
  1. typedef struct vec
  2. {
  3.     unsigned char* _mem;
  4.     unsigned long _elems;
  5.     unsigned long _elemsize;
  6.     unsigned long _capelems;
  7.     unsigned long _reserve;
  8. };
  9.  
  10. vec* vec_new(unsigned long elemsize)
  11. {
  12.     vec* pvec = (vec*)malloc(sizeof(vec));
  13.     pvec->_reserve = 10;
  14.     pvec->_capelems = pvec->_reserve;
  15.     pvec->_elemsize = elemsize;
  16.     pvec->_elems = 0;
  17.     pvec->_mem = (unsigned char*)malloc(pvec->_capelems * pvec->_elemsize);
  18.     return pvec;
  19. }
  20.  
  21. void vec_delete(vec* pvec)
  22. {
  23.     free(pvec->_mem);
  24.     free(pvec);
  25. }
  26.  
  27. void vec_grow(vec* pvec)
  28. {
  29.     unsigned char* mem = (unsigned char*)malloc((pvec->_capelems + pvec->_reserve) * pvec->_elemsize);
  30.     memcpy(mem, pvec->_mem, pvec->_elems * pvec->_elemsize);
  31.     free(pvec->_mem);
  32.     pvec->_mem = mem;
  33.     pvec->_capelems += pvec->_reserve;
  34. }
  35.  
  36. void vec_push_back(vec* pvec, void* data, unsigned long elemsize)
  37. {
  38.     assert(elemsize == pvec->_elemsize);
  39.     if (pvec->_elems == pvec->_capelems) {
  40.         vec_grow(pvec);
  41.     }
  42.     memcpy(pvec->_mem + (pvec->_elems * pvec->_elemsize), (unsigned char*)data, pvec->_elemsize);
  43.     pvec->_elems++;    
  44. }
  45.  
  46. unsigned long vec_length(vec* pvec)
  47. {
  48.     return pvec->_elems;
  49. }
  50.  
  51. void* vec_get(vec* pvec, unsigned long index)
  52. {
  53.     assert(index < pvec->_elems);
  54.     return (void*)(pvec->_mem + (index * pvec->_elemsize));
  55. }
  56.  
  57. void vec_copy_item(vec* pvec, void* dest, unsigned long index)
  58. {
  59.     memcpy(dest, vec_get(pvec, index), pvec->_elemsize);
  60. }
  61.  
  62. void test()
  63. {
  64.     vec* pvec = vec_new(sizeof(int));
  65.  
  66.     for (int val = 0; val < 1000; val += 10) {
  67.         vec_push_back(pvec, &val, sizeof(val));
  68.     }
  69.  
  70.     for (unsigned long index = (int)vec_length(pvec) - 1; (int)index >= 0; index--) {
  71.         int val;
  72.         vec_copy_item(pvec, &val, index);
  73.         printf("vec(%d) = %d\n", index, val);
  74.     }
  75.  
  76.     vec_delete(pvec);
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement