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
+78 -78
View File
@@ -8,7 +8,7 @@ uses
type
// Implements the singleton tuple data type.
TDataTupleType = class(TInterfacedObject, IDataType, IDataTupleType)
TImplDataTupleType = class(TInterfacedObject, IDataType, IDataTupleType)
strict private
class var
FSingleton: IDataTupleType;
@@ -28,7 +28,7 @@ uses
type
// Implements the simple tuple data value.
TDataTupleValue = class(TInterfacedObject, IDataValue, IDataTupleValue)
TImplDataTupleValue = class(TInterfacedObject, IDataValue, IDataTupleValue)
private
FItems: TArray<IDataValue>;
function GetDataType: IDataType;
@@ -41,7 +41,7 @@ type
end;
// Optimized singleton implementation for a tuple with 0 elements.
TDataTupleValue0 = class(TInterfacedObject, IDataValue, IDataTupleValue)
TImplDataTupleValue0 = class(TInterfacedObject, IDataValue, IDataTupleValue)
strict private
class var
FSingleton: IDataTupleValue;
@@ -58,7 +58,7 @@ type
end;
// Optimized implementation for a tuple with 1 element.
TDataTupleValue1 = class(TInterfacedObject, IDataValue, IDataTupleValue)
TImplDataTupleValue1 = class(TInterfacedObject, IDataValue, IDataTupleValue)
private
FItem0: IDataValue;
function GetDataType: IDataType;
@@ -71,7 +71,7 @@ type
end;
// Optimized implementation for a tuple with 2 elements.
TDataTupleValue2 = class(TInterfacedObject, IDataValue, IDataTupleValue)
TImplDataTupleValue2 = class(TInterfacedObject, IDataValue, IDataTupleValue)
private
FItem0, FItem1: IDataValue;
function GetDataType: IDataType;
@@ -84,7 +84,7 @@ type
end;
// Optimized implementation for a tuple with 3 elements.
TDataTupleValue3 = class(TInterfacedObject, IDataValue, IDataTupleValue)
TImplDataTupleValue3 = class(TInterfacedObject, IDataValue, IDataTupleValue)
private
FItem0, FItem1, FItem2: IDataValue;
function GetDataType: IDataType;
@@ -97,7 +97,7 @@ type
end;
// Optimized implementation for a tuple with 4 elements.
TDataTupleValue4 = class(TInterfacedObject, IDataValue, IDataTupleValue)
TImplDataTupleValue4 = class(TInterfacedObject, IDataValue, IDataTupleValue)
private
FItem0, FItem1, FItem2, FItem3: IDataValue;
function GetDataType: IDataType;
@@ -110,7 +110,7 @@ type
end;
// Optimized implementation for a tuple with 5 elements.
TDataTupleValue5 = class(TInterfacedObject, IDataValue, IDataTupleValue)
TImplDataTupleValue5 = class(TInterfacedObject, IDataValue, IDataTupleValue)
private
FItem0, FItem1, FItem2, FItem3, FItem4: IDataValue;
function GetDataType: IDataType;
@@ -122,9 +122,9 @@ type
constructor Create(const AItems: array of IDataValue);
end;
{ TDataTupleValue (generic implementation for N > 5 elements) }
{ TImplDataTupleValue (generic implementation for N > 5 elements) }
constructor TDataTupleValue.Create(const AItems: array of IDataValue);
constructor TImplDataTupleValue.Create(const AItems: array of IDataValue);
var
i: Integer;
begin
@@ -134,12 +134,12 @@ begin
FItems[i] := AItems[i];
end;
function TDataTupleValue.GetDataType: IDataType;
function TImplDataTupleValue.GetDataType: IDataType;
begin
Result := TDataTupleType.Singleton;
Result := TImplDataTupleType.Singleton;
end;
function TDataTupleValue.GetAsString: string;
function TImplDataTupleValue.GetAsString: string;
var
sb: TStringBuilder;
i: Integer;
@@ -160,7 +160,7 @@ begin
end;
end;
function TDataTupleValue.AsTValue: TValue;
function TImplDataTupleValue.AsTValue: TValue;
var
tvalueArray: TArray<TValue>;
i: Integer;
@@ -171,66 +171,66 @@ begin
Result := TValue.From<TArray<TValue>>(tvalueArray);
end;
function TDataTupleValue.GetItem(Idx: Integer): IDataValue;
function TImplDataTupleValue.GetItem(Idx: Integer): IDataValue;
begin
Result := FItems[Idx];
end;
function TDataTupleValue.GetItemCount: Integer;
function TImplDataTupleValue.GetItemCount: Integer;
begin
Result := Length(FItems);
end;
{ TDataTupleValue0 }
{ TImplDataTupleValue0 }
class constructor TDataTupleValue0.CreateClass;
class constructor TImplDataTupleValue0.CreateClass;
var
emptyArray: TArray<TValue>;
begin
FSingleton := TDataTupleValue0.Create;
FSingleton := TImplDataTupleValue0.Create;
SetLength(emptyArray, 0);
FEmptyTValue := TValue.From<TArray<TValue>>(emptyArray);
end;
function TDataTupleValue0.GetAsString: string;
function TImplDataTupleValue0.GetAsString: string;
begin
Result := '()';
end;
function TDataTupleValue0.AsTValue: TValue;
function TImplDataTupleValue0.AsTValue: TValue;
begin
Result := FEmptyTValue;
end;
function TDataTupleValue0.GetDataType: IDataType;
function TImplDataTupleValue0.GetDataType: IDataType;
begin
Result := TDataTupleType.Singleton;
Result := TImplDataTupleType.Singleton;
end;
function TDataTupleValue0.GetItem(Idx: Integer): IDataValue;
function TImplDataTupleValue0.GetItem(Idx: Integer): IDataValue;
begin
raise EArgumentException.Create('Index out of bounds');
end;
function TDataTupleValue0.GetItemCount: Integer;
function TImplDataTupleValue0.GetItemCount: Integer;
begin
Result := 0;
end;
{ TDataTupleValue1 }
{ TImplDataTupleValue1 }
constructor TDataTupleValue1.Create(const AItems: array of IDataValue);
constructor TImplDataTupleValue1.Create(const AItems: array of IDataValue);
begin
inherited Create;
FItem0 := AItems[0];
end;
function TDataTupleValue1.GetAsString: string;
function TImplDataTupleValue1.GetAsString: string;
begin
Result := '(' + FItem0.AsString + ')';
end;
function TDataTupleValue1.AsTValue: TValue;
function TImplDataTupleValue1.AsTValue: TValue;
var
tvalueArray: TArray<TValue>;
begin
@@ -239,12 +239,12 @@ begin
Result := TValue.From<TArray<TValue>>(tvalueArray);
end;
function TDataTupleValue1.GetDataType: IDataType;
function TImplDataTupleValue1.GetDataType: IDataType;
begin
Result := TDataTupleType.Singleton;
Result := TImplDataTupleType.Singleton;
end;
function TDataTupleValue1.GetItem(Idx: Integer): IDataValue;
function TImplDataTupleValue1.GetItem(Idx: Integer): IDataValue;
begin
case Idx of
0: Result := FItem0;
@@ -253,26 +253,26 @@ begin
end;
end;
function TDataTupleValue1.GetItemCount: Integer;
function TImplDataTupleValue1.GetItemCount: Integer;
begin
Result := 1;
end;
{ TDataTupleValue2 }
{ TImplDataTupleValue2 }
constructor TDataTupleValue2.Create(const AItems: array of IDataValue);
constructor TImplDataTupleValue2.Create(const AItems: array of IDataValue);
begin
inherited Create;
FItem0 := AItems[0];
FItem1 := AItems[1];
end;
function TDataTupleValue2.GetAsString: string;
function TImplDataTupleValue2.GetAsString: string;
begin
Result := '(' + FItem0.AsString + ', ' + FItem1.AsString + ')';
end;
function TDataTupleValue2.AsTValue: TValue;
function TImplDataTupleValue2.AsTValue: TValue;
var
tvalueArray: TArray<TValue>;
begin
@@ -282,12 +282,12 @@ begin
Result := TValue.From<TArray<TValue>>(tvalueArray);
end;
function TDataTupleValue2.GetDataType: IDataType;
function TImplDataTupleValue2.GetDataType: IDataType;
begin
Result := TDataTupleType.Singleton;
Result := TImplDataTupleType.Singleton;
end;
function TDataTupleValue2.GetItem(Idx: Integer): IDataValue;
function TImplDataTupleValue2.GetItem(Idx: Integer): IDataValue;
begin
case Idx of
0: Result := FItem0;
@@ -297,14 +297,14 @@ begin
end;
end;
function TDataTupleValue2.GetItemCount: Integer;
function TImplDataTupleValue2.GetItemCount: Integer;
begin
Result := 2;
end;
{ TDataTupleValue3 }
{ TImplDataTupleValue3 }
constructor TDataTupleValue3.Create(const AItems: array of IDataValue);
constructor TImplDataTupleValue3.Create(const AItems: array of IDataValue);
begin
inherited Create;
FItem0 := AItems[0];
@@ -312,7 +312,7 @@ begin
FItem2 := AItems[2];
end;
function TDataTupleValue3.GetAsString: string;
function TImplDataTupleValue3.GetAsString: string;
var
sb: TStringBuilder;
begin
@@ -331,7 +331,7 @@ begin
end;
end;
function TDataTupleValue3.AsTValue: TValue;
function TImplDataTupleValue3.AsTValue: TValue;
var
tvalueArray: TArray<TValue>;
begin
@@ -342,12 +342,12 @@ begin
Result := TValue.From<TArray<TValue>>(tvalueArray);
end;
function TDataTupleValue3.GetDataType: IDataType;
function TImplDataTupleValue3.GetDataType: IDataType;
begin
Result := TDataTupleType.Singleton;
Result := TImplDataTupleType.Singleton;
end;
function TDataTupleValue3.GetItem(Idx: Integer): IDataValue;
function TImplDataTupleValue3.GetItem(Idx: Integer): IDataValue;
begin
case Idx of
0: Result := FItem0;
@@ -358,14 +358,14 @@ begin
end;
end;
function TDataTupleValue3.GetItemCount: Integer;
function TImplDataTupleValue3.GetItemCount: Integer;
begin
Result := 3;
end;
{ TDataTupleValue4 }
{ TImplDataTupleValue4 }
constructor TDataTupleValue4.Create(const AItems: array of IDataValue);
constructor TImplDataTupleValue4.Create(const AItems: array of IDataValue);
begin
inherited Create;
FItem0 := AItems[0];
@@ -374,7 +374,7 @@ begin
FItem3 := AItems[3];
end;
function TDataTupleValue4.GetAsString: string;
function TImplDataTupleValue4.GetAsString: string;
var
sb: TStringBuilder;
begin
@@ -395,7 +395,7 @@ begin
end;
end;
function TDataTupleValue4.AsTValue: TValue;
function TImplDataTupleValue4.AsTValue: TValue;
var
tvalueArray: TArray<TValue>;
begin
@@ -407,12 +407,12 @@ begin
Result := TValue.From<TArray<TValue>>(tvalueArray);
end;
function TDataTupleValue4.GetDataType: IDataType;
function TImplDataTupleValue4.GetDataType: IDataType;
begin
Result := TDataTupleType.Singleton;
Result := TImplDataTupleType.Singleton;
end;
function TDataTupleValue4.GetItem(Idx: Integer): IDataValue;
function TImplDataTupleValue4.GetItem(Idx: Integer): IDataValue;
begin
case Idx of
0: Result := FItem0;
@@ -424,14 +424,14 @@ begin
end;
end;
function TDataTupleValue4.GetItemCount: Integer;
function TImplDataTupleValue4.GetItemCount: Integer;
begin
Result := 4;
end;
{ TDataTupleValue5 }
{ TImplDataTupleValue5 }
constructor TDataTupleValue5.Create(const AItems: array of IDataValue);
constructor TImplDataTupleValue5.Create(const AItems: array of IDataValue);
begin
inherited Create;
FItem0 := AItems[0];
@@ -441,7 +441,7 @@ begin
FItem4 := AItems[4];
end;
function TDataTupleValue5.GetAsString: string;
function TImplDataTupleValue5.GetAsString: string;
var
sb: TStringBuilder;
begin
@@ -464,7 +464,7 @@ begin
end;
end;
function TDataTupleValue5.AsTValue: TValue;
function TImplDataTupleValue5.AsTValue: TValue;
var
tvalueArray: TArray<TValue>;
begin
@@ -477,12 +477,12 @@ begin
Result := TValue.From<TArray<TValue>>(tvalueArray);
end;
function TDataTupleValue5.GetDataType: IDataType;
function TImplDataTupleValue5.GetDataType: IDataType;
begin
Result := TDataTupleType.Singleton;
Result := TImplDataTupleType.Singleton;
end;
function TDataTupleValue5.GetItem(Idx: Integer): IDataValue;
function TImplDataTupleValue5.GetItem(Idx: Integer): IDataValue;
begin
case Idx of
0: Result := FItem0;
@@ -495,40 +495,40 @@ begin
end;
end;
function TDataTupleValue5.GetItemCount: Integer;
function TImplDataTupleValue5.GetItemCount: Integer;
begin
Result := 5;
end;
{ TDataTupleType }
{ TImplDataTupleType }
class constructor TDataTupleType.CreateClass;
class constructor TImplDataTupleType.CreateClass;
begin
FSingleton := TDataTupleType.Create;
FSingleton := TImplDataTupleType.Create;
end;
function TDataTupleType.CreateValue(const AItems: array of IDataValue): IDataTupleValue;
function TImplDataTupleType.CreateValue(const AItems: array of IDataValue): IDataTupleValue;
begin
// Use optimized implementations for tuples with 0 to 5 elements.
case Length(AItems) of
0: Result := TDataTupleValue0.Singleton;
1: Result := TDataTupleValue1.Create(AItems);
2: Result := TDataTupleValue2.Create(AItems);
3: Result := TDataTupleValue3.Create(AItems);
4: Result := TDataTupleValue4.Create(AItems);
5: Result := TDataTupleValue5.Create(AItems);
0: Result := TImplDataTupleValue0.Singleton;
1: Result := TImplDataTupleValue1.Create(AItems);
2: Result := TImplDataTupleValue2.Create(AItems);
3: Result := TImplDataTupleValue3.Create(AItems);
4: Result := TImplDataTupleValue4.Create(AItems);
5: Result := TImplDataTupleValue5.Create(AItems);
else
// Use the generic implementation for tuples with more than 5 elements.
Result := TDataTupleValue.Create(AItems);
Result := TImplDataTupleValue.Create(AItems);
end;
end;
function TDataTupleType.GetName: String;
function TImplDataTupleType.GetName: String;
begin
Result := 'Tuple';
end;
function TDataTupleType.GetKind: TDataKind;
function TImplDataTupleType.GetKind: TDataKind;
begin
Result := dkTuple;
end;