comp.lang.ada
 help / color / mirror / Atom feed
From: "Randy Brukardt" <randy@rrsoftware.com>
Subject: Re: A question re meaning/use of the "for ... use ..."
Date: Wed, 8 Dec 2004 13:50:02 -0600
Date: 2004-12-08T13:50:02-06:00	[thread overview]
Message-ID: <vPWdnWxTy-8BxyrcRVn-pQ@megapath.net> (raw)
In-Reply-To: ln8y8932ei.fsf@nuthaus.mib.org

"Keith Thompson" <kst-u@mib.org> wrote in message
news:ln8y8932ei.fsf@nuthaus.mib.org...
> "Randy Brukardt" <randy@rrsoftware.com> writes:
> > "Jeffrey Carter" <spam@spam.com> wrote in message
> > news:H1Hsd.1987$yr1.256@newsread3.news.pas.earthlink.net...
> >> Stephen Leake wrote:
> >>
> >> > There is no standard attribute that returns the internal
> >> > representation specified by the enumeration representation clause.
> >> > However, GNAT provides the non-standard 'Enum_Rep for this purpose.
> >>
> >> I have no problem with 'Pos returning the abstract position number, but
> >> do think something like GNAT's 'Enum_Rep should be standard, along with
> >> a conversion the other way, equivalent to 'Val ('Enum_Val?).
> >
> > The ARG discussed this long ago, and concluded that such a facility
isn't
> > needed. That's because Unchecked_Conversion provides the needed support.
> > Indeed, this is one of the few cases where the result of
> > Unchecked_Conversion is defined by the language (using it in this way
will
> > work on all Ada compilers). There was some discussion about syntax
guides
> > that prohibit the use of Unchecked_Conversion, but there is a lot of
> > discomfort about changing the language just because some people's style
> > guides are broken...
>
> How do you portably choose the target type for the Unchecked_Conversion?
>
> The 'Pos attribute returns a result of type universal_integer; there's
> no way to make an Unchecked_Conversion return a universal_integer.

You have to declare a type for that purpose, but otherwise there is no
problem:

    First_Rep : constant := <rep-of-First>;
    Last_Rep : constant := <rep-of-Last>;
    type Enum is (First, ...., Last);
    for Enum use (First => First_Rep, .... Last => Last_Rep);
    type Enum_Rep is range First_Rep .. Last_Rep;
    for Enum_Rep'Size use Enum'Size;
    function To_Rep is new Ada.Unchecked_Conversion (Enum, Enum_Rep);
    function From_Rep is new Ada.Unchecked_Conversion (Enum_Rep, Enum);

All of this is portable, and required for any Annex C compliant compiler.
The only loss here is writing a bit of extra text (these declarations, and
type conversions on the results of the functions). This is a rare enough
need that that doesn't seem too bad.

                  Randy.






  parent reply	other threads:[~2004-12-08 19:50 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-12-05 15:27 A question re meaning/use of the "for ... use ..." Erik J Pessers
2004-12-05 15:47 ` Martin Krischik
2004-12-05 15:59 ` Stephen Leake
2004-12-05 16:52   ` Jeffrey Carter
2004-12-06 19:59     ` Randy Brukardt
2004-12-07  1:36       ` Jeffrey Carter
2004-12-07  2:40         ` David C. Hoos, Sr.
2004-12-07 20:59         ` Randy Brukardt
2004-12-08  1:41           ` Jeffrey Carter
2004-12-08  8:40           ` Martin Dowie
2004-12-08 16:23             ` Georg Bauhaus
2004-12-08  3:18       ` Keith Thompson
2004-12-08 13:48         ` David C. Hoos
2004-12-08 19:50         ` Randy Brukardt [this message]
2004-12-08 23:00           ` Keith Thompson
2004-12-09 23:06             ` Randy Brukardt
2004-12-10  2:26               ` Keith Thompson
2004-12-10 19:42                 ` Randy Brukardt
2004-12-10 21:18                   ` Keith Thompson
2004-12-11  0:53                     ` Keith Thompson
2004-12-10  3:13             ` David C. Hoos
2004-12-10  9:23               ` Keith Thompson
2004-12-10 13:24                 ` David C. Hoos
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox