fpc/tests/test/tforin1.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

72 lines
1023 B
ObjectPascal

program tforin1;
// test for-in loop for the basic types: Enumeration, Range, Array, String and Set
{$mode objfpc}{$H+}
{$apptype console}
uses
Classes, typinfo;
type
TColor = (clRed, clGreen, clBlue);
procedure LoopTypes;
type
IntRange = 0..9;
var
c: TColor;
i: integer;
begin
// check loop in range
for i in IntRange do
writeln(i);
// check loop in enum
for c in TColor do
writeln(GetEnumName(TypeInfo(c), ord(c)));
end;
procedure LoopString(s: string);
var
c: char;
begin
// check loop in string
for c in s do
write(c);
WriteLn;
end;
procedure LoopArray(a: array of integer);
var
i: integer;
begin
// check loop in array
for i in a do
write(i);
WriteLn;
end;
procedure LoopSet;
const
s = [clRed, clBlue];
var
c: TColor;
begin
// check loop in set
for c in s do
writeln(GetEnumName(TypeInfo(c), ord(c)));
end;
var
a: array[0..2] of integer;
begin
LoopTypes;
LoopString('test');
a[0]:=0;
a[1]:=1;
a[2]:=2;
LoopArray(a);
LoopSet;
end.