Szerző Téma: dforeach  (Megtekintve 1640 alkalommal)

Nem elérhető DrAkE

  • 2078
    • Profil megtekintése
dforeach
« Dátum: 2014. Július 20. - 23:00:13 »
+2
dforeach
 
Mi ez?
Egy olyan függvénykönyvtár aminek segítségével iteratorokat hozhatsz létre, és kezelheted vele azokat. Maga a könyvtár NAGY MENNYISÉGBEN hasonlít a Y_Less által létrehozott foreach könyvtárra, annyi különbséggel, hogy a foreachben CSAKis az iterator maximális mérettõl kisebb számokat tudsz hozzáadni (pl ha létrehozol egy 100-as méretû iteratort, akkor 0 és 99 között adhatsz hozzá számokat). Ez függvény segítségével nullától nagyobb és 2,147,483,647 kisebb számokat adhattok hozzá. Természetesen a gyorsasága lassabb, hiszen teljesen más elven mûködik.
Miért ez?
Igazság szerint azoknak ajánlom ezen könyvtár használatát, akik tetszõleges számot akarnak hozzáadni az iteratorhoz. Használata természetesen majdnem ugyan az mint a Y_Less által készített foreaché, annyi különbséggel, hogy a funkciók, illetve az iteratorok elé egy \"D\" betût kell rakni. (pl Iter_Add -> DIter_Add).
Ki készítette?
 

/*
*            dforeach 1.0.0
*        All right reserved! ˆ By: DrAkE
*         Freely redistributable.
*
* Owner      : DrAkE
* Time         : 2014.07.17
*
* Thanks to   :
*         Thiadmer - PAWN.
*         SA:MP Team past, present, future - SA:MP.
*/

 
Funkciók
 

* Functions   :
*          DIterator       - Iterator létrehozása (példa: DIterator:test<10>).
*          dforeach       - Iterator értékein való végigfutás.
*          DIter_Add       - Érték hozzáadása az iteratorhoz.
*          DIter_Remove    - Érték eltávolítása az iteratorból.
*          DIter_Count    - Az iteratorban lévõ elemek megszámolása.
*          DIter_Random    - Visszatér egy tetszõleges számmal az iteratorból.
*          DIter_Contain    - Ellenõrzi hogy a megadott szám létezik-e az iteratorban.
*          DIter_Sort       - Iterator csökkenõ, illetve növekvõbe való rendezése.
*          DIter_Clear    - Iterator teljes törlése.

 
Példa használatára
 

new DIterator:teszt<5>;
public OnFilterScriptInit()
{
DIter_Add(teszt, 1);
DIter_Add(teszt, 2);
DIter_Add(teszt, 3);
DIter_Add(teszt, 4);
DIter_Add(teszt, 5);
DIter_Add(teszt, 6);
dforeach(teszt, azigen)
printf(\"Számok: %d\", azigen);
printf(\"Random: %d\", DIter_Random(teszt));
printf(\"Count: %d\", DIter_Count(teszt));
DIter_Sort(teszt, true);
dforeach(teszt, azigen)
printf(\"Sort: %d\", azigen);
DIter_Remove(teszt, 1);
dforeach(teszt, azigen)
printf(\"Törlés után: %d\", azigen);
return true;
}

 
Alap létezõ iteratorok
 

Players - Játékosokat tartalmazza
Bots - NPCket tartalmazza
Characters - Tartalmazza a játékosokat, és az NPCket

 
Letöltés
Klikk ide
Kód
 

/*
*            dforeach 1.0.0
*        All right reserved! ˆ By: DrAkE
*         Freely redistributable.
*
* Owner      : DrAkE
* Time         : 2014.07.17
*
* Thanks to   :
*         Thiadmer - PAWN.
*         SA:MP Team past, present, future - SA:MP.
*
*
* Functions   :
*          DIterator       - Create an iterator (example: DIterator:test<10>).
*          dforeach       - Loop through an iterator.
*          DIter_Add       - Add a value to the iterator.
*          DIter_Remove    - Remove a value from the iterator.
*          DIter_Count    - Count the iterator items.
*          DIter_Random    - Return a random value from the iterator.
*          DIter_Contain    - Check if a value is exists in the iterator.
*          DIter_Sort       - Sort the iterator\'s value.
*          DIter_Clear    - Clear the iterator\'s value.
*
*
* Existing iterators:
*         Players    - Contains only players
*         Bots       - Contains only bots
*         Characters    - Contains both players and bots
*/
#if defined _dfor_included
#endinput
#endif   
#define _dfor_included
#define DIteratorArray:%1<%2> %1[%2]
#define DIteratorSizeof:%1<%2> %2(%1)
#define DIteratorType:%1<%2> %2%1
#define DIteratorVariable:%1<%2> DIteratorType:%1<%2>
#define DIteratorSafeIndex:%1<%2> ((%1<0||%1>=%2)?(0):(%1))
/*
* Name   :
*      DIterator
*
* Type   :
*      Macro
*
* Return:
*      -
*
* Note   :
*      Create an iterator
*/
#define DIterator:%1<%2> DIteratorVariable:_D_ITER_%1__UTOLSO<>=0,DIteratorVariable:_D_ITER_%1__SZAMLAL<>,dIter:DIteratorVariable:_D_ITER_%1__TOMB<>[%2]={dIter:0xFFFFFFFF, ...}
/*
* Name   :
*      dforeach
*
* Type   :
*      Macro
*
* Return:
*      -
*
* Note   :
*      Loop through iterator
*/
#define dforeach(%1,%2) for(new DIteratorVariable:_D_ITER__%1__CIKLUS<>=0xFFFFFFFF,%2=DIteratorArray:_D_ITER_%1__TOMB<0>;((DIteratorVariable:_D_ITER__%1__CIKLUS<++>)<(DIteratorVariable:_D_ITER_%1__SZAMLAL<>))&&((%2=DIteratorArray:_D_ITER_%1__TOMB<(DIteratorSafeIndex:(DIteratorVariable:_D_ITER__%1__CIKLUS<>)<(DIteratorVariable:_D_ITER_%1__SZAMLAL<>)>)>)>0xFFFFFFFF);)
/*
* Name   :
*      DIter_Add (wraps DIter_AddEx)
*
* Type   :
*      Macro
*
* Return:
*      0 - if the last added value is the same
*      1 - if the given value is exists
*      2 - if the iterator is full
*      3 - if the value is added successfully
*
* Note   :
*      Add a given value to the iterator
*/
#define DIter_Add(%1,%2) DIter_AddEx(DIteratorVariable:_D_ITER_%1__TOMB<>,%2,DIteratorVariable:_D_ITER_%1__SZAMLAL<>,.last=DIteratorVariable:_D_ITER_%1__UTOLSO<>)
/*
* Name   :
*      DIter_Remove (wraps DIter_RemoveEx)
*
* Type   :
*      Macro
*
* Return:
*      0 - if the given value not exists
*      1 - if the given value successfully removed
*
* Note   :
*      Remove a given value from the iterator, if it exists
*/
#define DIter_Remove(%1,%2) DIter_RemoveEx(DIteratorVariable:_D_ITER_%1__TOMB<>,%2,DIteratorVariable:_D_ITER_%1__SZAMLAL<>,DIteratorVariable:_D_ITER_%1__UTOLSO<>,DIteratorSizeof:_D_ITER_%1__TOMB<sizeof>)
/*
* Name   :
*      DIter_Count
*
* Type   :
*      Macro
*
* Return:
*      -
*
* Note   :
*      Count the iterator\'s existing value
*/
#define DIter_Count(%1) (DIteratorVariable:_D_ITER_%1__SZAMLAL<>)
/*
* Name   :
*      DIter_Random
*
* Type   :
*      Macro
*
* Return:
*      -
*
* Note   :
*      Return a random number from the iterator
*/
#define DIter_Random(%1) ((DIteratorVariable:_D_ITER_%1__SZAMLAL<>?(_:DIteratorArray:_D_ITER_%1__TOMB<random(DIteratorVariable:_D_ITER_%1__SZAMLAL<>)>):(0xFFFFFFFF)))
/*
* Name   :
*      DIter_Contain
*
* Type   :
*      Macro
*
* Return:
*      -
*
* Note   :
*      Check if the given value is exists in the iterator
*/
#define DIter_Contain(%1,%2) (DIter_FastInArray(DIteratorVariable:_D_ITER_%1__TOMB<>,%2))
//#define DIter_SafeRemove(%1,%2) ((DIteratorArray:_D_ITER_%1__TOMB<(DIteratorVariable:_D_ITER_CIKLUS<>)>==%2?(DIteratorArray:_D_ITER_%1__TOMB<(DIteratorVariable:_D_ITER_CIKLUS<>)>=0xFFFFFFFF,DIter_Remove(%1,%2),DIteratorVariable:_D_ITER_CIKLUS<>--):(1)))
/*
* Name   :
*      DIter_Sort (wraps DIter_SortEx)
*
* Type   :
*      Macro
*
* Return:
*      -
*
* Note   :
*      Sort an iterator
*/
#define DIter_Sort(%1,%2) DIter_SortEx(DIteratorVariable:_D_ITER_%1__TOMB<>,%2,DIteratorVariable:_D_ITER_%1__SZAMLAL<>)
/*
* Name   :
*      DIter_Clear
*
* Type   :
*      Macro
*
* Return:
*      -
*
* Note   :
*      Delete the iterator\'s values
*/
#define DIter_Clear(%1) dforeach(%1,DIteratorVariable:_VALTOZO_%1__I_<>)DIteratorArray:_D_ITER_%1__TOMB<(DIteratorVariable:_D_ITER_CIKLUS<>)>=0xFFFFFFFF,DIter_Remove(%1,DIteratorVariable:_VALTOZO_%1__I_<>)
new
/*
* Name   :
*      DIterator:Players
*
* Size   :
*      MAX_PLAYERS
*
* Type   :
*      Variable
*
* Note   :
*      Create an iterator for the players
*/
DIterator:Players<MAX_PLAYERS>,
/*
* Name   :
*      DIterator:Bots
*
* Size   :
*      MAX_PLAYERS
*
* Type   :
*      Variable
*
* Note   :
*      Create an iterator for the NPCs
*/
DIterator:Bots<MAX_PLAYERS>,
/*
* Name   :
*      DIterator:Characters
*
* Size   :
*      MAX_PLAYERS
*
* Type   :
*      Variable
*
* Note   :
*      Create an iterator for the players and NPCs
*/
DIterator:Characters<MAX_PLAYERS>;
/*
* Name   :
*      DIter_SortEx
*
* Type   :
*      Function
*
* Return:
*      -
*
* Note   :
*      Sort an iterator
*/
stock
DIter_SortEx(dIter:DIteratorArray:iter<>, DIteratorType:ascendant<bool:> = true, DIteratorType:num<> = DIteratorSizeof:iter<sizeof>)
{
new DIteratorVariable:i<> = 0xFFFFFFFF,
DIteratorVariable:j<> = 0xFFFFFFFF,
DIteratorVariable:temp<> = 0xFFFFFFFF;
for(;DIteratorVariable:i<++> < DIteratorVariable:num<>;)
{
for(DIteratorVariable:<>j = (DIteratorVariable:i<> + 1); j < DIteratorVariable:num<>; DIteratorVariable:j<>++)
{
   if((DIteratorVariable:ascendant<>) ? (DIteratorArray:iter<(DIteratorVariable:i<>)> > DIteratorArray:iter<(DIteratorVariable:j<>)>) : (DIteratorArray:iter<(DIteratorVariable:i<>)> < DIteratorArray:iter<(DIteratorVariable:j<>)>))
   {
      DIteratorVariable:temp<> = DIteratorArray:iter<(DIteratorVariable:i<>)>;
      DIteratorArray:iter<(DIteratorVariable:i<>)> = DIteratorArray:iter<(DIteratorVariable:j<>)>;
      DIteratorArray:iter<(DIteratorVariable:j<>)> = dIter:DIteratorVariable:temp<>;
   }
}
}
}
/*
* Name   :
*      DIter_AddEx
*
* Type   :
*      Function
*
* Return:
*      0 - if the last added value is the same
*      1 - if the given value is exists
*      2 - if the iterator is full
*      3 - if the value is added successfully
*
* Note   :
*      Add a given value to the iterator, if it not exists
*/
stock
DIter_AddEx(dIter:DIteratorArray:iter<>, DIteratorType:value<>, DIteratorType:&count<>, DIteratorType:length<> = sizeof(iter), DIteratorType:&last<> = 0)
{
if(DIteratorType:last<> == DIteratorType:value<>)
{
return 0;
}
if(DIter_FastInArray(DIteratorType:iter<>, DIteratorType:value<>, DIteratorType:.size<> = DIteratorType:length<>))
{
return 1;
}
if((DIteratorVariable:length<> == DIteratorVariable:count<>))
{
return 2;
}
DIteratorArray:iter<_:(DIteratorVariable:count++<>)> = dIter:DIteratorType:last<> = dIter:DIteratorVariable:value<>;
return 3;
}
/*
* Name   :
*      DIter_RemoveEx
*
* Type   :
*      Function
*
* Return:
*      0 - if the given value not exists
*      1 - if the given value successfully removed
*
* Note   :
*      Remove a given value from the iterator, if it exists
*/
stock
DIter_RemoveEx(dIter:DIteratorArray:iter<>, DIteratorType:value<>, DIteratorType:&count<>, DIteratorType:&last<> = 0, length = 0xFFFFFFFF)
{
new DIteratorType:index<>;
if(!DIter_FastInArray(DIteratorType:iter<>, DIteratorType:value<>, DIteratorType:index<>, DIteratorType:length<>))
{
return false;
}
new DIteratorVariable:i<> = DIteratorType:index<>;
DIteratorArray:iter<(DIteratorVariable:i<>)> = dIter:0xFFFFFFFF;
if(DIteratorVariable:last<> == DIteratorVariable:value<>)
DIteratorVariable:last<> = 0xFFFFFFFF;
new DIteratorVariable:k<> = DIteratorVariable:i<> - 1;
for(;DIteratorVariable:k<++> < DIteratorVariable:count<> - 1;)
{
DIteratorArray:iter<(DIteratorVariable:k<>)> = DIteratorArray:iter<(DIteratorVariable:k<>) + 1>;
}
DIteratorArray:iter<(DIteratorVariable:length<> - 1)> = dIter:0xFFFFFFFF;
DIteratorVariable:count--<>;
return true;
}
/*
* Name   :
*      DIter_FastInArray
*
* Type   :
*      Function
*
* Return:
*      0 - if the given value is not exists in the iterator
*      1 - if the given value is exists in the iterator
*
* Note   :
*      Search for a given value in the iterator
*/
stock
DIter_FastInArray(dIter:DIteratorArray:iter<>, DIteratorType:elem<>, DIteratorType:&index<> = 0xFFFFFFFF, DIteratorType:size<> = sizeof(iter))
{
new DIteratorType:top<> = (size - 1);
new DIteratorType:bot<> = 0;
new DIteratorType:p<>;
while(DIteratorType:top<> >= DIteratorType:bot<>)
{
DIteratorType:p<> = floatround(((DIteratorType:top<> + DIteratorType:bot<>) / 2), floatround_floor);
if (_:DIteratorArray:iter<(DIteratorVariable:p<>)> < DIteratorType:elem<>)
{
   DIteratorType:bot<> = DIteratorType:p<> + 1;
}
else if (_:DIteratorArray:iter<(DIteratorVariable:p<>)> > DIteratorType:elem<>)
{
   DIteratorType:top<> = DIteratorType:p<> - 1;
}
else
{
   return true;
}
}
return false;
}
/*
* Name   :
*      DIter_OnFilterScriptInit
*
* Type   :
*      OnFilterScriptInit hook
*
* Return:
*      -
*
* Note   :
*      Hook the OnFilterScriptInit
*/
#if defined FILTERSCRIPT
public
OnFilterScriptInit()
{
new
   DIteratorVariable:i<> = 0xFFFFFFFF;
for(;DIteratorVariable:i<++> < MAX_PLAYERS;)
{
   if(IsPlayerConnected(DIteratorVariable:i<>))
   {
      if(IsPlayerNPC(DIteratorVariable:i<>))
      {
         DIter_Add(Bots, DIteratorVariable:i<>);
      }
      else
      {
         DIter_Add(Players, DIteratorVariable:i<>);
      }
      DIter_Add(Characters, DIteratorVariable:i<>);
   }
}
return
   CallLocalFunction(\"DIter_OnFilterScriptInit\", \"\");
}
#if defined _ALS_OnFilterScriptInit
#undef OnFilterScriptInit
#else
#define _ALS_OnFilterScriptInit
#endif
#define OnFilterScriptInit DIter_OnFilterScriptInit
forward DIter_OnFilterScriptInit();
#else
/*
* Name   :
*      DIter_OnGameModeInit
*
* Type   :
*      OnGameModeInit hook
*
* Return:
*      -
*
* Note   :
*      Hook the OnGameModeInit
*/
public
OnGameModeInit()
{
new
   DIteratorVariable:i<> = 0xFFFFFFFF;
for(;DIteratorVariable:i<++> < MAX_PLAYERS;)
{
   if(IsPlayerConnected(DIteratorVariable:i<>))
   {
      if(IsPlayerNPC(DIteratorVariable:i<>))
      {
         DIter_Add(Bots, DIteratorVariable:i<>);
      }
      else
      {
         DIter_Add(Players, DIteratorVariable:i<>);
      }
      DIter_Add(Characters, DIteratorVariable:i<>);
   }
}
return
   CallLocalFunction(\"DIter_OnGameModeInit\", \"\");
}
#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
#define OnGameModeInit DIter_OnGameModeInit
forward DIter_OnGameModeInit();
#endif
/*
* Name   :
*      DIter_OnPlayerConnect
*
* Type   :
*      OnPlayerConnect hook
*
* Return:
*      -
*
* Note   :
*      Hook the OnPlayerConnect
*/
public
OnPlayerConnect(playerid)
{
if(IsPlayerNPC(playerid))
{
DIter_Add(Bots, playerid);
}
else
{
DIter_Add(Players, playerid);
}
DIter_Add(Characters, playerid);
return
CallLocalFunction(\"DIter_OnPlayerConnect\", \"d\", playerid);
}
#if defined _ALS_OnPlayerConnect
#undef OnPlayerConnect
#else
#define _ALS_OnPlayerConnect
#endif
#define OnPlayerConnect DIter_OnPlayerConnect
forward DIter_OnPlayerConnect(playerid);
/*
* Name   :
*      DIter_OnPlayerDisconnect
*
* Type   :
*      OnPlayerDisconnect hook
*
* Return:
*      -
*
* Note   :
*      Hook the OnPlayerDisconnect
*/
public
OnPlayerDisconnect(playerid, reason)
{
if(IsPlayerNPC(playerid))
{
DIter_Remove(Bots, playerid);
}
else
{
DIter_Remove(Players, playerid);
}
DIter_Remove(Characters, playerid);
return
CallLocalFunction(\"DIter_OnPlayerDisconnect\", \"dd\", playerid, reason);
}
#if defined _ALS_OnPlayerDisconnect
#undef OnPlayerDisconnect
#else
#define _ALS_OnPlayerDisconnect
#endif
#define OnPlayerDisconnect DIter_OnPlayerDisconnect
forward DIter_OnPlayerDisconnect(playerid, reason);
« Utoljára szerkesztve: 2014. Július 20. - 23:02:29 írta DrAkE »

dforeach
« Válasz #1 Dátum: 2014. Július 20. - 23:01:33 »
0
Remek munka, szép teljesítmény.
Remélem folytatod a pályafutásodat, DrAkE!
Kár, hogy a nevemet kifelejtetted. Hisz Én adtam az inspirációt és a szikrát ami oly nagy tüzet hagyott maga után.
« Utoljára szerkesztve: 2014. Július 20. - 23:07:36 írta Metaxa »

Nem elérhető lev

dforeach
« Válasz #2 Dátum: 2014. Július 20. - 23:03:24 »
+1
Nagyon yolo, nagyin interator

dforeach
« Válasz #3 Dátum: 2014. Július 20. - 23:24:52 »
0
Én így tudom y_less foreach-inc-ben, hogy elemek számát adjuk meg, nem azt, hogy a számok mekkora intervallumok közt lehetnek.

Nem elérhető DrAkE

  • 2078
    • Profil megtekintése
dforeach
« Válasz #4 Dátum: 2014. Július 20. - 23:45:24 »
0
Hát, nézz bele a forráskódba és rájössz:
 
if (0 <= value < size && array[value] > size)

dforeach
« Válasz #5 Dátum: 2014. Július 21. - 07:33:54 »
0



Idézetet írta: DrAkE date=1405890013\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"49573\" data-ipsquote-contentclass=\"forums_Topic
a gyorsasága lassabb
 
\"wait-what.jpg\"
 


átnézegetem délután :) szép munka.

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal