[fpc-devel] for-in-index loop

Mattias Gaertner nc-gaertnma at netcologne.de
Fri Jan 25 10:52:21 CET 2013


Michael Schnell <mschnell at lumino.de> hat am 25. Januar 2013 um 10:35
geschrieben:

>  On 01/23/2013 12:54 AM, vrt277 wrote:
>
>      > >      Hi FPC team,
> >
> >      There is good proposed extension of for-in loop on fpc wiki: get
> > enumerator Position if available
> > <http://wiki.freepascal.org/for-in_loop#Proposed_extensions> . From my point
> > of view it's essential part of iterators. E specially for data structures
> > which store pairs of key and value associated with key.

The above UTF8 example misses some points. Often you need the index and often
you need the byte position.
This can be remedied with an enumerator using a record:

type
  TUTF8Enummy = record
    c: UTF8Char;
    ByteIndex: SizeInt;
    UTF8Index: SizeInt;
  end;

  TUTF8StringEnumerator = class
  ...
  public
    constructor Create(const A: UTF8String);
    function Current: TUTF8Enummy;
    function MoveNext: Boolean;
  end;
  ...

var
  s: UTF8String;
  ch: UTF8Char;
begin
  for ch in s do
    Writeln(ch.UTF8Index, ': ', ch.c,' at byte ',ch.ByteIndex);
end.

The compiler already supports such constructs.
It seems this is even more powerful and useful than the proposed 'index'
extension.

Mattias



More information about the fpc-devel mailing list