From d98e5518820785693b02d8094a0745ab48407f59 Mon Sep 17 00:00:00 2001
From: svenbarth <pascaldragon@googlemail.com>
Date: Mon, 25 Nov 2019 21:13:37 +0000
Subject: [PATCH] + add a generic variant of TValue.IsType * extended test

git-svn-id: trunk@43591 -
---
 packages/rtl-objpas/src/inc/rtti.pp      | 10 ++++++++
 packages/rtl-objpas/tests/tests.rtti.pas | 29 ++++++++++++++++++++++++
 2 files changed, 39 insertions(+)

diff --git a/packages/rtl-objpas/src/inc/rtti.pp b/packages/rtl-objpas/src/inc/rtti.pp
index 9572060fd7..f3b0c78c00 100644
--- a/packages/rtl-objpas/src/inc/rtti.pp
+++ b/packages/rtl-objpas/src/inc/rtti.pp
@@ -144,6 +144,9 @@ type
     function GetArrayElement(AIndex: SizeInt): TValue;
     procedure SetArrayElement(AIndex: SizeInt; constref AValue: TValue);
     function IsType(ATypeInfo: PTypeInfo): boolean; inline;
+{$ifndef NoGenericMethods}
+    generic function IsType<T>: Boolean; inline;
+{$endif}
     function TryAsOrdinal(out AResult: int64): boolean;
     function GetReferenceToRawData: Pointer;
     procedure ExtractRawData(ABuffer: Pointer);
@@ -1856,6 +1859,13 @@ begin
   result := ATypeInfo = TypeInfo;
 end;
 
+{$ifndef NoGenericMethods}
+generic function TValue.IsType<T>: Boolean;
+begin
+  Result := IsType(PTypeInfo(System.TypeInfo(T)));
+end;
+{$endif}
+
 function TValue.AsObject: TObject;
 begin
   if IsObject or (IsClass and not Assigned(FData.FAsObject)) then
diff --git a/packages/rtl-objpas/tests/tests.rtti.pas b/packages/rtl-objpas/tests/tests.rtti.pas
index 2993eb7ac3..30f6081627 100644
--- a/packages/rtl-objpas/tests/tests.rtti.pas
+++ b/packages/rtl-objpas/tests/tests.rtti.pas
@@ -48,6 +48,8 @@ type
     procedure TestGetIsReadable;
     procedure TestIsWritable;
 
+    procedure TestIsType;
+
     procedure TestMakeNil;
     procedure TestMakeObject;
     procedure TestMakeArrayDynamic;
@@ -839,6 +841,33 @@ begin
   end;
 end;
 
+procedure TTestCase1.TestIsType;
+type
+  TMyLongInt = type LongInt;
+var
+  v: TValue;
+  l: LongInt;
+  ml: TMyLongInt;
+begin
+  l := 42;
+  ml := 42;
+  TValue.Make(@l, TypeInfo(l), v);
+  Check(v.IsType(TypeInfo(l)));
+  Check(not v.IsType(TypeInfo(ml)));
+  Check(not v.IsType(TypeInfo(String)));
+  Check(v.specialize IsType<LongInt>);
+  Check(not v.specialize IsType<TMyLongInt>);
+  Check(not v.specialize IsType<String>);
+
+  TValue.Make(@ml, TypeInfo(ml), v);
+  Check(v.IsType(TypeInfo(ml)));
+  Check(not v.IsType(TypeInfo(l)));
+  Check(not v.IsType(TypeInfo(String)));
+  Check(v.specialize IsType<TMyLongInt>);
+  Check(not v.specialize IsType<LongInt>);
+  Check(not v.specialize IsType<String>);
+end;
+
 procedure TTestCase1.TestPropGetValueBoolean;
 var
   ATestClass : TTestValueClass;