|
- {$IF defined(__ENUM_INTERFACE)}
-
- type __ENUM_HELPER = class
- private type
- TValueArray = packed array[0..__ENUM_LENGTH-1] of __ENUM_TYPE;
- public
- class function {%H}ToString(const Value: __ENUM_TYPE): String; reintroduce;
- class function TryToEnum(const Str: String; out Value: __ENUM_TYPE): boolean; overload;
- class function ToEnum(const Str: String; const aDefault: __ENUM_TYPE): __ENUM_TYPE; overload;
- class function ToEnum(const Str: String): __ENUM_TYPE; overload;
- class function Values: TValueArray;
- strict private
- const TABLE: packed record
- E: TValueArray; // array of values
- N: AnsiString; // comma-separated string of names
- end =
-
- {$ELSEIF defined (__ENUM_IMPLEMENTATION)}
-
- class function __ENUM_HELPER.ToString(const Value: __ENUM_TYPE): String;
- var
- i: integer;
- begin
- Result:= '';
- if LookupVal(@Value, @TABLE.E, sizeof(__ENUM_TYPE), length(TABLE.E), i) then
- Result:= PickString(TABLE.N, i);
- end;
-
- class function __ENUM_HELPER.ToEnum(const Str: String): __ENUM_TYPE;
- begin
- if not TryToEnum(Str, Result) then
- raise EConvertErrorAlias.CreateFmt('"%s" is an invalid value',[Str]);
- end;
-
- class function __ENUM_HELPER.ToEnum(const Str: String; const aDefault: __ENUM_TYPE): __ENUM_TYPE;
- begin
- if not TryToEnum(Str, Result) then
- Result:= aDefault;
- end;
-
- class function __ENUM_HELPER.TryToEnum(const Str: String; out Value: __ENUM_TYPE): boolean;
- var
- i: integer;
- begin
- Result:= LookupString(Str, TABLE.N, i);
- if Result then
- Value:= TABLE.E[i];
- end;
-
- class function __ENUM_HELPER.Values: TValueArray;
- begin
- Result:= TABLE.E;
- end;
-
- {$ENDIF}
- {$undef __ENUM_TYPE}
- {$undef __ENUM_LENGTH}
- {$undef __ENUM_HELPER}
|