mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-07 17:28:14 +02:00

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 -
85 lines
1.4 KiB
ObjectPascal
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.
|
|
|