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.3 required=5.0 tests=BAYES_00,INVALID_MSGID autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,c9f437cff8842e X-Google-Attributes: gid103376,public From: Keith Thompson Subject: Re: Enumeration representation Date: 1999/09/12 Message-ID: #1/1 X-Deja-AN: 524338047 Sender: kst@king.cts.com References: <37D8E3BC.175DB72C@newtech.it> <7rcceh$anh$1@nnrp1.deja.com> <7rhkte$na7$1@nnrp1.deja.com> X-Trace: nusku.cts.com 937199999 10487 198.68.168.21 (13 Sep 1999 05:19:59 GMT) Organization: CTS Network Services Newsgroups: comp.lang.ada X-Complaints-To: newsmaster@cts.com Date: 1999-09-12T00:00:00+00:00 List-Id: Robert Dewar writes: > > Even an attribute that gives an integer type guaranteed to be > > Unchecked_Conversion-compatible with a given enumeration type would > > have helped, in a ugly sort of way. (I'm assuming such a type has to > > be of the same size and signedness as the (internal representation > > of the) enumeration type. > > It's easy enough to define the type you need ... > > > Unless the semantics of Unchecked_Conversion between discrete types > > of different sizes are well-defined -- I've never been quite clear > > on that point.) > > No, the sizes should be the same, but this is easy enough to > arrange. In GNAT everything is fine if sizes are different, > you just get the equivalent of a type conversion without > any checks, but not all compilers (and certainly not the RM) > guarantee this. Hmm. Ok, suppose you have an enumeration type Foo. It may or may not have an enumeration representation clause; if it does, it may or may not assign negative values to some of the literals. How do you declare an integer type that's guaranteed to be the same size and signedness? You could do something like this: type Equivalent_Type is range -2**Foo'Size .. 2**Foo'Size - 1; for Equivalent_Type'Size use Foo'Size; but I'm not sure that's enough. (I'm assuming 2's-complement; there are ugly but portable ways to avoid that assumption.) For example, it doesn't distinguish between the following two cases: type Unsigned_Byte is (B0, B1, ..., B255); for Unsigned_Byte use (0, 1, ..., 255); -- a confirming rep clause for Unsigned_Byte'Size use 8; and type Signed_Byte is (BM128, BM127, ..., BM1, B0, B1, ..., B127); for Signed_Byte use (-128, -127, ..., -1, 0, 1, ..., 127); for Signed_Byte'Size use 8; If you could get at the internal representation, you could use type Equivalent_Type is range Foo'Enum_Rep(Foo'First) .. Foo'Enum_Rep(Foo'Last); for Equivalent_Type'Size use Foo'Size; but of course the language doesn't provide that. In real life, the programmer can usually make use of detailed knowledge about any enumeration representation clause, but it would be nice not to have to. -- Keith Thompson (The_Other_Keith) kst@cts.com San Diego Supercomputer Center <*> "Oh my gosh! You are SO ahead of your time!" -- anon.