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