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.3 required=5.0 tests=BAYES_00,INVALID_MSGID autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,36208f5925ed5269 X-Google-Attributes: gid103376,public From: Tucker Taft Subject: Re: non-consecutive ranges Date: 1999/04/30 Message-ID: <3729FE8E.4C1B2091@averstar.com>#1/1 X-Deja-AN: 472853184 Content-Transfer-Encoding: 7bit Sender: news@inmet.camb.inmet.com (USENET news) X-Nntp-Posting-Host: houdini.burl.averstar.com References: <7gct90$7hr$1@nnrp1.dejanews.com> Content-Type: text/plain; charset=us-ascii Organization: AverStar (formerly Intermetrics) Burlington, MA USA Mime-Version: 1.0 Newsgroups: comp.lang.ada Date: 1999-04-30T00:00:00+00:00 List-Id: vlight@my-dejanews.com wrote: > > is there a way to define a variable to have a non-consecutive range? for > instance, let's say i wanted to define variable X with a range from 2 to 1024 > and 4096 to 8192. > > X : Integer range (1 .. 1024) and (4096 .. 8192); > > or something similar to this declaration. in addition to define > non-consecutive ranges, could i define a range of odd numbers? even numbers? > > how would i go about declaring this? There is nothing like this built into the language. However, you could define a private type and a "convert_from_int" function which did an arbitrarily complicated test before agreeing to convert the integer to a value of the private type. You could "inline" this function to get roughly the same performance as if the capability were supported directly through some special syntax. If you had a general requirement for types like this, you could go so far as to write a generic package to be used for defining such "holey" types, with generic formal parameters indicating the gap(s) in the range. E.g.: generic type Underlying_Type is (<>); First, Gap_First, Gap_Last, Last : Underlying_Type; package Holey_Types is type Holey is private; function Make_Holey(Val : Underlying_Type) return Holey; function Val(H : Holey) return Underlying_Type; private pragma Inline(Make_Holey, Val); type Holey is new Underlying_Type range First .. Last; end Holey_Types; package body Holey_Types is function Make_Holey(Val : Underlying_Type) return Holey is begin if Val in Gap_First .. Gap_Last then raise Constraint_Error; end if; return Holey(Val); -- Constraint_Error if not in First .. Last end Make_Holey; function Val(H : Holey) return Underlying_Type is begin return Underlying_Type(H); end Val; end Holey_Types; > joe -- -Tucker Taft stt@averstar.com http://www.averstar.com/~stt/ Technical Director, Distributed IT Solutions (www.averstar.com/tools) AverStar (formerly Intermetrics, Inc.) Burlington, MA USA