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=-0.3 required=5.0 tests=BAYES_00, REPLYTO_WITHOUT_TO_CC autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,bdd718faa7c79f29 X-Google-Attributes: gid103376,public X-Google-ArrivalTime: 2003-06-28 17:33:31 PST Path: archiver1.google.com!news1.google.com!newsfeed.stanford.edu!headwall.stanford.edu!newshub.sdsu.edu!elnk-pas-nf2!newsfeed.earthlink.net!stamper.news.pas.earthlink.net!stamper.news.atl.earthlink.net!harp.news.atl.earthlink.net!not-for-mail From: Richard Riehle Newsgroups: comp.lang.ada Subject: Re: Overlapping ranges Date: Sat, 28 Jun 2003 17:36:33 -0700 Organization: AdaWorks Software Engineering Message-ID: <3EFE3491.F968568D@adaworks.com> References: Reply-To: richard@adaworks.com NNTP-Posting-Host: 3f.bb.81.17 Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Server-Date: 29 Jun 2003 00:33:31 GMT X-Mailer: Mozilla 4.7 [en] (Win98; I) X-Accept-Language: en Xref: archiver1.google.com comp.lang.ada:39878 Date: 2003-06-29T00:33:31+00:00 List-Id: AG wrote: > Assuming I have a package declaration like this: > > package range is > type x1 is range 0..255; > type x2 is range 127..2**15-1; > end ranges; > > Is there a way to declare a function > using that package that will accept > values of either x1 or x2 (and nothing > else) restricted to the range 127..255 ? Perhaps I don't understand why this is a problem for you. Why not something such as, package ranges is type Number is range 0..2**15-1; type x1 is new Number range 0..255; type x2 is new Number range 127..2**15-1; function Fudge (A : X1; B : X2) return Number'Base; function Fudge (A : X2; B : X1) return Number'Base; X2_Error : exception; X1_Error : exception; end ranges; Tested using the following procedure, with ranges; with Ada.Integer_Text_IO; procedure Test_Ranges is First : ranges.X1 := 128; Second : ranges.X2 := 130; Result : ranges.Number'Base; begin Result := ranges.Fudge(A => First, B => Second); Ada.Integer_Text_IO.Put(Integer(Result)); -- 258 end Test_Ranges; With this as a possible implementation of the body, package body ranges is function Fudge (A : X1; B : X2) return Number'Base is begin if A in X1 then return Number(A) + Number(B); else raise X1_Error; end if; end Fudge; function Fudge (A : X2; B : X1) return Number'Base is begin if A in X2 then return Number(A) + Number(B); else raise X2_Error; end if; end Fudge; end ranges;