<div dir="ltr"><div dir="ltr"><div>Just wanted to say, I've been playing around with Ryan's github branch that contains this functionality and I'm loving it! It really opens up a ton of interesting possibilities in general, and also a lot of potential for optimization via constant folding for generic containers that wasn't really possible previously. Here's a more "advanced" example I threw together of the kinds of things you can actually do with this (I'm aware the final syntax for the declarations is going to be slightly different, not that it matters really):</div><div><br></div><div><div>program Example;</div><div><br></div><div>{$Mode ObjFPC}{$H+}{$J-}</div><div>{$ModeSwitch AdvancedRecords}</div><div>{$PointerMath On}</div><div><br></div><div>type</div><div>  generic TStaticList<T, const L: PtrUInt, const H: PtrUInt> = record</div><div>  public type</div><div>    TStaticListEnumerator = record</div><div>    public type PT = ^T;</div><div>    strict private</div><div>      FFirst, FLast, FCurrent: PT;</div><div>    public</div><div>      class function Create(var List: TStaticList): TStaticListEnumerator; inline; static;</div><div>      function MoveNext: Boolean; inline;</div><div>      property Current: PT read FCurrent;</div><div>    end;</div><div>  strict private</div><div>    Items: array[L..H] of T;</div><div>  public</div><div>    function Low: PtrUInt; inline;</div><div>    function High: PtrUInt; inline;</div><div>    procedure Initialize; inline;</div><div>    function GetEnumerator: TStaticListEnumerator; inline;</div><div>  end;</div><div><br></div><div>  class function TStaticList.TStaticListEnumerator.Create(var List: TStaticList): TStaticListEnumerator;</div><div>  begin</div><div>    with Result do begin</div><div>      FFirst := @List.Items[L];</div><div>      FLast := @List.Items[H];</div><div>      FCurrent := FFirst - 1;</div><div>    end;</div><div>  end;</div><div><br></div><div>  function TStaticList.TStaticListEnumerator.MoveNext: Boolean;</div><div>  begin</div><div>    Inc(FCurrent);</div><div>    Result := (FFirst <> FLast) and (FCurrent <= FLast);</div><div>  end;</div><div><br></div><div>  function TStaticList.Low: PtrUInt;</div><div>  begin</div><div>    Result := L;</div><div>  end;</div><div><br></div><div>  function TStaticList.High: PtrUInt;</div><div>  begin</div><div>    Result := H;</div><div>  end;</div><div><br></div><div>  procedure TStaticList.Initialize;</div><div>  var I: PtrUInt;</div><div>  begin</div><div>    for I := Low() to High() do Items[I] := T(I);</div><div>  end;</div><div><br></div><div>  function TStaticList.GetEnumerator: TStaticListEnumerator;</div><div>  begin</div><div>    Result := TStaticListEnumerator.Create(Self);</div><div>  end;</div><div><br></div><div>var</div><div>  AsciiList: specialize TStaticList<Char, 33, 126>;</div><div>  P: PChar;</div><div><br></div><div>begin</div><div>  AsciiList.Initialize();</div><div>  for P in AsciiList do Write(P^);</div><div>end.</div></div><div class="gmail_quote"></div></div></div>