summaryrefslogtreecommitdiff
path: root/fpcsrc/tests/test/tforin2.pp
blob: edd1d7ca805312614c2e830cfe7bbbfc5bbabe32 (plain)
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
program tforin2;

// test operator Enumerator for the string type and built-in into RTL TStrings enumerator

{$mode objfpc}{$H+}
{$apptype console}
uses
  Classes;

type
  { TStringEnumerator }

  TStringEnumerator = class // reverse enumerator
  private
    FString: String;
    FIndex: Integer;
    function GetCurrent: Char; inline;
  public
    constructor Create(AString: String);
    function MoveNext: Boolean;
    property Current: Char read GetCurrent;
  end;

{ TStringEnumerator }

function TStringEnumerator.GetCurrent: Char;
begin
  Result := FString[FIndex];
end;

constructor TStringEnumerator.Create(AString: String);
begin
  inherited Create;
  FString := AString;
  FIndex := Length(FString) + 1;
end;

function TStringEnumerator.MoveNext: Boolean;
begin
  dec(FIndex);
  Result := FIndex > 0;
end;

// define an operator for the string type
operator enumerator (const s: string): TStringEnumerator;inline;
begin
  Result := TStringEnumerator.Create(s);
end;

procedure LoopString(s: string);

  function getstring(s: string): string;
  begin
    result:=s;
  end;

var
  c: char;
begin
  // check loop in string. output is 'tset' for the string 'test' :)
  for c in getstring(s) do
    write(c);
  WriteLn;
end;

procedure LoopClass;
var
  L: TStringList;
  S: String;
begin
  L := TStringList.Create;
  L.Add('1');
  L.Add('2');
  L.Add('3');
  for S in L do
    WriteLn(S);
  L.Free;
end;

begin
  LoopString('test');
  LoopClass;
end.