Type System

This commit is contained in:
Michael Schimmel
2025-08-26 11:06:35 +02:00
parent e4681e2bf7
commit 5adbe67d0b
15 changed files with 1426 additions and 612 deletions
+34 -34
View File
@@ -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.