program test2;
{$mode objfpc}
{$modeswitch advancedrecords}
uses
SysUtils;
type
TMyManagedRec = record
Field1: Integer;
Field2: Single;
class operator Initialize(var r: TMyManagedRec);
class operator Copy(constref aSrc: TMyManagedRec; var aDst: TMyManagedRec);
end;
generic TGenericRec<T> = record
SomeField: Integer;
GenField: T;
end;
TMyRecSpec = specialize TGenericRec<TMyManagedRec>;
class operator TMyManagedRec.Initialize(var r: TMyManagedRec);
begin
r.Field1 := 101;
r.Field2 := 2.5;
end;
class operator TMyManagedRec.Copy(constref aSrc: TMyManagedRec; var aDst: TMyManagedRec);
begin
if @aSrc <> @aDst then
begin
aDst.Field1 := aSrc.Field1 + 100;
aDst.Field2 := aSrc.Field2 + 4.1;
end;
end;
var
MyRec, MyRec2: TMyRecSpec;
begin
if IsManagedType(TMyRecSpec) then
begin
WriteLn('Yes, it is managed type...');
WriteLn('MyRec.GenField.Field1 = ', MyRec.GenField.Field1);
WriteLn('MyRec.GenField.Field2 = ', MyRec.GenField.Field2);
WriteLn('MyRec2.GenField.Field1 = ', MyRec2.GenField.Field1);
WriteLn('MyRec2.GenField.Field2 = ', MyRec2.GenField.Field2);
MyRec2 := MyRec;
WriteLn('MyRec2.GenField.Field1 = ', MyRec2.GenField.Field1);
WriteLn('MyRec2.GenField.Field2 = ', MyRec2.GenField.Field2);
end
else
WriteLn('No, it is not managed type...');
end.