On 05/07/2019 23:50, Sven Barth via fpc-devel wrote:
Am 05.07.2019 um 22:34 schrieb J. Gareth Moreton:

It feels like a very convoluted way to implement a safe means of reading an enumeration from a file, but given that that reading incorrect data files is one of the main causes of enums taking on invalid values, I have to say that this is the best solution should we not be allowed the "is" operator or an intrinsic.  If that is the case, then I propose this gets added to TStream!

At least it hides the gruesome details, cause you only need to call ReadEnum<> (or ReadRange<>)... And maybe the code the compiler generates can even be optimized further. :)

Regards,
Sven

On x86, when it's a standard enum with a 0 lower bound (most enums are like this) the check can be made as simple as this:

CMP Value, HighValue{ HighValue is calculated at compile-time, while Value is the memory or register that the enum is stored in }
JBE @InRange

I'm not sure how well the compiler can generate that from "If (Value >= Ord(Low(TEnum))) and (Value <= Ord(High(TEnum))) then" because it abuses the signed/unsigned convention to check both sides of the domain (i.e. if the value is negative, it is instead treated as a very large positive number that fails the conditions on the jump).

Gareth aka. Kit


---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to