unit SharedTypes;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
type
{ SharedClass }
generic SharedClass<T> = interface
function Get: T;
procedure SetValue(AValue: T);
function Assigned: Boolean;
property Value: T read Get write SetValue;
end;
{ TSharedClassInstance }
generic TSharedClassInstance<T> = class(TInterfacedObject, specialize SharedClass<T>)
private
FReference: T;
public
constructor Create(AReference: T);
destructor Destroy; override;
function Get: T; inline;
procedure SetValue(AValue: T); inline;
function Assigned: Boolean; inline;
end;
generic function Shared<T>(AValue: T): specialize SharedClass<T>; inline;
implementation
generic function Shared<T>(AValue: T): specialize SharedClass<T>;
begin
Result := specialize TSharedClassInstance<T>.Create(AValue);
end;
{ TSharedClassInstance }
constructor TSharedClassInstance.Create(AReference: T);
begin
inherited Create;
FReference := AReference;
end;
destructor TSharedClassInstance.destroy;
begin
FReference.Free;
inherited Destroy;
end;
function TSharedClassInstance.Get: T;
begin
Result := FReference;
end;
procedure TSharedClassInstance.SetValue(AValue: T);
begin
FReference := AValue;
end;
function TSharedClassInstance.Assigned: Boolean;
begin
Result := FReference <> nil;
end;
end.