Advertisement
Bebras

[INC]ArrayList - dynamic arrays

Feb 5th, 2015
296
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 10.28 KB | None | 0 0
  1.  
  2.  
  3.  
  4. #define INVALID_ARRAYLIST_ID            ArrayList:-1
  5.  
  6. static Alloc:gListMemory = NO_ALLOC;
  7.  
  8.  
  9. /**
  10.     <summary>NewArrayList</summary>
  11.     <returns>Naujo ArrayList ID arba INVALID_ARRAYLIST_ID nepavyksu jo sukurti</returns>
  12. */
  13. stock ArrayList:NewArrayList()
  14. {
  15.     new size = 0;
  16.  
  17.     if(gListMemory != NO_ALLOC)
  18.         size = Malloc_SlotSize(gListMemory);
  19.  
  20.     size++;
  21.  
  22.     new Alloc:tmp = malloc(size);
  23.     if(tmp == NO_ALLOC)
  24.     {
  25.         printf("Error. Failed allocating memory.");
  26.         return INVALID_ARRAYLIST_ID;
  27.     }
  28.     for(new i = 0; i < size-1; i++)
  29.     {
  30.         mset(tmp, i, mget(gListMemory, i));
  31.     }
  32.     if(gListMemory != NO_ALLOC)
  33.         free(gListMemory);
  34.  
  35.     gListMemory = tmp;
  36.  
  37.     mset(gListMemory, size-1, 0);
  38.     return ArrayList:(size-1);
  39. }
  40.  
  41.  
  42. /**
  43.     <summary>ArrayListAdd</summary>
  44.     <param name="ArrayList:id">ArrayList ID į kurį bus pridėta vertė</param>
  45.     <param name="value">vertė kuri bus pridėta</param>
  46.     <returns>Įrašytos vertės indeksą arba -1 nepavykus įrašyti</returns>
  47. */
  48. stock ArrayListAdd(ArrayList:id, value)
  49. {
  50.     if(!IsValidArrayList(id))
  51.         return -1;
  52.     new Alloc:array = Alloc:mget(gListMemory, id),
  53.         size = 0;
  54.     if(array != NO_ALLOC)
  55.         size = Malloc_SlotSize(array);
  56.  
  57.     size++;
  58.     new Alloc:tmp = malloc(size);
  59.     if(tmp == NO_ALLOC)
  60.     {
  61.         printf("Error. Failed allocating memory.");
  62.         return -1;
  63.     }
  64.  
  65.     for(new i = 0; i < size-1; i++)
  66.         mset(tmp, i, mget(array, i));
  67.  
  68.     if(array != NO_ALLOC)
  69.         free(array);
  70.  
  71.     mset(tmp, size-1, value);
  72.     mset(gListMemory, id, _:tmp);
  73.     return size-1;
  74. }
  75. /**
  76.     <summary>ArrayListAddS</summary>
  77.     <param name="ArrayList:id">ArrayList ID į kurį bus pridėta vertė</param>
  78.     <param name="value[]">String vertė kuri bus pridėta</param>
  79.     <returns>Įrašyto string pradžios indeksą arba -1 nepavykus įrašyti</returns>
  80. */
  81. stock ArrayListAddS(ArrayList:id, value[])
  82. {
  83.     if(!IsValidArrayList(id))
  84.         return -1;
  85.  
  86.     new Alloc:array = Alloc:mget(gListMemory, id),
  87.         index = Malloc_SlotSize(array);
  88.  
  89.     new size = index + strlen(value) + 1;
  90.     new Alloc:tmp = malloc(size);
  91.     if(tmp == NO_ALLOC)
  92.     {
  93.         print("Error. Failed allocating memory.");
  94.         return -1;
  95.     }
  96.  
  97.     for(new i = 0; i < index; i++)
  98.         mset(tmp, i, mget(array, i));
  99.     if(array != NO_ALLOC)
  100.         free(array);
  101.  
  102.     msets(tmp, index, value);
  103.     mset(gListMemory, id, _:tmp);
  104.     return index;
  105. }
  106.  
  107. /**
  108.     <summary>ArrayListAddA</summary>
  109.     <param name="ArrayList:id">ArrayList ID į kurį bus pridėta vertė</param>
  110.     <param name="value[]">Masyvas kuris bus pridėtas</param>
  111.     <param name="len">Elementų skaičius masyve kuriuos reikia pridėti</param>
  112. <returns>true sėkmingai pridėjus</returns>
  113. */
  114. stock ArrayListAddA(ArrayList:id, array[], len)
  115. {
  116.     for(new i = 0; i < len; i++)
  117.         ArrayListAdd(id, array[ i ]);
  118.     return true;
  119. }
  120.  
  121. /**
  122.     <summary>ArrayListRemove</summary>
  123.     <param name="ArrayList:id">ArrayList ID iš kurio bus pašalinta vertė</param>
  124.     <param name="value">Vertė kuri bus pridėta</param>
  125.     <returns>true sėkmingai pašalinus, false kitais atvejais</returns>
  126.  
  127.     <remarks>Pawn String yra skaičiai, todėl gali dingti raidės. Pvz: pašalinus iš masyvo 65 gali būti pašalinta 'A' raidė</remarks>
  128. */
  129. stock ArrayListRemove(ArrayList:id, value)
  130. {
  131.     if(!IsValidArrayList(id))
  132.         return false;
  133.     if(ArrayListIndexOf(id, value) == -1)
  134.         return false;
  135.  
  136.     new Alloc:list = Alloc:mget(gListMemory, id);
  137.     if(list == NO_ALLOC)
  138.         return false;
  139.  
  140.     for(new i = 0; i < Malloc_SlotSize(list); i++)
  141.     {
  142.         if(mget(list, i) == value)
  143.         {
  144.             new Alloc:tmp = malloc(Malloc_SlotSize(list)-1);
  145.             if(tmp == NO_ALLOC)
  146.             {
  147.                 print("Error. ArrayListRemove : Failed allocating memory.");
  148.                 free(tmp);
  149.                 return false;
  150.             }
  151.             for(new j = 0; j < i; j++)
  152.                 mset(tmp, j, mget(list, j));
  153.  
  154.             for(new j = i+1; j < Malloc_SlotSize(list); j++)
  155.                 mset(tmp, j-1, mget(list, j));
  156.  
  157.             free(list);
  158.             mset(gListMemory, id, tmp);
  159.             return true;
  160.         }
  161.     }
  162.     return false;
  163. }
  164.  
  165. /**
  166.     <summary>ArrayListRemoveAtIndex</summary>
  167.     <param name="ArrayList:id">ArrayList ID iš kurio bus pašalinta vertė</param>
  168.     <param name="index">Vertės indeksas</param>
  169.     <returns>true sėkmingai pašalinus, false kitais atvejais</returns>
  170. */
  171. stock ArrayListRemoveAtIndex(ArrayList:id, index)
  172. {
  173.     if(!IsValidArrayList(id))
  174.         return false;
  175.     if(!IsValidArrayListIndex(id, index))
  176.         return false;
  177.  
  178.     new Alloc:list = Alloc:mget(gListMemory, id),
  179.         Alloc:tmp = malloc(Malloc_SlotSize(list)-1);
  180.     if(list == NO_ALLOC)
  181.         return false;
  182.  
  183.     new count = 0;
  184.     for(new i = 0; i < Malloc_SlotSize(list); i++)
  185.     {
  186.         if(i == index)
  187.             continue;
  188.         mset(tmp, count++, mget(list, i));
  189.     }
  190.     free(list);
  191.     mset(gListMemory, id, tmp);
  192.     return true;
  193. }
  194.  
  195. /**
  196.     <summary>ArrayListGet</summary>
  197.     <param name="ArrayList:id">ArrayList ID iš kurio gauta vertė</param>
  198.     <param name="index">Indeksas iš kurio bus gauta vertė</param>
  199.     <returns>Vertę esančią indekse, 0 - jei tos vertės nėra</returns>
  200. */
  201. stock ArrayListGet(ArrayList:id, index)
  202. {
  203.     if(!IsValidArrayList(id))
  204.         return 0;
  205.     new Alloc:tmp = Alloc:mget(gListMemory, id);
  206.     if(!IsValidArrayListIndex(id, index))
  207.         return 0;
  208.     return mget(tmp, index);
  209. }
  210.  
  211.  
  212. /**
  213.     <summary>ArrayListGetS</summary>
  214.     <param name="ArrayList:id">ArrayList ID iš kurio bus gautas string</param>
  215.     <param name="index">String pradžios indeksas</param>
  216.     <param name="dest[]">Masyvas į kurį bus įrašytas string</param>
  217.     <param name="len">Masyvo dydis</param>
  218.     <returns> - </returns>
  219. */
  220. stock ArrayListGetS(ArrayList:id, index, dest[], len)
  221. {
  222.     if(!IsValidArrayList(id))
  223.         return;
  224.     if(!IsValidArrayListIndex(id, index))
  225.         return;
  226.     mgets(dest, len, Alloc:mget(gListMemory, id), index);
  227. }
  228.  
  229. /**
  230.     <summary>ArrayListSet</summary>
  231.     <param name="ArrayList:id">ArrayList ID kuriame bus pakeista vertė</param>
  232.     <param name="index">Vertės indeksas</param>
  233.     <param name="value">Nauja vertė</param>
  234.     <returns> true - sėkmingai pakeitus vertė, false kitais atvejais</returns>
  235. */
  236. stock ArrayListSet(ArrayList:id, index, value)
  237. {
  238.     if(!IsValidArrayList(id))
  239.         return false;
  240.     if(!IsValidArrayListIndex(id, index))
  241.         return false;
  242.  
  243.     new Alloc:list = Alloc:mget(gListMemory, id);
  244.     if(list == NO_ALLOC)
  245.         return false;
  246.  
  247.     mset(list, index, value);
  248.     return true;
  249. }
  250.  
  251.  
  252. /**
  253.     <summary>ArrayListClear</summary>
  254.     <param name="ArrayList:id">ArrayList ID kuris bus ištuštintas</param>
  255.     <returns> true - sėkmingai ištuštinus ArrayList, false kitais atvejais</returns>
  256.  
  257.     <remarks>Ši funkcija nesunaikina ArrayList, ji tik ištuština jo turinį</remarks>
  258. */
  259. stock ArrayListClear(ArrayList:id)
  260. {
  261.     if(!IsValidArrayList(id))
  262.         return false;
  263.  
  264.     new Alloc:list = mget(gListMemory, _:id);
  265.     if(list == NO_ALLOC)
  266.         return false;
  267.     free(list);
  268.     return true;
  269. }
  270.  
  271.  
  272.  
  273. /**
  274.     <summary>ArrayListIndexOf</summary>
  275.     <param name="ArrayList:id">ArrayList ID kuriame bus ieškoma vertės</param>
  276.     <param name="value">Vertė kurios bus ieškoma</param>
  277.     <returns>Vertės indeksą, -1 jos neradus</returns>
  278. */
  279. stock ArrayListIndexOf(ArrayList:id, value)
  280. {
  281.     if(!IsValidArrayList(id))
  282.         return -1;
  283.  
  284.     new Alloc:tmp = Alloc:mget(gListMemory, id);
  285.     if(tmp == NO_ALLOC)
  286.         return -1;
  287.  
  288.     for(new i = 0; i < Malloc_SlotSize(tmp); i++)
  289.         if(mget(tmp, i) == value)
  290.             return i;
  291.     return -1;
  292. }
  293.  
  294.  
  295.  
  296. /**
  297.     <summary>ArrayListSize</summary>
  298.     <param name="ArrayList:id">ArrayList ID</param>
  299.     <returns>ArrayList dydį</returns>
  300. */
  301. stock ArrayListSize(ArrayList:id)
  302. {
  303.     if(!IsValidArrayList(id))
  304.         return 0;
  305.     return Malloc_SlotSize(Alloc:mget(gListMemory, id));
  306. }
  307.  
  308.  
  309. /**
  310.     <summary>ArrayListIsEmpty</summary>
  311.     <param name="ArrayList:id">ArrayList ID</param>
  312.     <returns>true jei ArrayList tuščias, false kitais atvejais</returns>
  313. */
  314. stock ArrayListIsEmpty(ArrayList:id)
  315. {
  316.     if(!ArrayListSize(id))
  317.         return true;
  318.     else
  319.         return false;
  320. }
  321.  
  322. /**
  323.     <summary>ArrayListIsEmpty</summary>
  324.     <param name="ArrayList:id">ArrayList ID</param>
  325.     <returns>true jei ArrayList ID yra tinkamas, false kitais atvejais</returns>
  326. */
  327. stock IsValidArrayList(ArrayList:id)
  328. {
  329.     if(id < 0 || id >= Malloc_SlotSize(gListMemory) || gListMemory == NO_ALLOC)
  330.         return false;
  331.     else
  332.         return true;
  333. }
  334.  
  335.  
  336. /**
  337.     <summary>ArrayListDestroy</summary>
  338.     <param name="ArrayList:id">ArrayList ID</param>
  339.     <returns>true sėkmingai sunaikinus ArrayList, false kitais atvejais</returns>
  340.  
  341.     <remarks>Sunaikinus ArrayList bus prarastas visas jo turinys</remarks>
  342. */
  343. stock ArrayListDestroy(ArrayList:id)
  344. {
  345.     if(!IsValidArrayList(id))
  346.         return false;
  347.  
  348.     new Alloc:tmp = Malloc_SlotSize(gListMemory)-1;
  349.     if(tmp == NO_ALLOC)
  350.     {
  351.         print("Error. ArrayListDestroy : Failed allocating memory.");
  352.         return false;
  353.     }  
  354.     for(new i = 0; i < Malloc_SlotSize(gListMemory); i++)
  355.     {
  356.         // There is no such arraylist.
  357.         if(i == Malloc_SlotSize(gListMemory))
  358.         {
  359.             free(tmp);
  360.             return false;
  361.         }
  362.         if(mget(gListMemory, i) == id)
  363.             continue;
  364.         else
  365.             mset(tmp, count++, mget(gListMemory, i));
  366.     }
  367.     free(gListMemory);
  368.     gListMemory = tmp;
  369.     return true;
  370. }
  371.  
  372. /**
  373.     <summary>ArrayListMerge</summary>
  374.     <param name="ArrayList:id">Pirmojo ArrayList ID</param>
  375.     <param name="&amp;ArrayList:id2">Antrojo ArrayList ID</param>
  376.     <returns>Naujo ArrayList ID</returns>
  377.  
  378.     <remarks>Sujungto masyvo ID bus lygus pateikto ArrayList ID</remarks>
  379. */
  380. stock ArrayListMerge(ArrayList:id, &ArrayList:id2)
  381. {
  382.     if(!IsValidArrayList(id) || !IsValidArrayList(id2));
  383.         return INVALID_ARRAYLIST_ID;
  384.  
  385.     new Alloc:list = Alloc:mget(gListMemory, id),
  386.         Alloc:list2 = Alloc:mget(gListMemory, id2);
  387.     if(list == NO_ALLOC || list2 == NO_ALLOC)
  388.         return INVALID_ARRAYLIST_ID;
  389.  
  390.     new Alloc:tmp = malloc(Malloc_SlotSize(list) + Malloc_SlotSize(list2));
  391.     if(tmp == NO_ALLOC)
  392.     {
  393.         print("Error. ArrayListMerge : Failed allocating memory.");
  394.         return INVALID_ARRAYLIST_ID;
  395.     }
  396.     new count = 0;
  397.     for(new i = 0; i < Malloc_SlotSize(list); i++)
  398.         msete(tmp, count++, mget(list, i));
  399.     for(new i = 0; i < Malloc_SlotSize(list2); i++)
  400.         msete(tmp, count++, mget(list2, i));
  401.     free(list);
  402.     free(list2);
  403.  
  404.     // Remove second array reference from the list memory
  405.     ArrayListDestroy(id2);
  406.     id2 = INVALID_ARRAYLIST_ID;
  407.  
  408.     // Store new new array instead of id.
  409.     mset(gListMemory, id, tmp);
  410.     return id;
  411. }
  412.  
  413.  
  414. static stock IsValidArrayListIndex(ArrayList:id, index)
  415. {
  416.     if(!IsValidArrayList(id) || index < 0)
  417.         return false;
  418.     new Alloc:tmp = Alloc:mget(gListMemory, id);
  419.     if(tmp == NO_ALLOC || index >= Malloc_SlotSize(tmp))
  420.         return false;
  421.     return true;
  422. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement