File: tchlp53.pp

package info (click to toggle)
lazarus 2.0.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 214,460 kB
  • sloc: pascal: 1,862,622; xml: 265,709; cpp: 56,595; sh: 3,008; java: 609; makefile: 535; perl: 297; sql: 222; ansic: 137
file content (135 lines) | stat: -rw-r--r-- 2,821 bytes parent folder | download | duplicates (8)
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.