Advertisement
C_far

c_vector.inc 0x210

Feb 25th, 2019
765
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 11.40 KB | None | 0 0
  1. #if defined __C_VECTOR_INCLUDED__
  2.     #endinput
  3. #endif
  4. #define __C_VECTOR_INCLUDED__
  5. #define __C_VECTOR_VERSION__ 0x210
  6.  
  7. #include <YSI_Coding\y_malloc>
  8. #tryinclude <YSI_Data\y_iterate>
  9.  
  10. #define VECTOR_NULL                     (Vector:NO_ALLOC)
  11. #define INVALID_VECTOR_INDEX            (cellmin)
  12.  
  13. enum _:E_VECTOR {
  14.     Alloc:E_VECTOR_DATA,
  15.     E_VECTOR_SIZE
  16. }
  17.  
  18. enum _:E_VECTOR_SORT {
  19.     E_VECTOR_SORT_ASC,
  20.     E_VECTOR_SORT_DESC
  21. }
  22.  
  23. #if defined _INC_y_iterate
  24.  
  25. iterfunc stock vector(&iterstate, cur, Vector:vector, array[] = cellmin, size = sizeof(array)) {
  26.     #pragma unused cur
  27.     if(array[0] == cellmin) {
  28.         return vector_get_value(vector, iterstate++);
  29.     } else {
  30.         return vector_get_array(vector, iterstate++, array, size);
  31.     }
  32. }
  33. #define iterstart@vector iterstate(INVALID_VECTOR_INDEX, 0)
  34.  
  35. iterfunc stock vector_reverse(&iterstate, cur, Vector:vector, array[] = cellmin, size = sizeof(array)) {
  36.     #pragma unused cur
  37.     if(iterstate == cellmax) iterstate = vector_get_size(vector) - 1;
  38.     if(array[0] == cellmin) {
  39.         return vector_get_value(vector, iterstate--);
  40.     } else {
  41.         return vector_get_array(vector, iterstate--, array, size);
  42.     }
  43. }
  44. #define iterstart@vector_reverse iterstate(INVALID_VECTOR_INDEX, cellmax)
  45.  
  46. iterfunc stock array(&iterstate, cur, const array[], size = sizeof(array), size2 = sizeof(array)) {
  47.     #pragma unused cur
  48.     if(iterstate < size && iterstate < size2) {
  49.         return array[iterstate++];
  50.     }
  51.     return INVALID_VECTOR_INDEX;
  52. }
  53. #define iterstart@array iterstate(INVALID_VECTOR_INDEX, 0)
  54.  
  55. iterfunc stock array_reverse(&iterstate, cur, const array[], size = sizeof(array), size2 = sizeof(array)) {
  56.     #pragma unused cur
  57.     if(iterstate == cellmax) iterstate = (size > size2 ? size2 : size) - 1;
  58.     if(iterstate != -1) {
  59.         return array[iterstate--];
  60.     }
  61.     return INVALID_VECTOR_INDEX;
  62. }
  63. #define iterstart@array_reverse iterstate(INVALID_VECTOR_INDEX, cellmax)
  64.  
  65. #endif
  66.  
  67. static stock vector_push_back_ptr(&Vector:vector, &Alloc:ptr, size = 0) {
  68.     new
  69.         v[E_VECTOR];
  70.  
  71.     if(vector == VECTOR_NULL) {
  72.         v[E_VECTOR_DATA] = malloc(E_VECTOR, true);
  73.         v[E_VECTOR_SIZE] = E_VECTOR;
  74.         vector = Vector:malloc(E_VECTOR);
  75.     } else {
  76.         memcpy(v, Malloc_GetData(Alloc:vector, E_VECTOR_DATA), 0, E_VECTOR * 4, E_VECTOR);
  77.         v[E_VECTOR_SIZE] += E_VECTOR;
  78.         new
  79.             Alloc:a = malloc(v[E_VECTOR_SIZE], true);
  80.  
  81.         memcpy(Malloc_GetData(a, E_VECTOR_DATA), Malloc_GetData(v[E_VECTOR_DATA], E_VECTOR_DATA), 0, v[E_VECTOR_SIZE]*4, v[E_VECTOR_SIZE]);
  82.         free(v[E_VECTOR_DATA]);
  83.         v[E_VECTOR_DATA] = a;
  84.     }
  85.  
  86.     new
  87.         value_ptr[E_VECTOR];
  88.  
  89.     ptr = value_ptr[E_VECTOR_DATA] = malloc(size == 0 ? 1 : size, true);
  90.     value_ptr[E_VECTOR_SIZE] = size;
  91.  
  92.     memcpy(Malloc_GetData(Alloc:vector, E_VECTOR_DATA), v, 0, E_VECTOR * 4, E_VECTOR);
  93.     memcpy(Malloc_GetData(v[E_VECTOR_DATA], E_VECTOR_DATA + v[E_VECTOR_SIZE] - E_VECTOR), value_ptr, 0, E_VECTOR * 4, E_VECTOR);
  94. }
  95.  
  96. stock vector_push_back_value(&Vector:vector, value) {
  97.     new
  98.         Alloc:ptr;
  99.  
  100.     vector_push_back_ptr(vector, ptr);
  101.     Malloc_SetData(ptr, E_VECTOR_DATA, value);
  102. }
  103.  
  104. stock vector_push_back_array(&Vector:vector, const array[], size = sizeof(array)) {
  105.     new
  106.         Alloc:ptr;
  107.  
  108.     vector_push_back_ptr(vector, ptr, size);
  109.     memcpy(Malloc_GetData(ptr, E_VECTOR_DATA), array, 0, size * 4, size);
  110. }
  111.  
  112. stock bool:vector_free(&Vector:vector) {
  113.     if(vector != VECTOR_NULL) {
  114.         new
  115.             v[E_VECTOR];
  116.    
  117.         memcpy(v, Malloc_GetData(Alloc:vector, E_VECTOR_DATA), 0, E_VECTOR * 4, E_VECTOR);
  118.  
  119.         for(new i = 0; i < v[E_VECTOR_SIZE]; i += 2) {
  120.             free(Alloc:Malloc_GetData(v[E_VECTOR_DATA], E_VECTOR_DATA + i));
  121.         }
  122.  
  123.         free(v[E_VECTOR_DATA]);
  124.         free(Alloc:vector);
  125.         vector = VECTOR_NULL;
  126.  
  127.         return true;
  128.     }
  129.  
  130.     return false;
  131. }
  132.  
  133. stock bool:vector_remove(&Vector:vector, index) {
  134.     if(vector != VECTOR_NULL) {
  135.         new
  136.             v[E_VECTOR];
  137.  
  138.         memcpy(v, Malloc_GetData(Alloc:vector, 0), 0, E_VECTOR * 4, E_VECTOR);
  139.         index *= E_VECTOR;
  140.  
  141.         if(0 <= index < v[E_VECTOR_SIZE]) {
  142.             if(index == 0 && (v[E_VECTOR_SIZE] - E_VECTOR) == 0) {
  143.                 vector_free(vector);
  144.             } else {
  145.                 free(Alloc:Malloc_GetData(v[E_VECTOR_DATA], E_VECTOR_DATA + index));
  146.  
  147.                 for(new i = index, j = index + E_VECTOR; j < v[E_VECTOR_SIZE]; i += E_VECTOR) {
  148.                     Malloc_SetData(v[E_VECTOR_DATA], E_VECTOR_DATA + i, Malloc_GetData(v[E_VECTOR_DATA], E_VECTOR_DATA + j));
  149.                     Malloc_SetData(v[E_VECTOR_DATA], E_VECTOR_SIZE + i, Malloc_GetData(v[E_VECTOR_DATA], E_VECTOR_SIZE + j));
  150.                     j += E_VECTOR;
  151.                 }
  152.  
  153.                 v[E_VECTOR_SIZE] -= E_VECTOR;
  154.  
  155.                 new
  156.                     Alloc:a = malloc(v[E_VECTOR_SIZE], true);
  157.  
  158.                 memcpy(Malloc_GetData(a, E_VECTOR_DATA), Malloc_GetData(v[E_VECTOR_DATA], E_VECTOR_DATA), 0, (v[E_VECTOR_SIZE])*4, v[E_VECTOR_SIZE]);
  159.                 free(v[E_VECTOR_DATA]);
  160.                 v[E_VECTOR_DATA] = a;
  161.  
  162.                 memcpy(Malloc_GetData(Alloc:vector, E_VECTOR_DATA), v, 0, E_VECTOR * 4, E_VECTOR);
  163.             }
  164.  
  165.             return true;
  166.         }
  167.     }
  168.  
  169.     return false;
  170. }
  171.  
  172. stock vector_get_value(Vector:vector, index) {
  173.     if(vector != VECTOR_NULL) {
  174.         new
  175.             Alloc:v_data = Alloc:Malloc_GetData(Alloc:vector, E_VECTOR_DATA),
  176.             v_size = Malloc_GetData(Alloc:vector, E_VECTOR_SIZE);
  177.  
  178.         index *= 2;
  179.  
  180.         if(0 <= index < v_size) {
  181.             return Malloc_GetData(Alloc:Malloc_GetData(v_data, E_VECTOR_DATA + index), E_VECTOR_DATA);
  182.         }
  183.     }
  184.  
  185.     return INVALID_VECTOR_INDEX;
  186. }
  187.  
  188. stock vector_get_array(Vector:vector, index, array[], size = sizeof(array)) {
  189.     if(vector != VECTOR_NULL) {
  190.         new
  191.             Alloc:v_data = Alloc:Malloc_GetData(Alloc:vector, E_VECTOR_DATA),
  192.             v_size = Malloc_GetData(Alloc:vector, E_VECTOR_SIZE);
  193.  
  194.         index *= 2;
  195.  
  196.         if(0 <= index < v_size) {
  197.             new
  198.                 Alloc:ptr_data = Alloc:Malloc_GetData(v_data, E_VECTOR_DATA + index),
  199.                 ptr_size = Malloc_GetData(v_data, E_VECTOR_SIZE + index);
  200.  
  201.             new
  202.                 n_sz = ((size > ptr_size) ? ptr_size : size);
  203.  
  204.             memcpy(array, Malloc_GetData(ptr_data, E_VECTOR_DATA), 0, n_sz * 4, n_sz);
  205.  
  206.             return n_sz;
  207.         }
  208.     }
  209.  
  210.     return INVALID_VECTOR_INDEX;
  211. }
  212.  
  213. stock bool:vector_set_value(Vector:vector, index, value) {
  214.     if(vector != VECTOR_NULL) {
  215.         new
  216.             v[E_VECTOR];
  217.  
  218.         memcpy(v, Malloc_GetData(Alloc:vector, E_VECTOR_DATA), 0, E_VECTOR * 4, E_VECTOR);
  219.         index *= 2;
  220.  
  221.         if(0 <= index < v[E_VECTOR_SIZE]) {
  222.             Malloc_SetData(Alloc:Malloc_GetData(v[E_VECTOR_DATA], E_VECTOR_DATA + index), E_VECTOR_DATA, value);
  223.  
  224.             return true;
  225.         }
  226.     }
  227.  
  228.     return false;
  229. }
  230.  
  231. stock bool:vector_set_array(Vector:vector, index, array[], size = sizeof(array)) {
  232.     if(vector != VECTOR_NULL) {
  233.         new
  234.             v[E_VECTOR];
  235.  
  236.         memcpy(v, Malloc_GetData(Alloc:vector, E_VECTOR_DATA), 0, E_VECTOR * 4, E_VECTOR);
  237.         index *= 2;
  238.  
  239.         if(0 <= index < v[E_VECTOR_SIZE]) {
  240.             new
  241.                 ptr[E_VECTOR];
  242.  
  243.             memcpy(ptr, Malloc_GetData(v[E_VECTOR_DATA], E_VECTOR_DATA + index), 0, E_VECTOR * 4, E_VECTOR);
  244.             if(size != ptr[E_VECTOR_SIZE]) {
  245.                 free(ptr[E_VECTOR_DATA]);
  246.                 ptr[E_VECTOR_DATA] = malloc(size, true);
  247.                 ptr[E_VECTOR_SIZE] = size;
  248.             }
  249.  
  250.             memcpy(Malloc_GetData(ptr[E_VECTOR_DATA], E_VECTOR_DATA), array, 0, size * 4, size);
  251.             memcpy(Malloc_GetData(v[E_VECTOR_DATA], E_VECTOR_DATA + index), ptr, 0, E_VECTOR * 4, E_VECTOR);
  252.  
  253.             return true;
  254.         }
  255.     }
  256.  
  257.     return false;
  258. }
  259.  
  260. stock bool:vector_is_storing_array(Vector:vector) {
  261.     if(vector != VECTOR_NULL) {
  262.         return Malloc_GetData(Alloc:Malloc_GetData(Alloc:vector, E_VECTOR_DATA), E_VECTOR_SIZE) != 0;
  263.     }
  264.  
  265.     return false;
  266. }
  267.  
  268. stock vector_get_array_size(Vector:vector, index) {
  269.     if(vector != VECTOR_NULL) {
  270.         new
  271.             v[E_VECTOR];
  272.  
  273.         memcpy(v, Malloc_GetData(Alloc:vector, E_VECTOR_DATA), 0, E_VECTOR * 4, E_VECTOR);
  274.         index *= 2;
  275.  
  276.         if(0 <= index < v[E_VECTOR_SIZE]) {
  277.             return Malloc_GetData(v[E_VECTOR_DATA], E_VECTOR_SIZE);
  278.         }
  279.     }
  280.  
  281.     return 0;
  282. }
  283.  
  284. stock vector_get_size(Vector:vector) {
  285.     if(vector != VECTOR_NULL) {
  286.         return Malloc_GetData(Alloc:vector, E_VECTOR_SIZE) / E_VECTOR;
  287.     }
  288.  
  289.     return 0;
  290. }
  291.  
  292. static stock vector_sort_values_helper(Alloc:v_data, first, last) {
  293.     if(first < last) {
  294.         new
  295.             splitpoint = vector_sort_values_partition(v_data, first, last);
  296.  
  297.         vector_sort_values_helper(v_data, first, splitpoint - E_VECTOR);
  298.         vector_sort_values_helper(v_data, splitpoint + E_VECTOR, last);
  299.     }
  300. }
  301.  
  302. static stock vector_sort_values_partition(Alloc:v_data, first, last) {
  303.     new
  304.         pvt_value = Malloc_GetData(Alloc:Malloc_GetData(v_data, E_VECTOR_DATA + first), E_VECTOR_DATA),
  305.         left_mark = first + E_VECTOR,
  306.         right_mark = last,
  307.         bool:done = false,
  308.         tmp;
  309.  
  310.     while(!done) {
  311.         while(left_mark <= right_mark && Malloc_GetData(Alloc:Malloc_GetData(v_data, E_VECTOR_DATA + left_mark), E_VECTOR_DATA) <= pvt_value) {
  312.             left_mark += E_VECTOR;
  313.         }
  314.         while(Malloc_GetData(Alloc:Malloc_GetData(v_data, E_VECTOR_DATA + right_mark), E_VECTOR_DATA) >= pvt_value && right_mark >= left_mark) {
  315.             right_mark -= E_VECTOR;
  316.         }
  317.  
  318.         if(right_mark < left_mark) {
  319.             done = true;
  320.         } else {
  321.             tmp = Malloc_GetData(v_data, E_VECTOR_DATA + left_mark);
  322.             Malloc_SetData(v_data, E_VECTOR_DATA + left_mark, Malloc_GetData(v_data, E_VECTOR_DATA + right_mark));
  323.             Malloc_SetData(v_data, E_VECTOR_DATA + right_mark, tmp);
  324.         }
  325.     }
  326.  
  327.     tmp = Malloc_GetData(v_data, E_VECTOR_DATA + first);
  328.     Malloc_SetData(v_data, E_VECTOR_DATA + first, Malloc_GetData(v_data, E_VECTOR_DATA + right_mark));
  329.     Malloc_SetData(v_data, E_VECTOR_DATA + right_mark, tmp);
  330.  
  331.     return right_mark;
  332. }
  333.  
  334. stock bool:vector_sort(Vector:vector, order=E_VECTOR_SORT_ASC) {
  335.     if(vector != VECTOR_NULL) {
  336.         new
  337.             Alloc:v_data = Alloc:Malloc_GetData(Alloc:vector, E_VECTOR_DATA),
  338.             v_size = Malloc_GetData(Alloc:vector, E_VECTOR_SIZE);
  339.  
  340.         if(!vector_is_storing_array(vector)) {
  341.             vector_sort_values_helper(v_data, 0, v_size - E_VECTOR);
  342.  
  343.             if(order == E_VECTOR_SORT_DESC) {
  344.                 for(new i = 0, j = v_size - 2; i < j; i += 2, j -= 2) {
  345.                     new
  346.                         tmp = Malloc_GetData(Alloc:Malloc_GetData(v_data, E_VECTOR_DATA + i), E_VECTOR_DATA);
  347.  
  348.                     Malloc_SetData(Alloc:Malloc_GetData(v_data, E_VECTOR_DATA + i), E_VECTOR_DATA, Malloc_GetData(Alloc:Malloc_GetData(v_data, E_VECTOR_DATA + j), E_VECTOR_DATA));
  349.                     Malloc_SetData(Alloc:Malloc_GetData(v_data, E_VECTOR_DATA + j), E_VECTOR_DATA, tmp);
  350.                 }
  351.             }
  352.  
  353.             return true;
  354.         }
  355.     }
  356.  
  357.     return false;
  358. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement