From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,UPPERCASE_50_75 autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,f70e7a457bf23e69 X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 1995-03-25 18:37:56 PST Path: nntp.gmd.de!news.rwth-aachen.de!news.rhrz.uni-bonn.de!RRZ.Uni-Koeln.DE!uni-duisburg.de!zib-berlin.de!news.mathworks.com!zombie.ncsc.mil!admii!cmcl2!thecourier.cims.nyu.edu!thecourier.cims.nyu.edu!nobody From: dewar@cs.nyu.edu (Robert Dewar) Newsgroups: comp.lang.ada Subject: Re: Optimizing and Constraint Checks Date: 25 Mar 1995 12:51:39 -0500 Organization: Courant Institute of Mathematical Sciences Message-ID: <3l1l7b$pjr@gnat.cs.nyu.edu> References: NNTP-Posting-Host: gnat.cs.nyu.edu Keywords: unchecked_conversion, optimize, constraints Date: 1995-03-25T12:51:39-05:00 List-Id: Bruce, your code is probably wrong in many implementations, since it involves unchecked conversion from enumeration type to type Integer, and the types may well have different lengths. You should be sure to do an unchecked conversion to an integer type of the same length. Incidentally, GNAT implements an attribute 'Enum_Rep which gives the underlying representation of an enumeration type in a more direct manner than unchecked conversion. Finally, for conversion of an integer to enumeration by unchecked conversion, the attribute 'Valid should be used to ensure (in Ada 95) that the result is a valid value of the type. One more point: have a look at the routine Enumchek in the ACVC suite which does related things, and is sure to work on all implementations :-) Actually the code is not so long, I will just quote it here: -- THIS GENERIC PROCEDURE IS INTENDED FOR USE IN CONJUNCTION WITH THE ACVC -- CHAPTER 13 C TESTS. IT IS INSTANTIATED WITH TWO TYPES. THE FIRST IS AN -- ENUMERATION TYPE FOR WHICH AN ENUMERATION CLAUSE HAS BEEN GIVEN, AND THE -- SECOND IS AN INTEGER TYPE WHOSE 'SIZE IS THE SAME AS THE 'SIZE OF THIS -- ENUMERATION TYPE. -- THE PROCEDURE ENUM_CHECK IS THEN CALLED WITH THREE ARGUMENTS. THE FIRST IS -- AN ENUMERATION LITERAL FROM THE ENUMERATION TYPE, THE SECOND IS AN INTEGER -- LITERAL WHICH IS THE VALUE OF THE EXPECTED REPRESENTATION (TAKEN FROM THE -- ENUMERATION REPRESENTATION CLAUSE), AND THE THIRD IS A STRING DESCRIBING OR -- NAMING THE TYPE (USED IN A CALL TO FAILED IF THE REPRESENTATION CHECK FAILS). -- THE CHECK IS TO CONVERT THE ENUMERATION VALUE TO A BOOLEAN ARRAY WITH A -- LENGTH CORRESONDING TO THE 'SIZE OF THE ENUMERATION TYPE. AN INTEGER TYPE -- IS THEN CREATED WITH THIS SAME 'SIZE, AND THE REQUIRED REPRESENTATION VALUE -- IS CONVERTED FROM THIS TYPE TO A BOOLEAN ARRAY WITH THE SAME LENGTH. THE -- TWO BOOLEAN ARRAYS ARE THEN COMPARED AND SHOULD BE EQUAL. THE CONVERSIONS -- ARE PERFORMED USING APPROPRIATE INSTANTIATIONS OF UNCHECKED_CONVERSION. -- AUTHOR: ROBERT B. K. DEWAR, UNCOPYRIGHTED, PUBLIC DOMAIN USE AUTHORIZED GENERIC TYPE ENUM_TYPE IS PRIVATE; TYPE INT_TYPE IS RANGE <>; PROCEDURE ENUM_CHECK (TEST_VALUE : ENUM_TYPE; REP_VALUE : INT_TYPE; TYPE_ID : STRING); WITH UNCHECKED_CONVERSION; WITH REPORT; USE REPORT; PROCEDURE ENUM_CHECK (TEST_VALUE : ENUM_TYPE; REP_VALUE : INT_TYPE; TYPE_ID : STRING) IS TYPE BIT_ARRAY_TYPE IS ARRAY (1 .. ENUM_TYPE'SIZE) OF BOOLEAN; PRAGMA PACK (BIT_ARRAY_TYPE); FUNCTION TO_BITS IS NEW UNCHECKED_CONVERSION (ENUM_TYPE, BIT_ARRAY_TYPE); FUNCTION TO_BITS IS NEW UNCHECKED_CONVERSION (INT_TYPE, BIT_ARRAY_TYPE); BIT_ARRAY_1 : BIT_ARRAY_TYPE; BIT_ARRAY_2 : BIT_ARRAY_TYPE; INT_VALUE : INT_TYPE := INT_TYPE (REP_VALUE); BEGIN -- VERIFY CORRECT CALL (THIS IS A SANITY CHECK ON THE TEST ITSELF) IF ENUM_TYPE'SIZE /= INT_TYPE'SIZE THEN FAILED ("ERROR IN ENUM_CHECK CALL: SIZES DO NOT MATCH"); END IF; BIT_ARRAY_1 := TO_BITS (TEST_VALUE); BIT_ARRAY_2 := TO_BITS (INT_VALUE); IF BIT_ARRAY_1 /= BIT_ARRAY_2 THEN FAILED ("CHECK ON REPRESENTATION OF TYPE " & TYPE_ID & " FAILED."); END IF; END ENUM_CHECK;