Browse Source

rtl: typinfo: added GetEnumName, GetEnumValue, GetEnumNameCount

mattias 6 years ago
parent
commit
aabb2c66cf
1 changed files with 40 additions and 0 deletions
  1. 40 0
      packages/rtl/typinfo.pas

+ 40 - 0
packages/rtl/typinfo.pas

@@ -394,6 +394,10 @@ function GetEnumProp(Instance: TObject; const PropName: String): String;
 function GetEnumProp(Instance: TObject; const PropInfo: TTypeMemberProperty): String;
 function GetEnumProp(Instance: TObject; const PropInfo: TTypeMemberProperty): String;
 procedure SetEnumProp(Instance: TObject; const PropName: String; const Value: String);
 procedure SetEnumProp(Instance: TObject; const PropName: String; const Value: String);
 procedure SetEnumProp(Instance: TObject; const PropInfo: TTypeMemberProperty; const Value: String);
 procedure SetEnumProp(Instance: TObject; const PropInfo: TTypeMemberProperty; const Value: String);
+// Auxiliary routines, which may be useful
+function GetEnumName(TypeInfo: TTypeInfoEnum; Value: Integer): String;
+function GetEnumValue(TypeInfo: TTypeInfoEnum; const Name: string): Longint;
+function GetEnumNameCount(TypeInfo: TTypeInfoEnum): Longint;
 
 
 function GetSetProp(Instance: TObject; const PropName: String): String; overload;
 function GetSetProp(Instance: TObject; const PropName: String): String; overload;
 function GetSetProp(Instance: TObject; const PropInfo: TTypeMemberProperty): String; overload;
 function GetSetProp(Instance: TObject; const PropInfo: TTypeMemberProperty): String; overload;
@@ -1032,6 +1036,42 @@ begin
     SetJSValueProp(Instance,PropInfo,n);
     SetJSValueProp(Instance,PropInfo,n);
 end;
 end;
 
 
+function GetEnumName(TypeInfo: TTypeInfoEnum; Value: Integer): String;
+begin
+  Result:=TypeInfo.EnumType.IntToName[Value];
+end;
+
+function GetEnumValue(TypeInfo: TTypeInfoEnum; const Name: string): Longint;
+begin
+  Result:=TypeInfo.EnumType.NameToInt[Name];
+end;
+
+function GetEnumNameCount(TypeInfo: TTypeInfoEnum): Longint;
+var
+  o: TJSObject;
+  l, r: LongInt;
+begin
+  o:=TJSObject(TypeInfo.EnumType);
+  // as of pas2js 1.0 the RTTI does not contain a min/max value
+  // -> use exponential search
+  // ToDo: adapt this once enums with gaps are supported
+  Result:=1;
+  while o.hasOwnProperty(String(JSValue(Result))) do
+    Result:=Result*2;
+  l:=Result div 2;
+  r:=Result;
+  while l<=r do
+    begin
+    Result:=(l+r) div 2;
+    if o.hasOwnProperty(String(JSValue(Result))) then
+      l:=Result+1
+    else
+      r:=Result-1;
+    end;
+  if o.hasOwnProperty(String(JSValue(Result))) then
+    inc(Result);
+end;
+
 function GetSetProp(Instance: TObject; const PropName: String): String;
 function GetSetProp(Instance: TObject; const PropName: String): String;
 begin
 begin
   Result:=GetSetProp(Instance,FindPropInfo(Instance,PropName));
   Result:=GetSetProp(Instance,FindPropInfo(Instance,PropName));