mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-19 07:39:19 +02:00
Format source code using clang-format
This commit is contained in:
231
Names.cpp
231
Names.cpp
@@ -31,137 +31,146 @@ Obiekty sortowane wg nazw, mo
|
||||
|
||||
*/
|
||||
|
||||
void __fastcall ItemRecord::TreeAdd(ItemRecord *r,int c)
|
||||
{//dodanie rekordu do drzewa - ustalenie w której gałęzi
|
||||
//zapisać w (iFlags) ile znaków jest zgodnych z nadrzędnym, żeby nie sprawdzać wszystkich od zera
|
||||
if ((cName[c]&&r->cName[c])?cName[c]==r->cName[c]:false)
|
||||
TreeAdd(r,c+1); //ustawić wg kolejnego znaku, chyba że zero
|
||||
else
|
||||
if ((unsigned char)(cName[c])<(unsigned char)(r->cName[c]))
|
||||
{//zero jest najmniejsze - doczepiamy jako (rNext)
|
||||
if (!rNext) rNext=r;
|
||||
else rNext->TreeAdd(r,0); //doczepić do tej gałęzi
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!rPrev) rPrev=r;
|
||||
else rPrev->TreeAdd(r,0); //doczepić do tej gałęzi
|
||||
}
|
||||
void __fastcall ItemRecord::TreeAdd(ItemRecord *r, int c)
|
||||
{ // dodanie rekordu do drzewa - ustalenie w której gałęzi
|
||||
// zapisać w (iFlags) ile znaków jest zgodnych z nadrzędnym, żeby nie sprawdzać wszystkich od
|
||||
// zera
|
||||
if ((cName[c] && r->cName[c]) ? cName[c] == r->cName[c] : false)
|
||||
TreeAdd(r, c + 1); // ustawić wg kolejnego znaku, chyba że zero
|
||||
else if ((unsigned char)(cName[c]) < (unsigned char)(r->cName[c]))
|
||||
{ // zero jest najmniejsze - doczepiamy jako (rNext)
|
||||
if (!rNext)
|
||||
rNext = r;
|
||||
else
|
||||
rNext->TreeAdd(r, 0); // doczepić do tej gałęzi
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!rPrev)
|
||||
rPrev = r;
|
||||
else
|
||||
rPrev->TreeAdd(r, 0); // doczepić do tej gałęzi
|
||||
}
|
||||
};
|
||||
|
||||
void __fastcall ItemRecord::ListGet(ItemRecord *r,int*&n)
|
||||
{//rekurencyjne wypełnianie posortowanej listy na podstawie drzewa
|
||||
if (rPrev) rPrev->ListGet(r,n); //dodanie wszystkich wcześniejszych
|
||||
*n++=this-r; //dodanie swojego indeksu do tabeli
|
||||
if (rNext) rNext->ListGet(r,n); //dodanie wszystkich późniejszych
|
||||
void __fastcall ItemRecord::ListGet(ItemRecord *r, int *&n)
|
||||
{ // rekurencyjne wypełnianie posortowanej listy na podstawie drzewa
|
||||
if (rPrev)
|
||||
rPrev->ListGet(r, n); // dodanie wszystkich wcześniejszych
|
||||
*n++ = this - r; // dodanie swojego indeksu do tabeli
|
||||
if (rNext)
|
||||
rNext->ListGet(r, n); // dodanie wszystkich późniejszych
|
||||
};
|
||||
|
||||
void* __fastcall ItemRecord::TreeFind(const char *n)
|
||||
{//wyszukanie ciągu (n)
|
||||
ItemRecord *r=TreeFindRecord(n);
|
||||
return r?r->pData:NULL;
|
||||
void *__fastcall ItemRecord::TreeFind(const char *n)
|
||||
{ // wyszukanie ciągu (n)
|
||||
ItemRecord *r = TreeFindRecord(n);
|
||||
return r ? r->pData : NULL;
|
||||
};
|
||||
|
||||
ItemRecord* __fastcall ItemRecord::TreeFindRecord(const char *n)
|
||||
{//wyszukanie ciągu (n)
|
||||
ItemRecord *r=this; //żeby nie robić rekurencji
|
||||
int i=0;
|
||||
do
|
||||
{
|
||||
if (!n[i]) if (!r->cName[i]) return r; //znaleziony
|
||||
if (n[i]==r->cName[i])
|
||||
++i; //porównać kolejny znak
|
||||
else
|
||||
if ((unsigned char)(n[i])<(unsigned char)(r->cName[i]))
|
||||
{
|
||||
i=0; //porównywać od nowa
|
||||
r=r->rPrev; //wcześniejsza gałąź drzewa
|
||||
}
|
||||
else
|
||||
{
|
||||
i=0; //porównywać od nowa
|
||||
r=r->rNext; //późniejsza gałąź drzewa
|
||||
}
|
||||
} while (r);
|
||||
return NULL;
|
||||
ItemRecord *__fastcall ItemRecord::TreeFindRecord(const char *n)
|
||||
{ // wyszukanie ciągu (n)
|
||||
ItemRecord *r = this; //żeby nie robić rekurencji
|
||||
int i = 0;
|
||||
do
|
||||
{
|
||||
if (!n[i])
|
||||
if (!r->cName[i])
|
||||
return r; // znaleziony
|
||||
if (n[i] == r->cName[i])
|
||||
++i; // porównać kolejny znak
|
||||
else if ((unsigned char)(n[i]) < (unsigned char)(r->cName[i]))
|
||||
{
|
||||
i = 0; // porównywać od nowa
|
||||
r = r->rPrev; // wcześniejsza gałąź drzewa
|
||||
}
|
||||
else
|
||||
{
|
||||
i = 0; // porównywać od nowa
|
||||
r = r->rNext; // późniejsza gałąź drzewa
|
||||
}
|
||||
} while (r);
|
||||
return NULL;
|
||||
};
|
||||
|
||||
__fastcall TNames::TNames()
|
||||
{//tworzenie bufora
|
||||
iSize=16*1024*1024; //rozmiar bufora w bajtach
|
||||
cBuffer=new char[iSize];
|
||||
ZeroMemory(cBuffer,iSize); //nie trzymać jakiś starych śmieci
|
||||
rRecords=(ItemRecord*)cBuffer;
|
||||
cLast=cBuffer+iSize; //bajt za buforem
|
||||
iLast=-1;
|
||||
ZeroMemory(rTypes,20*sizeof(ItemRecord*));
|
||||
{ // tworzenie bufora
|
||||
iSize = 16 * 1024 * 1024; // rozmiar bufora w bajtach
|
||||
cBuffer = new char[iSize];
|
||||
ZeroMemory(cBuffer, iSize); // nie trzymać jakiś starych śmieci
|
||||
rRecords = (ItemRecord *)cBuffer;
|
||||
cLast = cBuffer + iSize; // bajt za buforem
|
||||
iLast = -1;
|
||||
ZeroMemory(rTypes, 20 * sizeof(ItemRecord *));
|
||||
};
|
||||
|
||||
int __fastcall TNames::Add(int t,const char *n)
|
||||
{//dodanie obiektu typu (t) o nazwie (n)
|
||||
int len=strlen(n)+1; //ze znacznikiem końca
|
||||
cLast-=len; //rezerwacja miejsca
|
||||
memcpy(cLast,n,len); //przekopiowanie tekstu do bufora
|
||||
//cLast[len-1]='\0';
|
||||
rRecords[++iLast].cName=cLast; //połączenie nazwy z rekordem
|
||||
rRecords[iLast].iFlags=t;
|
||||
if (!rTypes[t])
|
||||
rTypes[t]=rRecords+iLast; //korzeń drzewa, bo nie było wcześniej
|
||||
else
|
||||
rTypes[t]->TreeAdd(rRecords+iLast,0); //doczepienie jako gałąź
|
||||
//rTypes[t]=Sort(t); //sortowanie uruchamiać ręcznie
|
||||
if ((iLast&0x3F)==0) //nie za często, bo sortowania zajmą więcej czasu niż wyszukiwania
|
||||
Sort(t); //optymalizacja drzewa co jakiś czas
|
||||
return iLast;
|
||||
int __fastcall TNames::Add(int t, const char *n)
|
||||
{ // dodanie obiektu typu (t) o nazwie (n)
|
||||
int len = strlen(n) + 1; // ze znacznikiem końca
|
||||
cLast -= len; // rezerwacja miejsca
|
||||
memcpy(cLast, n, len); // przekopiowanie tekstu do bufora
|
||||
// cLast[len-1]='\0';
|
||||
rRecords[++iLast].cName = cLast; // połączenie nazwy z rekordem
|
||||
rRecords[iLast].iFlags = t;
|
||||
if (!rTypes[t])
|
||||
rTypes[t] = rRecords + iLast; // korzeń drzewa, bo nie było wcześniej
|
||||
else
|
||||
rTypes[t]->TreeAdd(rRecords + iLast, 0); // doczepienie jako gałąź
|
||||
// rTypes[t]=Sort(t); //sortowanie uruchamiać ręcznie
|
||||
if ((iLast & 0x3F) == 0) // nie za często, bo sortowania zajmą więcej czasu niż wyszukiwania
|
||||
Sort(t); // optymalizacja drzewa co jakiś czas
|
||||
return iLast;
|
||||
}
|
||||
int __fastcall TNames::Add(int t,const char *n,void *d)
|
||||
int __fastcall TNames::Add(int t, const char *n, void *d)
|
||||
{
|
||||
int i=Add(t,n);
|
||||
rRecords[iLast].pData=d;
|
||||
return i;
|
||||
int i = Add(t, n);
|
||||
rRecords[iLast].pData = d;
|
||||
return i;
|
||||
};
|
||||
|
||||
bool __fastcall TNames::Update(int t,const char *n,void *d)
|
||||
{//dodanie jeśli nie ma, wymiana (d), gdy jest
|
||||
ItemRecord *r=FindRecord(t,n); //najpierw sprawdzić, czy już jest
|
||||
if (r)
|
||||
{//przy zdublowaniu nazwy podmieniać w drzewku na późniejszy
|
||||
r->pData=d;
|
||||
return true; //duplikat
|
||||
}
|
||||
//Add(t,n,d); //nazwa unikalna
|
||||
return false; //został dodany nowy
|
||||
bool __fastcall TNames::Update(int t, const char *n, void *d)
|
||||
{ // dodanie jeśli nie ma, wymiana (d), gdy jest
|
||||
ItemRecord *r = FindRecord(t, n); // najpierw sprawdzić, czy już jest
|
||||
if (r)
|
||||
{ // przy zdublowaniu nazwy podmieniać w drzewku na późniejszy
|
||||
r->pData = d;
|
||||
return true; // duplikat
|
||||
}
|
||||
// Add(t,n,d); //nazwa unikalna
|
||||
return false; // został dodany nowy
|
||||
};
|
||||
|
||||
ItemRecord* __fastcall TNames::TreeSet(int *n,int d,int u)
|
||||
{//rekurencyjne wypełnianie drzewa pozycjami od (d) do (u)
|
||||
if (d==u)
|
||||
{
|
||||
rRecords[n[d]].rPrev=rRecords[n[d]].rNext=NULL;
|
||||
return rRecords+n[d]; //tej gałęzi nie ma
|
||||
}
|
||||
else if (d>u) return NULL;
|
||||
int p=(u+d)>>1; //połowa
|
||||
rRecords[n[p]].rPrev=TreeSet(n,d,p-1); //zapisanie wcześniejszych gałęzi
|
||||
rRecords[n[p]].rNext=TreeSet(n,p+1,u); //zapisanie późniejszych gałęzi
|
||||
return rRecords+n[p];
|
||||
ItemRecord *__fastcall TNames::TreeSet(int *n, int d, int u)
|
||||
{ // rekurencyjne wypełnianie drzewa pozycjami od (d) do (u)
|
||||
if (d == u)
|
||||
{
|
||||
rRecords[n[d]].rPrev = rRecords[n[d]].rNext = NULL;
|
||||
return rRecords + n[d]; // tej gałęzi nie ma
|
||||
}
|
||||
else if (d > u)
|
||||
return NULL;
|
||||
int p = (u + d) >> 1; // połowa
|
||||
rRecords[n[p]].rPrev = TreeSet(n, d, p - 1); // zapisanie wcześniejszych gałęzi
|
||||
rRecords[n[p]].rNext = TreeSet(n, p + 1, u); // zapisanie późniejszych gałęzi
|
||||
return rRecords + n[p];
|
||||
};
|
||||
|
||||
void __fastcall TNames::Sort(int t)
|
||||
{//przebudowa drzewa typu (t), zwraca wierzchołek drzewa
|
||||
if (iLast<3) return; //jak jest mało, to nie ma sensu sortować
|
||||
if (rTypes[t]) //jeśli jest jakiś rekord danego typu
|
||||
{int *r=new int[iLast+1]; //robocza tablica indeksów - numery posortowanych rekordów
|
||||
int *q=r; //wskaźnik roboczy, przekazywany przez referencję
|
||||
rTypes[t]->ListGet(rRecords,q); //drzewo jest już posortowane - zamienić je na listę
|
||||
rTypes[t]=TreeSet(r,0,(q-r)-1);
|
||||
delete[] r;
|
||||
}
|
||||
return;
|
||||
{ // przebudowa drzewa typu (t), zwraca wierzchołek drzewa
|
||||
if (iLast < 3)
|
||||
return; // jak jest mało, to nie ma sensu sortować
|
||||
if (rTypes[t]) // jeśli jest jakiś rekord danego typu
|
||||
{
|
||||
int *r = new int[iLast + 1]; // robocza tablica indeksów - numery posortowanych rekordów
|
||||
int *q = r; // wskaźnik roboczy, przekazywany przez referencję
|
||||
rTypes[t]->ListGet(rRecords, q); // drzewo jest już posortowane - zamienić je na listę
|
||||
rTypes[t] = TreeSet(r, 0, (q - r) - 1);
|
||||
delete[] r;
|
||||
}
|
||||
return;
|
||||
};
|
||||
|
||||
ItemRecord* __fastcall TNames::FindRecord(const int t,const char *n)
|
||||
{//poszukiwanie rekordu w celu np. zmiany wskaźnika
|
||||
return rTypes[t]?rTypes[t]->TreeFindRecord(n):NULL;
|
||||
ItemRecord *__fastcall TNames::FindRecord(const int t, const char *n)
|
||||
{ // poszukiwanie rekordu w celu np. zmiany wskaźnika
|
||||
return rTypes[t] ? rTypes[t]->TreeFindRecord(n) : NULL;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user