152 lines
3.9 KiB
ObjectPascal
152 lines
3.9 KiB
ObjectPascal
unit Myc.Aura.Parameter;
|
|
|
|
interface
|
|
|
|
type
|
|
TAuraParameterType = (apNone, apInteger, apFloat, apString, apUTC);
|
|
|
|
TAuraParameterValue = record
|
|
private
|
|
FKind: TAuraParameterType;
|
|
FPtr: Pointer;
|
|
function GetAsInteger: Int64;
|
|
procedure SetAsInteger(const Value: Int64);
|
|
procedure SetKind(Kind: TAuraParameterType); inline;
|
|
procedure FreeValue;
|
|
function GetAsFloat: Double;
|
|
function GetAsString: string;
|
|
function GetAsUTC: TDateTime;
|
|
procedure SetAsFloat(const Value: Double);
|
|
procedure SetAsString(const Value: string);
|
|
procedure SetAsUTC(const Value: TDateTime);
|
|
public
|
|
class operator Initialize(out Dest: TAuraParameterValue);
|
|
class operator Finalize(var Dest: TAuraParameterValue);
|
|
class operator Assign(var Dest: TAuraParameterValue; const [ref] Src: TAuraParameterValue);
|
|
property AsInteger: Int64 read GetAsInteger write SetAsInteger;
|
|
property AsFloat: Double read GetAsFloat write SetAsFloat;
|
|
property AsString: string read GetAsString write SetAsString;
|
|
property AsUTC: TDateTime read GetAsUTC write SetAsUTC;
|
|
end;
|
|
|
|
implementation
|
|
|
|
{ TAuraParameterValue }
|
|
|
|
function TAuraParameterValue.GetAsInteger: Int64;
|
|
begin
|
|
SetKind(apInteger);
|
|
if FPtr = nil then
|
|
exit(0);
|
|
Result := Int64(FPtr^);
|
|
end;
|
|
|
|
procedure TAuraParameterValue.SetAsInteger(const Value: Int64);
|
|
begin
|
|
SetKind(apInteger);
|
|
if FPtr = nil then
|
|
GetMem(FPtr, sizeof(Int64));
|
|
Int64(FPtr^) := Value;
|
|
end;
|
|
|
|
procedure TAuraParameterValue.SetKind(Kind: TAuraParameterType);
|
|
begin
|
|
if FKind <> Kind then
|
|
begin
|
|
FreeValue;
|
|
FKind := Kind;
|
|
FPtr := nil;
|
|
end;
|
|
end;
|
|
|
|
class operator TAuraParameterValue.Assign(var Dest: TAuraParameterValue; const [ref] Src: TAuraParameterValue);
|
|
begin
|
|
case Src.FKind of
|
|
apInteger: Dest.AsInteger := Src.AsInteger;
|
|
apFloat: Dest.AsInteger := Src.AsInteger;
|
|
apString: Dest.AsString := Src.AsString;
|
|
apUTC: Dest.AsUTC := Src.AsUTC;
|
|
end;
|
|
end;
|
|
|
|
class operator TAuraParameterValue.Finalize(var Dest: TAuraParameterValue);
|
|
begin
|
|
if Dest.FPtr <> nil then
|
|
FreeMem(Dest.FPtr);
|
|
end;
|
|
|
|
class operator TAuraParameterValue.Initialize(out Dest: TAuraParameterValue);
|
|
begin
|
|
Dest.FPtr := nil;
|
|
Dest.FKind := apInteger;
|
|
end;
|
|
|
|
procedure TAuraParameterValue.FreeValue;
|
|
begin
|
|
if FPtr <> nil then
|
|
begin
|
|
case FKind of
|
|
apInteger, apFloat: FreeMem(FPtr);
|
|
apString:
|
|
begin
|
|
String(FPtr^) := '';
|
|
FreeMem(FPtr);
|
|
end;
|
|
end;
|
|
FPtr := nil;
|
|
end;
|
|
end;
|
|
|
|
function TAuraParameterValue.GetAsFloat: Double;
|
|
begin
|
|
SetKind(apFloat);
|
|
if FPtr = nil then
|
|
exit(0);
|
|
Result := Double(FPtr^);
|
|
end;
|
|
|
|
function TAuraParameterValue.GetAsString: string;
|
|
begin
|
|
SetKind(apString);
|
|
if FPtr = nil then
|
|
exit('');
|
|
Result := String(FPtr^);
|
|
end;
|
|
|
|
function TAuraParameterValue.GetAsUTC: TDateTime;
|
|
begin
|
|
SetKind(apUTC);
|
|
if FPtr = nil then
|
|
exit(0);
|
|
Result := TDateTime(FPtr^);
|
|
end;
|
|
|
|
procedure TAuraParameterValue.SetAsFloat(const Value: Double);
|
|
begin
|
|
SetKind(apFloat);
|
|
if FPtr = nil then
|
|
GetMem(FPtr, sizeof(Double));
|
|
Double(FPtr^) := Value;
|
|
end;
|
|
|
|
procedure TAuraParameterValue.SetAsString(const Value: string);
|
|
begin
|
|
SetKind(apString);
|
|
if FPtr = nil then
|
|
begin
|
|
GetMem(FPtr, sizeof(String));
|
|
FillChar(FPtr^, sizeof(String), 0);
|
|
end;
|
|
String(FPtr^) := Value;
|
|
end;
|
|
|
|
procedure TAuraParameterValue.SetAsUTC(const Value: TDateTime);
|
|
begin
|
|
SetKind(apUTC);
|
|
if FPtr = nil then
|
|
GetMem(FPtr, sizeof(TDateTime));
|
|
TDateTime(FPtr^) := Value;
|
|
end;
|
|
|
|
end.
|