{$MODE OBJFPC}
{$LONGSTRINGS ON}
{$MODESWITCH ADVANCEDRECORDS}
{$APPTYPE CONSOLE}
type
TVirtualString = record
strict private
FLength: SizeInt;
FData: PAnsiChar;
procedure CopyFrom(const Src; ALength: SizeInt);
class operator Copy(constref Src: TVirtualString; var Dst: TVirtualString);
class operator Finalize(var Self: TVirtualString);
class operator Initialize(var Self: TVirtualString);
public
class operator := (const S: string): TVirtualString;
function AsString: string;
end;
class operator TVirtualString. := (const S: string): TVirtualString;
begin
Result.CopyFrom(Pointer(S)^, Length(S));
end;
function TVirtualString.AsString: string;
begin
SetString(Result, FData, FLength);
end;
class operator TVirtualString.Copy(constref Src: TVirtualString; var Dst: TVirtualString);
begin
Dst.CopyFrom(Src.FData^, Src.FLength);
end;
class operator TVirtualString.Finalize(var Self: TVirtualString);
begin
ReAllocMem(Self.FData, 0);
Self.FLength := 0;
end;
class operator TVirtualString.Initialize(var Self: TVirtualString);
begin
Self.FLength := 0;
Self.FData := nil;
end;
procedure TVirtualString.CopyFrom(const Src; ALength: SizeInt);
begin
FLength := ALength;
ReAllocMem(FData, FLength);
if FLength > 0 then
Move(Src, FData^, FLength)
end;
// End TVirtualString
function SomeFunction: TVirtualString;
begin
Result := '123';
end;
var
V: TVirtualString;
begin
V := '456';
V := SomeFunction; // As you want
Writeln(V.AsString);
Readln;
end.