08.10.2013, 17:05
(
Последний раз редактировалось White_116; 02.01.2014 в 09:38.
Причина: Обновил код.
)
Разбавлю тему моей версией всем известного foreach.
Представленная версия не имеет полного функционала оригинальной версии и была по сути написана с 0 ,так как там творится не ведомая хе... (магия), которую я не осилил. Синтаксис идентичен. Отсутствует поддержка многомерных массивов.
Преимуществом является то, что скорость добавления и удаление переменых на порядок выше.
Недостатком можно считать: не отсортированный массив (Приведите хоть один пример кому он нужен) и скорость обработки.
Код:
Пример использования:
9.10.2013 - Оптимизировал код.
Представленная версия не имеет полного функционала оригинальной версии и была по сути написана с 0 ,так как там творится не ведомая хе... (магия), которую я не осилил. Синтаксис идентичен. Отсутствует поддержка многомерных массивов.
Преимуществом является то, что скорость добавления и удаление переменых на порядок выше.
Quote:
W_foreach Iter_Add & Iter_Remove: 101 foreach Iter_Add & Iter_Remove: 597 |
Quote:
W_foreach: 39 foreach: 26 |
pawn Код:
//==============================================================================
// Foreach by White_116
#define Iterator:%0<%1> %0[%1]={-1, ...}, w%0[%1+1]={-1, ...}
#define foreach(new%0:%1) for(new %0=sizeof(%1);(%0=w%1[%0]) != -1;)
#define Iter_Add(%1,%0) Itter_AddInternal(%0,%1,w%1,w%1[sizeof(%1)],sizeof(%1))
#define Iter_Remove(%1,%0) Itter_RemoveInternal(%0,%1,w%1,w%1[sizeof(%1)],sizeof(%1))
//==============================================================================
stock Itter_AddInternal(playerid, ds[] ,sd[], &MAX_k, size)
{
if(-1 < playerid)if(playerid < size)if(MAX_k != playerid)if(ds[playerid] == -1)
{
if(MAX_k != -1) ds[MAX_k]=playerid;
sd[playerid]=MAX_k, MAX_k=playerid;
return 1;
}
return 0;
}
stock Itter_RemoveInternal(playerid, ds[], sd[], &MAX_k, size)
{
if(-1 < playerid)if(playerid < size)if(playerid != MAX_k)
{
if(sd[playerid] != -1)
{
sd[ds[sd[playerid]]=ds[playerid]]=sd[playerid];
return sd[playerid]=ds[playerid]=-1;
}
else if(ds[playerid] != -1)return ds[playerid]=sd[ds[playerid]]=-1;
}
else if((MAX_k=sd[playerid]) != -1)return ds[MAX_k]=-1; else return -1;
return 0;
}
//================= EOS ====================
pawn Код:
public OnFilterScriptInit()
{
new Iterator:Some<MAX_PLAYERS>;
for(new i;i<100;i++)Iter_Add(Some, i*2);
foreach(new f:Some)printf("foreach: %d",f);
for(new i;i<100;i++)Iter_Remove(Some, i*2);
return 1;
}