Vector type

This commit is contained in:
Michael Schimmel
2025-08-27 15:15:47 +02:00
parent 3daf55a355
commit 644b3fa8fd
4 changed files with 634 additions and 4 deletions
+50
View File
@@ -12,11 +12,61 @@ type
function AsTValue: TValue;
end;
function RttiTypeToDataType(rttiType: TRttiType): TDataType;
implementation
uses
System.TypInfo,
System.Math;
// Recursively converts a TRttiType to an IDataType.
function RttiTypeToDataType(rttiType: TRttiType): TDataType;
var
i: Integer;
begin
// Convert an RTTI type representation to its corresponding IDataType.
case rttiType.TypeKind of
tkInteger, tkInt64, tkChar, tkWChar: Result := TDataType.Ordinal;
tkFloat:
if (rttiType.Handle = TypeInfo(TDateTime)) then
Result := TDataType.Timestamp
else
Result := TDataType.Float;
tkString, tkWideString, tkUString: Result := TDataType.Text;
tkEnumeration:
begin
var enumType := rttiType as TRttiEnumerationType;
var names := enumType.GetNames;
var identifiers: TArray<string>;
SetLength(identifiers, Length(names));
for i := 0 to High(names) do
identifiers[i] := names[i];
Result := TDataType.EnumOf(enumType.Name, identifiers);
end;
tkDynArray:
begin
var arrayType := rttiType as TRttiDynamicArrayType;
Result := TDataType.ArrayOf(RttiTypeToDataType(arrayType.ElementType));
end;
tkRecord:
begin
var recordType := rttiType as TRttiRecordType;
var fields := recordType.GetFields;
var recordFields: TArray<TDataRecordField>;
SetLength(recordFields, Length(fields));
for i := 0 to High(fields) do
recordFields[i] := TDataRecordField.Create(fields[i].Name, RttiTypeToDataType(fields[i].FieldType));
Result := TDataType.RecordOf(recordFields);
end;
else
// Raise an exception for unsupported types.
raise ENotSupportedException.CreateFmt(
'Type "%s" (Kind: %s) is not supported for RTTI-based record creation.',
[rttiType.Name, GetEnumName(TypeInfo(TTypeKind), Ord(rttiType.TypeKind))]);
end;
end;
{ TValueHelper }
function TValueHelper.AsTValue: TValue;