[fpc-devel] [Suggestion] Enumeration range-check intrinsic
    Ondrej Pokorny 
    lazarus at kluug.net
       
    Fri Jul  5 16:48:32 CEST 2019
    
    
  
On 05.07.2019 14:58, Martok wrote:
> Am 05.07.2019 um 12:20 schrieb Ondrej Pokorny:
>>> Anything that even looks like a subrange cannot be used for these interfaces.
>> You may use enumerations for these interfaces - you may just not fill
>> them directly but through an integer variable in between when reading
>> from outside.
> Then you're not using them *in* the interface ;-)
For records you could use such a workaround:
program Project1;
{$mode objfpc}
{$modeswitch advancedrecords}
type
   TMyEnum = (one, two, three);
   TMyRecord = record
   public
     function IsValid: Boolean;
   public
     case Boolean of
       False: ( // real values
         Enum: TMyEnum;
       );
       True: ( // used for interface
         EnumIntf: Integer;
         {$IF SizeOf(Integer)<>SizeOf(TMyEnum)}
           {$ERROR Size mismatch}
         {$ENDIF}
       );
   end;
{ TMyRecord }
function TMyRecord.IsValid: Boolean;
begin
   Result := EnumIntf is TMyEnum;
end;
var
   R: TMyRecord;
begin
   // fill R with data ...
   Randomize;
   FillChar(R, SizeOf(R), Random(High(Byte)));
   // check validity
   if R.IsValid then
     Writeln('R is valid')
   else
     Writeln('R is not valid');
   Writeln(R.EnumIntf);
   ReadLn;
end.
Best
Ondrej
    
    
More information about the fpc-devel
mailing list