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.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,269df2c167555fd6 X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2001-02-24 05:26:36 PST Path: supernews.google.com!sn-xit-02!sn-xit-04!supernews.com!216.227.56.88.MISMATCH!telocity-west!TELOCITY!newsrump.sjc.telocity.net!not-for-mail From: "David C. Hoos, Sr." Newsgroups: comp.lang.ada References: <3a95c52f@post.usenet.com> Subject: Re: Representation clause MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-Newsreader: Microsoft Outlook Express 5.50.4522.1200 X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4522.1200 Message-ID: X-Trace: MTQ4IE5vQXV0aFVzZXIgVEVMT0NJVFktUkVBREVSUyAyMTYuMjI3LjQ3LjQ5ICBTYXQsIDI0IEZl!YiAyMDAxIDA1OjI2OjM1IFBTVA== X-Abuse-Info: Please forward ALL headers when reporting abuse. X-Complaints-To: abuse@telocity.net NNTP-Posting-Date: Sat, 24 Feb 2001 05:26:35 PST Date: Sat, 24 Feb 2001 07:26:35 -0600 Xref: supernews.google.com comp.lang.ada:5508 Date: 2001-02-24T07:26:35-06:00 List-Id: Given Randy Brukardt's comment that adding an enumeration representation attribute "was discussed ad-nausum during the Ada 9x process and eventually dropped as having insufficient value," I submit the following code for a complete generic package (along with a simple test program for it), implementing conversions both ways: -- Begin submitted source code -- generic type Enum is (<>); type Reps is range <>; package Enum_Reps is function Value (X : Reps; Raise_Exception_On_Error : Boolean := False) return Enum; function Rep (X : Enum) return Reps; end Enum_Reps; with Ada.Exceptions; with Ada.Unchecked_Conversion; package body Enum_Reps is -- The following three declarations are an artifice to obtain the -- name of the instantiation, to use in exception messages. ID : exception; Id_Name : constant String := Ada.Exceptions.Exception_Name (ID'Identity); Unit_Name : String renames ID_Name (1 .. ID_Name'Last - 3); --------- -- Rep -- --------- function Rep (X : Enum) return Reps is function To_Rep is new Ada.Unchecked_Conversion (Source => Enum, Target => Reps); begin return To_Rep (X); end Rep; ----------- -- Value -- ----------- function Value (X : Reps; Raise_Exception_On_Error : Boolean := False) return Enum is function To_Enum is new Ada.Unchecked_Conversion (Source => Reps, Target => Enum); Result : Enum := To_Enum (X); begin if Raise_Exception_On_Error and then not Result'Valid then Ada.Exceptions.Raise_Exception (E => Constraint_Error'Identity, Message => "Invalid representation:" & Reps'Image (X) & "; raised in " & Unit_Name & ".VALUE."); end if; return Result; end Value; end Enum_Reps; with Ada.Text_IO; with Enum_Reps; procedure Test_Enum_Reps is type Colors is (Red, Yellow, Green); for Colors use (Red => 1, Yellow => 2, Green => 4); -- The enumeration's 'Size attribute must be the same as that of -- the representation type, else a compile error will occur when -- instantiating the generic package. for Colors'Size use Integer'Size; package Color_Reps is new Enum_Reps (Enum => Colors, Reps => Integer); Color : Colors; begin for C in Colors'Range loop Ada.Text_Io.Put_Line ("Representation of " & Colors'Image (C) & " is" & Integer'Image (Color_Reps.Rep (C))); end loop; Ada.Text_IO.New_Line; -- Test 'Valid attribute for I in 0 .. 5 loop Color := Color_Reps.Value (I); if Color'Valid then Ada.Text_IO.Put_Line ("Color represented by" & Integer'Image (I) & " is " & Colors'Image (Color)); else Ada.Text_IO.Put_Line (Integer'Image (I) & " is an invalid Colors representation."); end if; end loop; -- Raise exception for invalid representation for I in 0 .. 5 loop Color := Color_Reps.Value (I, True); Ada.Text_IO.Put_Line ("Color represented by" & Integer'Image (I) & " is " & Colors'Image (Color)); end loop; end Test_Enum_Reps; -- end submitted source code -- "Anatoly Chernyshev" <@http://www.adapower.net/~achernyshev> wrote in message news:3a95c52f@post.usenet.com... > **** Post for FREE via your newsreader at post.usenet.com **** > > Hello again, > > Now I wander about representation clause for enumerated types. > For example, > type ATOM is (H, C, N, O); > for ATOM use (H=>1, C=>6, N=>7, O=>8); > > How can I access these 'internal' numbers? > ATOM'POS yields 0, 1, 2, 3 respectively and I know no other relevant > attributes. > > Thanks, > Anatoly > > > > -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= > *** Usenet.com - The #1 Usenet Newsgroup Service on The Planet! *** > http://www.usenet.com > -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=