From: "David C. Hoos" <david.c.hoos.sr@ada95.com>
To: "Keith Thompson" <kst-u@mib.org>
Cc: "comp.lang.ada@ada.eu.org" <comp.lang.ada@ada-france.org>
Subject: Re: A question re meaning/use of the "for ... use ..."
Date: Thu, 9 Dec 2004 21:13:38 -0600
Date: 2004-12-09T21:13:38-06:00 [thread overview]
Message-ID: <mailman.182.1102648464.10401.comp.lang.ada@ada-france.org> (raw)
In-Reply-To: lnmzwoh01r.fsf@nuthaus.mib.org
Is there some reason the following code is not portable"
package Enums
is
type Sparse_Enum is (One, Ten, One_Hundred, One_Thousand);
for Sparse_Enum use
(One => 1, Ten => 10, One_Hundred => 100, One_Thousand => 1000);
end Enums;
with Enums;
with Ada.Exceptions;
with Ada.Text_IO;
with Ada.Unchecked_Conversion;
procedure Test_Enums
is
type Sparse_enum_Rep is range 0 .. 2**Enums.Sparse_Enum'Size - 1;
function To_Rep is new Ada.Unchecked_Conversion
(Source => Enums.Sparse_Enum, Target => Sparse_enum_Rep);
function To_Enum is new Ada.Unchecked_Conversion
(Target => Enums.Sparse_Enum, Source => Sparse_enum_Rep);
function From_Rep (Rep : Sparse_enum_Rep) return Enums.Sparse_Enum
is
Enum : Enums.Sparse_Enum := To_Enum (Rep);
begin
if Enum'Valid then
return Enum;
end if;
Ada.Exceptions.Raise_Exception
(E => Constraint_Error'Identity,
Message => Sparse_enum_Rep'Image (Rep) &
" is an invalid representation of type Enums.Sparse_Enum.");
end From_Rep;
begin
Ada.Text_IO.Put_Line ("Sparse_Enum representations:");
Ada.Text_IO.New_Line;
for N in Enums.Sparse_Enum loop
Ada.Text_IO.Put_Line
(Enums.Sparse_Enum'Image (N) & " => " &
Sparse_enum_Rep'Image (To_Rep (N)));
end loop;
Ada.Text_IO.New_Line (2);
Ada.Text_IO.Put_Line
("Attempts to convert possible representations to Sparse_Enum.");
Ada.Text_IO.New_Line;
for I in Sparse_enum_Rep'First .. Sparse_enum_Rep'First + 12 loop
begin
Ada.Text_IO.Put_Line
(Sparse_enum_Rep'Image (I) & " => " &
Enums.Sparse_Enum'Image (From_Rep (I)));
Ada.Text_IO.New_Line;
exception
when E: others =>
Ada.Text_IO.Put_Line (Ada.Exceptions.Exception_Information (E));
end;
end loop;
end Test_Enums;
Program output:
Sparse_Enum representations:
ONE => 1
TEN => 10
ONE_HUNDRED => 100
ONE_THOUSAND => 1000
Attempts to convert possible representations to Sparse_Enum.
Exception name: CONSTRAINT_ERROR
Message: 0 is an invalid representation of type Enums.Sparse_Enum.
Call stack traceback locations:
0x8049ecc 0x804a0c3 0x8049d7a 0x42015502
1 => ONE
Exception name: CONSTRAINT_ERROR
Message: 2 is an invalid representation of type Enums.Sparse_Enum.
Call stack traceback locations:
0x8049ecc 0x804a0c3 0x8049d7a 0x42015502
Exception name: CONSTRAINT_ERROR
Message: 3 is an invalid representation of type Enums.Sparse_Enum.
Call stack traceback locations:
0x8049ecc 0x804a0c3 0x8049d7a 0x42015502
Exception name: CONSTRAINT_ERROR
Message: 4 is an invalid representation of type Enums.Sparse_Enum.
Call stack traceback locations:
0x8049ecc 0x804a0c3 0x8049d7a 0x42015502
Exception name: CONSTRAINT_ERROR
Message: 5 is an invalid representation of type Enums.Sparse_Enum.
Call stack traceback locations:
0x8049ecc 0x804a0c3 0x8049d7a 0x42015502
Exception name: CONSTRAINT_ERROR
Message: 6 is an invalid representation of type Enums.Sparse_Enum.
Call stack traceback locations:
0x8049ecc 0x804a0c3 0x8049d7a 0x42015502
Exception name: CONSTRAINT_ERROR
Message: 7 is an invalid representation of type Enums.Sparse_Enum.
Call stack traceback locations:
0x8049ecc 0x804a0c3 0x8049d7a 0x42015502
Exception name: CONSTRAINT_ERROR
Message: 8 is an invalid representation of type Enums.Sparse_Enum.
Call stack traceback locations:
0x8049ecc 0x804a0c3 0x8049d7a 0x42015502
Exception name: CONSTRAINT_ERROR
Message: 9 is an invalid representation of type Enums.Sparse_Enum.
Call stack traceback locations:
0x8049ecc 0x804a0c3 0x8049d7a 0x42015502
10 => TEN
Exception name: CONSTRAINT_ERROR
Message: 11 is an invalid representation of type Enums.Sparse_Enum.
Call stack traceback locations:
0x8049ecc 0x804a0c3 0x8049d7a 0x42015502
Exception name: CONSTRAINT_ERROR
Message: 12 is an invalid representation of type Enums.Sparse_Enum.
Call stack traceback locations:
0x8049ecc 0x804a0c3 0x8049d7a 0x42015502
Process run finished
----- Original Message -----
From: "Keith Thompson" <kst-u@mib.org>
Newsgroups: comp.lang.ada
To: <comp.lang.ada@ada-france.org>
Sent: Wednesday, December 08, 2004 5:00 PM
Subject: Re: A question re meaning/use of the "for ... use ..."
> "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.
>
> It would also be nice to have an operation like From_Rep that raises
> Constraint_Error if I call it with an invalid value.
>
> The language could have made this easier, and made enumeration
> representation clauses more useful. In my opinion, it went to far in
> trying to hide representation details from the user.
>
> --
> Keith Thompson (The_Other_Keith) kst-u@mib.org
<http://www.ghoti.net/~kst>
> San Diego Supercomputer Center <*>
<http://users.sdsc.edu/~kst>
> We must do something. This is something. Therefore, we must do this.
> _______________________________________________
> comp.lang.ada mailing list
> comp.lang.ada@ada-france.org
> http://www.ada-france.org/mailman/listinfo/comp.lang.ada
>
next prev parent reply other threads:[~2004-12-10 3:13 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
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 [this message]
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