You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

59 lines
1.6 KiB

  1. {$IF defined(__ENUM_INTERFACE)}
  2. type __ENUM_HELPER = class
  3. private type
  4. TValueArray = packed array[0..__ENUM_LENGTH-1] of __ENUM_TYPE;
  5. public
  6. class function {%H}ToString(const Value: __ENUM_TYPE): String; reintroduce;
  7. class function TryToEnum(const Str: String; out Value: __ENUM_TYPE): boolean; overload;
  8. class function ToEnum(const Str: String; const aDefault: __ENUM_TYPE): __ENUM_TYPE; overload;
  9. class function ToEnum(const Str: String): __ENUM_TYPE; overload;
  10. class function Values: TValueArray;
  11. strict private
  12. const TABLE: packed record
  13. E: TValueArray; // array of values
  14. N: AnsiString; // comma-separated string of names
  15. end =
  16. {$ELSEIF defined (__ENUM_IMPLEMENTATION)}
  17. class function __ENUM_HELPER.ToString(const Value: __ENUM_TYPE): String;
  18. var
  19. i: integer;
  20. begin
  21. Result:= '';
  22. if LookupVal(@Value, @TABLE.E, sizeof(__ENUM_TYPE), length(TABLE.E), i) then
  23. Result:= PickString(TABLE.N, i);
  24. end;
  25. class function __ENUM_HELPER.ToEnum(const Str: String): __ENUM_TYPE;
  26. begin
  27. if not TryToEnum(Str, Result) then
  28. raise EConvertErrorAlias.CreateFmt('"%s" is an invalid value',[Str]);
  29. end;
  30. class function __ENUM_HELPER.ToEnum(const Str: String; const aDefault: __ENUM_TYPE): __ENUM_TYPE;
  31. begin
  32. if not TryToEnum(Str, Result) then
  33. Result:= aDefault;
  34. end;
  35. class function __ENUM_HELPER.TryToEnum(const Str: String; out Value: __ENUM_TYPE): boolean;
  36. var
  37. i: integer;
  38. begin
  39. Result:= LookupString(Str, TABLE.N, i);
  40. if Result then
  41. Value:= TABLE.E[i];
  42. end;
  43. class function __ENUM_HELPER.Values: TValueArray;
  44. begin
  45. Result:= TABLE.E;
  46. end;
  47. {$ENDIF}
  48. {$undef __ENUM_TYPE}
  49. {$undef __ENUM_LENGTH}
  50. {$undef __ENUM_HELPER}