+ add TValue.DataSize property

git-svn-id: trunk@36965 -
This commit is contained in:
svenbarth 2017-08-20 18:23:57 +00:00
parent ceb982930c
commit cd73a46313

View File

@ -65,6 +65,7 @@ type
TValue = record
private
FData: TValueData;
function GetDataSize: SizeInt;
function GetTypeDataProp: PTypeData; inline;
function GetTypeInfo: PTypeInfo; inline;
function GetTypeKind: TTypeKind; inline;
@ -87,6 +88,7 @@ type
function ToString: String;
function IsType(ATypeInfo: PTypeInfo): boolean; inline;
function TryAsOrdinal(out AResult: int64): boolean;
property DataSize: SizeInt read GetDataSize;
property Kind: TTypeKind read GetTypeKind;
property TypeData: PTypeData read GetTypeDataProp;
property TypeInfo: PTypeInfo read GetTypeInfo;
@ -573,6 +575,89 @@ begin
result := GetTypeData(FData.FTypeInfo);
end;
function TValue.GetDataSize: SizeInt;
begin
if IsEmpty then
Result := 0
else if Assigned(FData.FValueData) then
Result := FData.FValueData.GetDataSize
else begin
Result := 0;
case Kind of
tkEnumeration,
tkBool,
tkInt64,
tkQWord,
tkInteger:
case TypeData^.OrdType of
otSByte,
otUByte:
Result := SizeOf(Byte);
otSWord,
otUWord:
Result := SizeOf(Word);
otSLong,
otULong:
Result := SizeOf(LongWord);
otSQWord,
otUQWord:
Result := SizeOf(QWord);
end;
tkChar:
Result := SizeOf(AnsiChar);
tkFloat:
case TypeData^.FloatType of
ftSingle:
Result := SizeOf(Single);
ftDouble:
Result := SizeOf(Double);
ftExtended:
Result := SizeOf(Extended);
ftComp:
Result := SizeOf(Comp);
ftCurr:
Result := SizeOf(Currency);
end;
tkSet:
{ ToDo }
Result := 0;
tkMethod:
{ ? }
Result := SizeOf(TMethod);
tkSString:
Result := SizeOf(ShortString);
tkVariant:
Result := SizeOf(Variant);
tkProcVar:
Result := SizeOf(CodePointer);
tkWChar:
Result := SizeOf(WideChar);
tkUChar:
Result := SizeOf(UnicodeChar);
tkFile:
{ ToDo }
Result := SizeOf(TTextRec);
tkClass,
tkHelper,
tkClassRef,
tkPointer:
Result := SizeOf(Pointer);
tkUnknown,
tkLString,
tkAString,
tkWString,
tkUString,
tkObject,
tkArray,
tkRecord,
tkInterface,
tkDynArray,
tkInterfaceRaw:
Assert(False);
end;
end;
end;
function TValue.GetTypeInfo: PTypeInfo;
begin
result := FData.FTypeInfo;