fpc/tests/test/tforin2.pp
paul aa5a5e79ce merge revisions: 13909,13923,13924,13934,13935,13942,13943,13944,13946,13948,13950,13951,13952,13983,13994:
rtl: add enumerators to the basic classes
tests: add enumerators test which compiles and work both by fpc and dcc
compiler: 
  + start for-in loop implementation: implement for-in loop for types (enumerations and ranges), strings, arrays and sets. todo: perform type checking, optimize array and string loops - use temp for expression, implement for-in loop for classes
test:
  + add a simple test for the 'for-in' loop
compiler: fix string for-in loop. now it uses a temp variable to store string expression result
complier: fix for-in array loop. use a temp variable for the loop expression only if loop is not an open array loop
complier: continue enumerator implementation:
  + add operator enumerator which give an ability to add enumerator for an existent type (for example to override builtin string enumerator)
  + add class enumerator support via delphi compatible GetEnumerator method + enumerator class/object template (function MoveNext: Boolean; property Current)
  + tests
compiler: fix for-in loop for arrays. delphi does not copy arrays to a temp variable and it is possible to change array during loop. + test
compiler: add reference for the enumerator operator when it is used + another test for operator enumerator for a class
compiler: add reference for the enumerator operator when it is used + another test for operator enumerator for a class
compiler: enumerator directive support:
  + allow to mark methods and properties by 'enumerator MoveNext' and 'enumerator Current' modifiers. Parser checks return types and duplicates.
  + prefer *marked* by enumerator directive methods and properties than GetEnumerator and Current builtin symbols
  + increase ppu version
  + test
rtl: add IEnumerator and IEnumerable interfaces declarations
tests: for-in loop tests:
  + add small comment at the top of test program
compiler: allow 'enumerator MoveNext' for the interface function declaration + test
compiler: move all for-in loop helpers to the nflw unit
compiler: don't allow the compiler to choose the non-valid enumerator operator for the for-in loop

git-svn-id: trunk@14008 -
2009-11-02 03:24:48 +00:00

85 lines
1.4 KiB
ObjectPascal

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.