{$mode delphi}
{$rangeChecks on}
type TDataRec = record
level: Byte;
dwell: Double;
function Init:TDataRec;
procedure WriteValues;
end;
function TDataRec.Init;
begin
level:=random(255);
dwell:=level*10;
exit(self);
end;
procedure TDataRec.WriteValues;
begin
WriteLn('level: ',level,' dwell: ',dwell:2:2);
end;
type aos=array of string;
type aoi=array of integer;
type aod=array of TDataRec;
var
TDataRecArray:aod;
a1:aos;
i1:aoi;
tmp:TDataRec;
i:int32;
procedure push<T>(var a :T;index:int32;insertion:T);
begin
insert(insertion,a,index);
end;
procedure pop<T>(var a:T;index:array of int32);
var
i:int32;
begin
for i:=0 to high(index) do delete(a,index[i],1);
end;
begin
a1:=['a','b','c','x','y','z'];
for i:=0 to high(a1) do write(a1[i],' ');
writeln(' original strings');
push<aos>(a1,4,['9','10','11','12']);
for i:=0 to high(a1) do write(a1[i],' ');
writeln(' add 9 10 11 12 at position 4 ');
pop<aos>(a1,[3]);
for i:=0 to high(a1) do write(a1[i],' ');
writeln(' delete position 3');
setlength(TDataRecArray,3);
writeln('objects');
for i:=0 to high(TDataRecArray) do TDataRecArray[i].init;
for i:=0 to high(TDataRecArray) do TDataRecArray[i].WriteValues;
writeln;
push<aod>(TDataRecArray,2,[tmp.init,tmp.init]);
writeln('push another two into position 2');
for i:=0 to high(TDataRecArray) do TDataRecArray[i].WriteValues;
writeln;
writeln('pop the first one');
pop<aod>(TDataRecArray,[0]);
for i:=0 to high(TDataRecArray) do TDataRecArray[i].WriteValues;
writeln;
writeln('integers');
i1:=[random(100),random(100),random(100),random(100)];
for i:=0 to high(i1) do write(i1[i],' ');
writeln;
push<aoi>(i1,3,[5,5,5,5,5,5]);
writeln('push six fives into position 3');
for i:=0 to high(i1) do write(i1[i],' ');
writeln;
pop<aoi>(i1,[0,0,0,0,0,0,0,0,0]);
writeln('pop all but one');
for i:=0 to high(i1) do write(i1[i],' ');
writeln;
writeln('Press return to end . . .');
readln;
end.