Скачиваний:
10
Добавлен:
01.05.2014
Размер:
4 Кб
Скачать
☆
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.
Соседние файлы в папке Вопросы к экзамену с ответами и демо-программами на Паскале