Шаг Файловая коллекция однотипных элементов - часть 2
if (!F.good()) return(0);
F.write((BUF)&head, sizeof(FPTR));
if (!F.good()) return(0);
return(1);
}
FCollect::FCollect(TElem *PROTO)
{
Prototype = PROTO;
}
BOOL FCollect::Create(char *nm, int sz)
{
int id;
Close();
if ((ptr = new FPTR[sz])==NULL) return(0);
size = sz;
ptr[0]=FNULL;
id = Prototype->IDENT();
head = sizeof(int) + sizeof(FPTR);
if (!F.Create(nm)) return(0);
if (!F.Open(nm)) return(0);
F.seekg(0L);
F.write((BUF)&id, sizeof(int));
F.write((BUF)&head, sizeof(FPTR));
if (!F.good()) { F.close(); return(0); }
if (!FArray::Append( F )) return(0);
return(1);
}
BOOL FCollect::Open(char *nm)
{
int id;
Close();
if (!F.Open(nm)) return(0);
F.seekg(0L);
F.read((BUF)&id, sizeof(int));
F.read((BUF)&head, sizeof(FPTR));
if (!F.good()) return(0);
if (!FArray::Load( F , head)) return(0);
if (id !=Prototype->IDENT()) return(0);
return(1);
}
TElem *FCollect::operator[](int n)
{
TElem *pobj;
if (n >=NElem()) return(NULL);
pobj = Prototype->Copy();
if (!pobj->Load( F, ptr[n] ))
{ delete pobj; return(NULL); }
return(pobj);
}
//----- Крайне неэффективный, с постоянной перезагрузкой
// объектов, но тем не менее работающий алгоритм сортировки
// методом "пузырька"
void FCollect::Sort()
{
int k,m;
TElem *p1,*p2;
if ((m = NElem()) < 2) return;
do
{
k = 0; p1 = (*this)[0];
for (int n=1; n < m; n++)
{
p2 = (*this)[n];
if (p1->Compare(p2) ==1)
{
k++;
FPTR tmp;
tmp = ptr[n];
ptr[n] = ptr[n-1];
ptr[n-1] = tmp;
delete p2;
}
else
{
delete p1; p1 = p2;
}
}
}
while (k);
FArray::Update( F,head,0);
}
int FCollect::Insert(TElem *pnew, int indx)
{
FPTR pp;
int n = NElem();
if (ptr ==NULL) return(-1);
if (Prototype->IDENT() != pnew->IDENT()) return(-1);
if (indx ==-1)
{
if ((ptr[n] = pnew->Append(F)) ==FNULL)
return(-1);
ptr[n+1] = FNULL;
indx = n;
}
else
{
if (indx > n) return(-1);
if ((pp = pnew->Append(F)) ==FNULL)
return(-1);
for (int i = n; i >= indx; i--) ptr[i+1] = ptr[i];
ptr[indx] = pp;
}
if (!Expand()) return(-1);
return(indx);
}
BOOL FCollect::Delete(int indx)
{
int n = NElem();
if (ptr==NULL) return(0);
if (indx >= n) return(0);
for (int i=indx; i<n; i++) ptr[i] = ptr[i+1];
return (FArray::Update(F,head,0)!=FNULL);
}