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: Thu, 9 Dec 2004 17:06:01 -0600
Date: 2004-12-09T17:06:01-06:00	[thread overview]
Message-ID: <MvednTPOO9aWRyXcRVn-pA@megapath.net> (raw)
In-Reply-To: lnmzwoh01r.fsf@nuthaus.mib.org

"Keith Thompson" <kst-u@mib.org> wrote in message
news:lnmzwoh01r.fsf@nuthaus.mib.org...
> "Randy Brukardt" <randy@rrsoftware.com> writes:
> > "Keith Thompson" <kst-u@mib.org> wrote in message
> > news:ln8y8932ei.fsf@nuthaus.mib.org...
> [...]
> >> 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.
>
> That's fine if the author of the code that declares the type Enum has
> also bothered to declare the type Enum_Rep (and has done so
> correctly).
>
> But suppose I'm using some third-party package that declares an
> enumeration type.  I have no control over the coding of the package.
> The type may or may not have a representation clause; if it doesn't,
> it may in the next version.  As a client of the package, I don't have
> enough information to declare the type Enum_Rep myself.

Baloney. All you need is the 'Size value.

     type Enum_Rep_Subtype is range 0 .. 1;
     for Enum_Rep'Size use Enum'Size;
     function To_Rep is new Ada.Unchecked_Conversion (Enum, Enum_Rep'Base);
     function From_Rep is new Ada.Unchecked_Conversion (Enum_Rep'Base,
Enum);

You do lose any range checking, but that's relatively unimportant.

> It would also be nice to have an operation like From_Rep that raises
> Constraint_Error if I call it with an invalid value.

You've got 'Valid for that purpose. The ARG has made it clear that a program
that uses Unchecked_Conversion to create a value that is immediately checked
with 'Valid is not erroneous, no matter what the value is. (The RM is not
clear on this point.) And certainly you need to check for problems if there
is a possibility of one.

                   Randy.

P.S. Thanks for reminding me about 'Valid; I need to use it to fix a bug
that I ran across yesterday, and I'd forgotten how...








  reply	other threads:[~2004-12-09 23:06 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
2004-12-08 23:00           ` Keith Thompson
2004-12-09 23:06             ` Randy Brukardt [this message]
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