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=-2.9 required=5.0 tests=BAYES_00,MAILING_LIST_MULTI autolearn=unavailable autolearn_force=no version=3.4.4 X-Google-Thread: 103376,227757d168eaa8a5 X-Google-Attributes: gid103376,public X-Google-Language: ENGLISH,ASCII-7-bit Path: g2news1.google.com!news2.google.com!proxad.net!usenet-fr.net!enst.fr!melchior!cuivre.fr.eu.org!melchior.frmug.org!not-for-mail From: "David C. Hoos" Newsgroups: comp.lang.ada Subject: Re: A question re meaning/use of the "for ... use ..." Date: Fri, 10 Dec 2004 07:24:37 -0600 Organization: Cuivre, Argent, Or Message-ID: References: <41b3291e$0$44072$5fc3050@dreader2.news.tiscali.nl> NNTP-Posting-Host: lovelace.ada-france.org Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-Trace: melchior.cuivre.fr.eu.org 1102685126 85583 212.85.156.195 (10 Dec 2004 13:25:26 GMT) X-Complaints-To: usenet@melchior.cuivre.fr.eu.org NNTP-Posting-Date: Fri, 10 Dec 2004 13:25:26 +0000 (UTC) Cc: "comp.lang.ada@ada.eu.org" To: "Keith Thompson" Return-Path: X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2800.1437 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1441 X-Virus-Scanned: by amavisd-new-20030616-p10 (Debian) at ada-france.org X-BeenThere: comp.lang.ada@ada-france.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Gateway to the comp.lang.ada Usenet newsgroup" List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Xref: g2news1.google.com comp.lang.ada:6881 Date: 2004-12-10T07:24:37-06:00 If we consider the target type for the conversion not to be some unknown type of integer, but simply a bit pattern of length Sparse_Enum'Size, then the solution I provided is completely portable. The bit pattern of 11 ones has the value -1 if interpreted as a twos-complement signed integer, or 2047 if interpreted as an unsigned integer. As to the fact that the value -1 was skipped by my small demonstration program, that is because to abbreviate the output for purposes of shortening my posting, if the program had looped over the entire range of Sparse_Enum_Rep, then all valid representations would have been properly converted to the corresponding enumeral, and all invalid representations would have raised Constraint_Error. The representations of such enumeration types are usually not modeling numbers, but some bit pattern associated with computer hardware or an external device. Granted, the _ordering_ of the representation (if it has any significance to the thing being modeled) differs according to whether the bit pattern is considered as signed or unsigned. But the ordering (again if it has any meaning at all) is governed by the enumeration type itself. One lack of enumeration types that I would have liked to have been absent from the language is the inability to make an enumeration type "modular," or "cyclic." By this I mean to have the ability to declare an enumeration type such that Enum'Succ (Enum'Last) = Enum'First, and Enum'Pred (Enum'First) = Enum'Last. ----- Original Message ----- From: "Keith Thompson" Newsgroups: comp.lang.ada To: Sent: Friday, December 10, 2004 3:23 AM Subject: Re: A question re meaning/use of the "for ... use ..." > "David C. Hoos" writes: > > 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; > > Yes. Try changing the declaration of Sparse_Enum to: > > type Sparse_Enum is (Minus_One, One, Ten, One_Hundred, One_Thousand); > for Sparse_Enum use > (Minus_One => -1, One => 1, Ten => 10, One_Hundred => 100, > One_Thousand => 1000); > > It shows the representation of Minus_One as 2047 rather than -1, > and the loop runs from 0 to 12, skipping Minus_One. > > -- > Keith Thompson (The_Other_Keith) kst-u@mib.org > San Diego Supercomputer Center <*> > 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 >