Browse Source

* Add IsType with aEmptyAsAnyType param

Michaël Van Canneyt 8 months ago
parent
commit
26b6d0223e
1 changed files with 15 additions and 0 deletions
  1. 15 0
      packages/rtl-objpas/src/inc/rtti.pp

+ 15 - 0
packages/rtl-objpas/src/inc/rtti.pp

@@ -246,12 +246,14 @@ type
     function GetArrayElement(AIndex: SizeInt): TValue;
     function GetArrayElement(AIndex: SizeInt): TValue;
     procedure SetArrayElement(AIndex: SizeInt; constref AValue: TValue);
     procedure SetArrayElement(AIndex: SizeInt; constref AValue: TValue);
     function IsType(aTypeInfo: PTypeInfo): boolean; inline;
     function IsType(aTypeInfo: PTypeInfo): boolean; inline;
+    function IsType(aTypeInfo: PTypeInfo; const EmptyAsAnyType: Boolean) : Boolean;
     function IsInstanceOf(aClass : TClass): boolean; inline;
     function IsInstanceOf(aClass : TClass): boolean; inline;
     function TryCast(aTypeInfo: PTypeInfo; out aResult: TValue; const aEmptyAsAnyType: Boolean = True): Boolean;
     function TryCast(aTypeInfo: PTypeInfo; out aResult: TValue; const aEmptyAsAnyType: Boolean = True): Boolean;
     function Cast(aTypeInfo: PTypeInfo; const aEmptyAsAnyType: Boolean = True): TValue; overload;
     function Cast(aTypeInfo: PTypeInfo; const aEmptyAsAnyType: Boolean = True): TValue; overload;
 {$ifndef NoGenericMethods}
 {$ifndef NoGenericMethods}
     generic function Cast<T>(const aEmptyAsAnyType: Boolean = True): TValue; overload;
     generic function Cast<T>(const aEmptyAsAnyType: Boolean = True): TValue; overload;
     generic function IsType<T>: Boolean; inline;
     generic function IsType<T>: Boolean; inline;
+    generic function IsType<T>(const EmptyAsAnyType: Boolean) : Boolean; inline;
     generic function AsType<T>(const aEmptyAsAnyType: Boolean = True): T;
     generic function AsType<T>(const aEmptyAsAnyType: Boolean = True): T;
     generic function TryAsType<T>(out aResult: T; const aEmptyAsAnyType: Boolean = True): Boolean; inline;
     generic function TryAsType<T>(out aResult: T; const aEmptyAsAnyType: Boolean = True): Boolean; inline;
 {$endif}
 {$endif}
@@ -2324,6 +2326,11 @@ begin
   Result := IsType(PTypeInfo(System.TypeInfo(T)));
   Result := IsType(PTypeInfo(System.TypeInfo(T)));
 end;
 end;
 
 
+generic function TValue.IsType<T>(const EmptyAsAnyType : Boolean):Boolean;
+begin
+  Result := IsType(PTypeInfo(System.TypeInfo(T)),EmptyAsAnyType);
+end;
+
 generic class procedure TValue.Make<T>(const AValue: T; out Result: TValue);
 generic class procedure TValue.Make<T>(const AValue: T; out Result: TValue);
 begin
 begin
   TValue.Make(@AValue, PTypeInfo(System.TypeInfo(T)), Result);
   TValue.Make(@AValue, PTypeInfo(System.TypeInfo(T)), Result);
@@ -2351,6 +2358,14 @@ begin
   result := ATypeInfo = TypeInfo;
   result := ATypeInfo = TypeInfo;
 end;
 end;
 
 
+function TValue.IsType(ATypeInfo: PTypeInfo; const EmptyAsAnyType : Boolean): boolean;
+begin
+  Result:=IsEmpty;
+  if Not Result then
+    result := ATypeInfo = TypeInfo;
+end;
+
+
 class procedure TValue.Make(AValue: NativeInt; ATypeInfo: PTypeInfo; out Result: TValue);
 class procedure TValue.Make(AValue: NativeInt; ATypeInfo: PTypeInfo; out Result: TValue);
 begin
 begin
   TValue.Make(@AValue, ATypeInfo, Result);
   TValue.Make(@AValue, ATypeInfo, Result);