Скачиваний:
4
Добавлен:
01.05.2014
Размер:
3.68 Кб
Скачать
Program GalkaVV;
uses crt;
const MaxCollectionSize = 65520 div SizeOf(Pointer);
type
{**********************************************************}
PStr=^TStr;
TSrt=string;
{**********************************************************}
PObject=^TObject;
TObject=object
constructor Init;
destructor Done; virtual;
end;
{**********************************************************}
TIterator=procedure (AItem: Pointer);
{**********************************************************}
PItemList=^TItemList;
TItemList=array[0..MaxCollectionSize-1] of pointer;
{**********************************************************}
PCollection=^TCollection;
TCollection=object
Items:PItemList;
Delta,Count,Limit: Integer;
constructor Init(ALimit, ADelta: Integer);
destructor Done;
procedure Insert(AItem: Pointer);
procedure AtInsert(AIndex: Integer; AItem: Pointer);
procedure Delete(AItem: pointer);
procedure AtDelete(AIndex: Integer);
function At(AIndex: Integer): Pointer;
procedure ForEach(Iterator:TIterator);
procedure FreeItem(AItem: Pointer); virtual;
end;
{**********************************************************}
PObjCollection=^TObjCollection;
TObjCollection=object (TCollection)
procedure FreeItem(AItem: Pointer); virtual;
end;
{**********************************************************}
PStrCollection=^TStrCollection;
TStrCollection=object (TCollection)
procedure FreeItem(AItem: Pointer); virtual;
procedure PutInOrder(AItem: string);
end;
{**********************************************************}
constructor TObject.Init;
begin
end;

destructor TObject.Done;
begin
end;

procedure TObjCollection.FreeItem(AItem: Pointer);
var
Tmp:PObject;
begin
Tmp:=AItem;
Dispose(Tmp,Done);
end;

constructor TCollection.Init(ALimit, ADelta: Integer);
var
i:integer;
begin
Limit:=ALimit;
Delta:=ADelta;
Count:=0;
GetMem(Items,SizeOf(Pointer)*Limit);
for i:=0 to Limit do Items^[i]:=nil;
end;

destructor TCollection.Done;
var
i:integer;
begin
for i:=0 to Limit do FreeItem(Items^[i]);
FreeMem(Items,SizeOf(Pointer)*Limit);
end;

procedure TCollection.Insert(AItem: Pointer);
var
i:integer;
Tmp:PItemList;
begin
if Count-1>=Limit then
begin
GetMem(Tmp,SizeOf(Pointer)*(Limit+Delta));
for i:=0 to Count-1 do
begin
Tmp^[i]:=Items^[i];
end;
FreeMem(Items,SizeOf(Pointer)*Limit);
Items:=Tmp;
Limit:=Limit+Delta;
end
else
begin
Items^[Count]:=AItem;
inc(Count);
end;
end;

procedure TCollection.AtInsert(AIndex: Integer; AItem: Pointer);
var
i:integer;
Tmp:PItemList;
begin
if Count-1>=Limit then
begin
GetMem(Tmp,SizeOf(Pointer)*(Limit+Delta));
for i:=0 to Count-1 do
begin
Tmp^[i]:=Items^[i];
end;
FreeMem(Items,SizeOf(Pointer)*Limit);
Items:=Tmp;
Limit:=Limit+Delta;
end
else
begin
inc(Count);
for i:=AIndex to Count-1 do Items^[Count-1-i]:=Items^[Count-i];
Items^[AIndex]:=AItem;
end;
end;

procedure TCollection.Delete(AItem: pointer);
var
i:integer;
begin
for i:=0 to Count-1 do
if AItem=Items^[i] then AtDelete(i);
end;

procedure TCollection.AtDelete(AIndex: Integer);
var
i:integer;
begin
FreeItem(Items^[AIndex]);
for i:=AIndex to Count-2 do
begin
Items^[i]:=Items^[i+1];
end;
dec(Count);
end;

function TCollection.At(AIndex: Integer): Pointer;
begin
At:=Items^[AIndex];
end;

procedure TCollection.FreeItem;
begin
end;

procedure TCollection.ForEach(Iterator:TIterator);
var
i:integer;
begin
for i:=0 to Count-1 do Iterator(Items^[i]);
end;


begin

end.
Соседние файлы в папке Вопросы к экзамену с ответами и демо-программами на Паскале