[fpc-devel] Generic helpers
    Hairy Pixels 
    genericptr at gmail.com
       
    Mon Jan  9 14:35:14 CET 2023
    
    
  
Hey  guys, I was thinking about how nice generic type helpers would be today and remembered I did a mostly functional branch over 6 months ago so I fixed it up and posted it on gitlab. There’s a nasty merge error with main I need to fix but you can test it anyways.
For the helper type I supported: single types, dynamic arrays, static arrays, sets and classes and records.
Is this acceptable how I did it? I never know. :)
The main strange thing is supported compound types in helper types (like “array of T” or "generic TMyHelper<T> = class helper for specialize TMyClass<T>” for specialized generic classes/records) but I argue these are necessary for the feature to be complete.
https://gitlab.com/genericptr/free-pascal/-/commits/generic_helpers
For example with simple types:
=====================
program tgenhelper1;
type
  generic TMyHelper<T> = type helper for T
    procedure Print;
  end;
  TIntHelper = specialize TMyHelper<Integer>;
procedure TMyHelper.Print;
begin
  writeln(self);
end;
var
  i: integer = 100;
begin
  i.Print;
end.
=====================
Or dynamic arrays:
=====================
program tgenhelper2;
type
  generic TArrayHelper<T> = type helper for array of T
    function Count: integer;
  end;
  TIntegerArrayHelper = specialize TArrayHelper<Integer>;
function TArrayHelper.Count: integer;
begin
  result := Length(self);
end;
var
  a: array of integer;
begin
  a := [1,2,3];
  writeln(a.Count); // array of T is compatible with TIntegerArrayHelper
end.
=====================
Or classes:
=====================
program tgenhelper4;
type
  generic TMyHelper<T: class> = class helper for T
    procedure Print;
  end;
  TObjectHelper = specialize TMyHelper<TObject>;
procedure TMyHelper.Print;
begin
  writeln(ClassName);
end;
var
  c: TObject;
begin
  c := TObject.Create;
  c.Print;
end.
=====================
Regards,
	Ryan Joseph
    
    
More information about the fpc-devel
mailing list