File: tforin2.pp

package info (click to toggle)
fpc 2.6.4%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 178,760 kB
  • ctags: 83,946
  • sloc: pascal: 2,000,374; xml: 138,807; ansic: 9,617; asm: 7,843; yacc: 3,747; php: 3,271; sh: 2,626; makefile: 2,610; lex: 2,537; sql: 267; cpp: 145; sed: 132; perl: 126; csh: 34; tcl: 7
file content (84 lines) | stat: -rw-r--r-- 1,458 bytes parent folder | download | duplicates (12)
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.