comp.lang.ada
 help / color / mirror / Atom feed
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
>




  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