Type System
This commit is contained in:
@@ -8,7 +8,7 @@ uses
|
||||
|
||||
type
|
||||
// Implements the float data type.
|
||||
TDataFloatType = class(TInterfacedObject, IDataType, IDataFloatType)
|
||||
TImplDataFloatType = class(TInterfacedObject, IDataType, IDataFloatType)
|
||||
strict private
|
||||
class var
|
||||
FSingleton: IDataFloatType;
|
||||
@@ -30,7 +30,7 @@ uses
|
||||
|
||||
type
|
||||
// Implements the float data value.
|
||||
TDataFloatValue = class(TInterfacedObject, IDataValue, IDataFloatValue)
|
||||
TImplDataFloatValue = class(TInterfacedObject, IDataValue, IDataFloatValue)
|
||||
private
|
||||
FValue: Double;
|
||||
public
|
||||
@@ -46,7 +46,7 @@ type
|
||||
end;
|
||||
|
||||
// Special implementation for the value 0.0 (Singleton)
|
||||
TDataFloatValueZero = class(TInterfacedObject, IDataValue, IDataFloatValue)
|
||||
TImplDataFloatValueZero = class(TInterfacedObject, IDataValue, IDataFloatValue)
|
||||
strict private
|
||||
class var
|
||||
FValue: TValue;
|
||||
@@ -59,7 +59,7 @@ type
|
||||
end;
|
||||
|
||||
// Special implementation for NaN (Not a Number) (Singleton)
|
||||
TDataFloatValueNaN = class(TInterfacedObject, IDataValue, IDataFloatValue)
|
||||
TImplDataFloatValueNaN = class(TInterfacedObject, IDataValue, IDataFloatValue)
|
||||
strict private
|
||||
class var
|
||||
FValue: TValue;
|
||||
@@ -71,108 +71,108 @@ type
|
||||
function AsTValue: TValue;
|
||||
end;
|
||||
|
||||
{ TDataFloatValue }
|
||||
{ TImplDataFloatValue }
|
||||
|
||||
constructor TDataFloatValue.Create(const AValue: Double);
|
||||
constructor TImplDataFloatValue.Create(const AValue: Double);
|
||||
begin
|
||||
inherited Create;
|
||||
FValue := AValue;
|
||||
end;
|
||||
|
||||
function TDataFloatValue.GetDataType: IDataType;
|
||||
function TImplDataFloatValue.GetDataType: IDataType;
|
||||
begin
|
||||
Result := TDataFloatType.Singleton;
|
||||
Result := TImplDataFloatType.Singleton;
|
||||
end;
|
||||
|
||||
function TDataFloatValue.GetAsString: string;
|
||||
function TImplDataFloatValue.GetAsString: string;
|
||||
begin
|
||||
Result := FloatToStr(FValue);
|
||||
end;
|
||||
|
||||
function TDataFloatValue.AsTValue: TValue;
|
||||
function TImplDataFloatValue.AsTValue: TValue;
|
||||
begin
|
||||
Result := TValue.From<Double>(FValue);
|
||||
end;
|
||||
|
||||
function TDataFloatValue.GetValue: Double;
|
||||
function TImplDataFloatValue.GetValue: Double;
|
||||
begin
|
||||
Result := FValue;
|
||||
end;
|
||||
|
||||
{ TDataFloatValueZero }
|
||||
{ TImplDataFloatValueZero }
|
||||
|
||||
class constructor TDataFloatValueZero.CreateClass;
|
||||
class constructor TImplDataFloatValueZero.CreateClass;
|
||||
begin
|
||||
FValue := TValue.From<Double>(0.0);
|
||||
end;
|
||||
|
||||
function TDataFloatValueZero.GetAsString: string;
|
||||
function TImplDataFloatValueZero.GetAsString: string;
|
||||
begin
|
||||
Result := '0';
|
||||
end;
|
||||
|
||||
function TDataFloatValueZero.GetDataType: IDataType;
|
||||
function TImplDataFloatValueZero.GetDataType: IDataType;
|
||||
begin
|
||||
Result := TDataFloatType.Singleton;
|
||||
Result := TImplDataFloatType.Singleton;
|
||||
end;
|
||||
|
||||
function TDataFloatValueZero.GetValue: Double;
|
||||
function TImplDataFloatValueZero.GetValue: Double;
|
||||
begin
|
||||
Result := 0.0;
|
||||
end;
|
||||
|
||||
function TDataFloatValueZero.AsTValue: TValue;
|
||||
function TImplDataFloatValueZero.AsTValue: TValue;
|
||||
begin
|
||||
Result := FValue;
|
||||
end;
|
||||
|
||||
{ TDataFloatValueNaN }
|
||||
{ TImplDataFloatValueNaN }
|
||||
|
||||
class constructor TDataFloatValueNaN.CreateClass;
|
||||
class constructor TImplDataFloatValueNaN.CreateClass;
|
||||
begin
|
||||
FValue := TValue.From<Double>(NaN);
|
||||
end;
|
||||
|
||||
function TDataFloatValueNaN.GetAsString: string;
|
||||
function TImplDataFloatValueNaN.GetAsString: string;
|
||||
begin
|
||||
Result := 'NaN';
|
||||
end;
|
||||
|
||||
function TDataFloatValueNaN.GetDataType: IDataType;
|
||||
function TImplDataFloatValueNaN.GetDataType: IDataType;
|
||||
begin
|
||||
Result := TDataFloatType.Singleton;
|
||||
Result := TImplDataFloatType.Singleton;
|
||||
end;
|
||||
|
||||
function TDataFloatValueNaN.GetValue: Double;
|
||||
function TImplDataFloatValueNaN.GetValue: Double;
|
||||
begin
|
||||
Result := NaN;
|
||||
end;
|
||||
|
||||
function TDataFloatValueNaN.AsTValue: TValue;
|
||||
function TImplDataFloatValueNaN.AsTValue: TValue;
|
||||
begin
|
||||
Result := FValue;
|
||||
end;
|
||||
|
||||
{ TDataFloatType }
|
||||
{ TImplDataFloatType }
|
||||
|
||||
class constructor TDataFloatType.CreateClass;
|
||||
class constructor TImplDataFloatType.CreateClass;
|
||||
begin
|
||||
FSingleton := TDataFloatType.Create;
|
||||
FZero := TDataFloatValueZero.Create;
|
||||
FNaN := TDataFloatValueNaN.Create;
|
||||
FSingleton := TImplDataFloatType.Create;
|
||||
FZero := TImplDataFloatValueZero.Create;
|
||||
FNaN := TImplDataFloatValueNaN.Create;
|
||||
end;
|
||||
|
||||
function TDataFloatType.GetName: String;
|
||||
function TImplDataFloatType.GetName: String;
|
||||
begin
|
||||
Result := 'Float';
|
||||
end;
|
||||
|
||||
function TDataFloatType.GetKind: TDataKind;
|
||||
function TImplDataFloatType.GetKind: TDataKind;
|
||||
begin
|
||||
Result := dkFloat;
|
||||
end;
|
||||
|
||||
function TDataFloatType.CreateValue(Init: Double): IDataFloatValue;
|
||||
function TImplDataFloatType.CreateValue(Init: Double): IDataFloatValue;
|
||||
begin
|
||||
// Return singleton instances for 0.0 and NaN to avoid unnecessary allocations.
|
||||
if (Init = 0.0) then
|
||||
@@ -180,7 +180,7 @@ begin
|
||||
else if IsNaN(Init) then
|
||||
Result := FNaN
|
||||
else
|
||||
Result := TDataFloatValue.Create(Init);
|
||||
Result := TImplDataFloatValue.Create(Init);
|
||||
end;
|
||||
|
||||
end.
|
||||
|
||||
Reference in New Issue
Block a user