1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
{ a helper hides an existing enumerator }
program tchlp53;
{$ifdef fpc}
{$mode delphi}
{$endif}
{$apptype console}
uses
sysutils;
type
TContainerEnum = class;
TContainer = class
Contents: array[0..5] of Integer;
function GetEnumerator: TContainerEnum;
constructor Create;
end;
TContainerEnum = class
private
fIndex: Integer;
fContainer: TContainer;
fForward: Boolean;
public
constructor Create(aContainer: TContainer; aForward: Boolean);
function GetCurrent: Integer;
function MoveNext: Boolean;
property Current: Integer read GetCurrent;
end;
TContainerHelperEnum = class
private
fIndex: Integer;
fContainer: TContainer;
fForward: Boolean;
public
constructor Create(aContainer: TContainer; aForward: Boolean);
function GetCurrent: string;
function MoveNext: Boolean;
property Current: string read GetCurrent;
end;
TContainerHelper = class helper for TContainer
function GetEnumerator: TContainerHelperEnum;
end;
{ TContainerHelperEnum }
constructor TContainerHelperEnum.Create(aContainer: TContainer;
aForward: Boolean);
begin
fContainer := aContainer;
fForward := aForward;
if fForward then
fIndex := Low(fContainer.Contents) - 1
else
fIndex := High(fContainer.Contents) + 1;
end;
function TContainerHelperEnum.GetCurrent: string;
begin
Result := IntToStr(fContainer.Contents[fIndex]);
end;
function TContainerHelperEnum.MoveNext: Boolean;
begin
if fForward then begin
Inc(fIndex);
Result := fIndex <= High(fContainer.Contents);
end else begin
Dec(fIndex);
Result := fIndex >= Low(fContainer.Contents);
end;
end;
{ TContainer }
constructor TContainer.Create;
var
i: Integer;
begin
for i := Low(Contents) to High(Contents) do
Contents[i] := i;
end;
function TContainer.GetEnumerator: TContainerEnum;
begin
Result := TContainerEnum.Create(Self, True);
end;
{ TContainerHelper }
function TContainerHelper.GetEnumerator: TContainerHelperEnum;
begin
Result := TContainerHelperEnum.Create(Self, False);
end;
{ TContainerEnum }
constructor TContainerEnum.Create(aContainer: TContainer; aForward: Boolean);
begin
fContainer := aContainer;
fForward := aForward;
if fForward then
fIndex := Low(fContainer.Contents) - 1
else
fIndex := High(fContainer.Contents) + 1;
end;
function TContainerEnum.GetCurrent: Integer;
begin
Result := fContainer.Contents[fIndex];
end;
function TContainerEnum.MoveNext: Boolean;
begin
if fForward then begin
Inc(fIndex);
Result := fIndex <= High(fContainer.Contents);
end else begin
Dec(fIndex);
Result := fIndex >= Low(fContainer.Contents);
end;
end;
var
cont: TContainer;
begin
cont := TContainer.Create;
for i{guesstype:string} in cont do begin
end;
Writeln('ok');
end.
|