C_far

c_vector.inc 0x200

Feb 23rd, 2019
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 7.37 KB | None | 0 0
  1. // EXAMPLES : https://pastebin.com/VLCGGW7c
  2. #if defined __C_VECTOR_INCLUDED__
  3.     #endinput
  4. #endif
  5. #define __C_VECTOR_INCLUDED__
  6. #define __C_VECTOR_VERSION__ 0x200
  7.  
  8. #include <YSI_Coding\y_malloc>
  9. #tryinclude <YSI_Data\y_iterate>
  10.  
  11. #define VECTOR_NULL                     (Vector:NO_ALLOC)
  12. #define INVALID_VECTOR_INDEX            (cellmin)
  13.  
  14. enum _:E_VECTOR {
  15.     Alloc:E_VECTOR_DATA,
  16.     E_VECTOR_SIZE
  17. }
  18.  
  19. #if defined _INC_y_iterate
  20.  
  21. iterfunc stock vector(&iterstate, cur, Vector:vector, array[] = cellmin, size = sizeof(array)) {
  22.     #pragma unused cur
  23.     if(array[0] == cellmin) {
  24.         return vector_get_value(vector, iterstate++);
  25.     } else {
  26.         return vector_get_array(vector, iterstate++, array, size);
  27.     }
  28. }
  29. #define iterstart@vector iterstate(INVALID_VECTOR_INDEX, 0)
  30.  
  31. iterfunc stock array(&iterstate, cur, const array[], size, size2 = sizeof(array)) {
  32.     #pragma unused cur
  33.     if(iterstate < size && iterstate < size2) {
  34.         return array[iterstate++];
  35.     }
  36.     return INVALID_VECTOR_INDEX;
  37. }
  38. #define iterstart@array iterstate(INVALID_VECTOR_INDEX, 0)
  39.  
  40. #endif
  41.  
  42. static stock vector_push_back_ptr(&Vector:vector, &Alloc:ptr, size = 0) {
  43.     new
  44.         v[E_VECTOR];
  45.  
  46.     if(vector == VECTOR_NULL) {
  47.         v[E_VECTOR_DATA] = malloc(E_VECTOR, true);
  48.         v[E_VECTOR_SIZE] = E_VECTOR;
  49.         vector = Vector:malloc(E_VECTOR);
  50.     } else {
  51.         memcpy(v, YSI_gMallocMemory[_:vector], 0, E_VECTOR * 4, E_VECTOR);
  52.         v[E_VECTOR_SIZE] += E_VECTOR;
  53.         new
  54.             Alloc:a = malloc(v[E_VECTOR_SIZE], true);
  55.  
  56.         memcpy(YSI_gMallocMemory[_:a], YSI_gMallocMemory[_:v[E_VECTOR_DATA]], 0, v[E_VECTOR_SIZE]*4, v[E_VECTOR_SIZE]);
  57.         free(v[E_VECTOR_DATA]);
  58.         v[E_VECTOR_DATA] = a;
  59.     }
  60.  
  61.     new
  62.         value_ptr[E_VECTOR];
  63.  
  64.     ptr = value_ptr[E_VECTOR_DATA] = malloc(size == 0 ? 1 : size, true);
  65.     value_ptr[E_VECTOR_SIZE] = size;
  66.  
  67.     memcpy(YSI_gMallocMemory[_:vector], v, 0, E_VECTOR * 4, E_VECTOR);
  68.     memcpy(YSI_gMallocMemory[_:v[E_VECTOR_DATA] + (v[E_VECTOR_SIZE] - E_VECTOR)], value_ptr, 0, E_VECTOR * 4, E_VECTOR);
  69. }
  70.  
  71. stock vector_push_back_value(&Vector:vector, value) {
  72.     new
  73.         Alloc:ptr;
  74.  
  75.     vector_push_back_ptr(vector, ptr);
  76.     YSI_gMallocMemory[_:ptr] = value;
  77. }
  78.  
  79. stock vector_push_back_array(&Vector:vector, const array[], size = sizeof(array)) {
  80.     new
  81.         Alloc:ptr;
  82.  
  83.     vector_push_back_ptr(vector, ptr, size);
  84.     memcpy(YSI_gMallocMemory[_:ptr], array, 0, size * 4, size);
  85. }
  86.  
  87. stock vector_remove(&Vector:vector, index) {
  88.     if(vector != VECTOR_NULL) {
  89.         new
  90.             v[E_VECTOR];
  91.  
  92.         memcpy(v, YSI_gMallocMemory[_:vector], 0, E_VECTOR * 4, E_VECTOR);
  93.         index *= E_VECTOR;
  94.  
  95.         if(0 <= index < v[E_VECTOR_SIZE]) {
  96.             if(index == 0 && (v[E_VECTOR_SIZE] - E_VECTOR) == 0) {
  97.                 vector_free(vector);
  98.             } else {
  99.                 free(Alloc:mget(v[E_VECTOR_DATA] + Alloc:index, E_VECTOR_DATA));
  100.  
  101.                 for(new i = index, j = index + E_VECTOR; j < v[E_VECTOR_SIZE]; i += E_VECTOR) {
  102.                     YSI_gMallocMemory[_:v[E_VECTOR_DATA] + i] = YSI_gMallocMemory[_:v[E_VECTOR_DATA] + j];
  103.                     YSI_gMallocMemory[_:v[E_VECTOR_DATA] + i + E_VECTOR_SIZE] = YSI_gMallocMemory[_:v[E_VECTOR_DATA] + j + E_VECTOR_SIZE];
  104.                     j += E_VECTOR;
  105.                 }
  106.  
  107.                 v[E_VECTOR_SIZE] -= E_VECTOR;
  108.  
  109.                 new
  110.                     Alloc:a = malloc(v[E_VECTOR_SIZE], true);
  111.  
  112.                 memcpy(YSI_gMallocMemory[_:a], YSI_gMallocMemory[_:v[E_VECTOR_DATA]], 0, (v[E_VECTOR_SIZE])*4, v[E_VECTOR_SIZE]);
  113.                 free(v[E_VECTOR_DATA]);
  114.                 v[E_VECTOR_DATA] = a;
  115.  
  116.                 memcpy(YSI_gMallocMemory[_:vector], v, 0, E_VECTOR * 4, E_VECTOR);
  117.             }
  118.  
  119.             return true;
  120.         }
  121.     }
  122.  
  123.     return false;
  124. }
  125.  
  126. stock vector_get_value(Vector:vector, index) {
  127.     if(vector != VECTOR_NULL) {
  128.         new
  129.             v_data = YSI_gMallocMemory[_:vector],
  130.             v_size = YSI_gMallocMemory[_:vector + E_VECTOR_SIZE];
  131.  
  132.         index *= 2;
  133.  
  134.         if(0 <= index < v_size) {
  135.             return YSI_gMallocMemory[YSI_gMallocMemory[v_data + index]];
  136.         }
  137.     }
  138.  
  139.     return INVALID_VECTOR_INDEX;
  140. }
  141.  
  142. stock vector_get_array(Vector:vector, index, array[], size = sizeof(array)) {
  143.     if(vector != VECTOR_NULL) {
  144.         new
  145.             v_data = YSI_gMallocMemory[_:vector],
  146.             v_size = YSI_gMallocMemory[_:vector + E_VECTOR_SIZE];
  147.  
  148.         index *= 2;
  149.  
  150.         if(0 <= index < v_size) {
  151.             new
  152.                 ptr_data = YSI_gMallocMemory[v_data + index],
  153.                 ptr_size = YSI_gMallocMemory[v_data + index + E_VECTOR_SIZE];
  154.  
  155.             new
  156.                 n_sz = ((size > ptr_size) ? ptr_size : size);
  157.  
  158.             memcpy(array, YSI_gMallocMemory[ptr_data], 0, n_sz * 4, n_sz);
  159.  
  160.             return n_sz;
  161.         }
  162.     }
  163.  
  164.     return INVALID_VECTOR_INDEX;
  165. }
  166.  
  167. stock vector_set_value(Vector:vector, index, value) {
  168.     if(vector != VECTOR_NULL) {
  169.         new
  170.             v[E_VECTOR];
  171.  
  172.         memcpy(v, YSI_gMallocMemory[_:vector], 0, E_VECTOR * 4, E_VECTOR);
  173.         index *= 2;
  174.  
  175.         if(0 <= index < v[E_VECTOR_SIZE]) {
  176.             YSI_gMallocMemory[YSI_gMallocMemory[_:v[E_VECTOR_DATA] + index]] = value;
  177.         }
  178.     }
  179. }
  180.  
  181. stock vector_set_array(Vector:vector, index, array[], size = sizeof(array)) {
  182.     if(vector != VECTOR_NULL) {
  183.         new
  184.             v[E_VECTOR];
  185.  
  186.         memcpy(v, YSI_gMallocMemory[_:vector], 0, E_VECTOR * 4, E_VECTOR);
  187.         index *= 2;
  188.  
  189.         if(0 <= index < v[E_VECTOR_SIZE]) {
  190.             new
  191.                 ptr[E_VECTOR];
  192.  
  193.             memcpy(ptr, YSI_gMallocMemory[_:v[E_VECTOR_DATA] + index], 0, E_VECTOR * 4, E_VECTOR);
  194.             if(size != ptr[E_VECTOR_SIZE]) {
  195.                 free(ptr[E_VECTOR_DATA]);
  196.                 ptr[E_VECTOR_DATA] = malloc(size, true);
  197.                 ptr[E_VECTOR_SIZE] = size;
  198.             }
  199.  
  200.             memcpy(YSI_gMallocMemory[_:ptr[E_VECTOR_DATA]], array, 0, size * 4, size);
  201.             memcpy(YSI_gMallocMemory[_:v[E_VECTOR_DATA] + index], ptr, 0, E_VECTOR * 4, E_VECTOR);
  202.         }
  203.     }
  204. }
  205.  
  206. stock bool:vector_is_storing_array(Vector:vector) {
  207.     if(vector != VECTOR_NULL) {
  208.         return YSI_gMallocMemory[YSI_gMallocMemory[_:vector + E_VECTOR_DATA] + E_VECTOR_SIZE] != 0;
  209.     }
  210.  
  211.     return false;
  212. }
  213.  
  214. stock vector_free(&Vector:vector) {
  215.     if(vector != VECTOR_NULL) {
  216.         new
  217.             v[E_VECTOR];
  218.    
  219.         memcpy(v, YSI_gMallocMemory[_:vector], 0, E_VECTOR * 4, E_VECTOR);
  220.  
  221.         for(new i = 0; i < v[E_VECTOR_SIZE]; i += 2) {
  222.             free(Alloc:YSI_gMallocMemory[_:v[E_VECTOR_DATA] + i]);
  223.         }
  224.  
  225.         free(v[E_VECTOR_DATA]);
  226.         free(Alloc:vector);
  227.         vector = VECTOR_NULL;
  228.     }
  229. }
  230.  
  231. stock vector_get_array_size(Vector:vector, index) {
  232.     if(vector != VECTOR_NULL) {
  233.         new
  234.             v[E_VECTOR];
  235.  
  236.         memcpy(v, YSI_gMallocMemory[_:vector], 0, E_VECTOR * 4, E_VECTOR);
  237.         index *= 2;
  238.  
  239.         if(0 <= index < v[E_VECTOR_SIZE]) {
  240.             return YSI_gMallocMemory[_:v[E_VECTOR_DATA] + E_VECTOR_SIZE];
  241.         }
  242.     }
  243.  
  244.     return 0;
  245. }
  246.  
  247. stock vector_get_size(Vector:vector) {
  248.     if(vector != VECTOR_NULL) {
  249.         return YSI_gMallocMemory[_:vector + E_VECTOR_SIZE] / E_VECTOR;
  250.     }
  251.  
  252.     return 0;
  253. }
Advertisement