comp.lang.ada
 help / color / mirror / Atom feed
From: "Jeffrey R. Carter" <spam.not.jrcarter@acm.not.spam.org>
Subject: Re: Question about generics.
Date: Mon, 03 Jul 2006 06:30:27 GMT
Date: 2006-07-03T06:30:27+00:00	[thread overview]
Message-ID: <7Q2qg.812592$084.507058@attbi_s22> (raw)
In-Reply-To: <Xns97F47B960CF95pchapinsovernet@198.186.192.137>

Peter C. Chapin wrote:
> 
> generic
>   Size : in Integer;
> package Xyzzy is
>   type Index is mod Size;
>   -- etc.
> end Xyzzy;

What does a Size of -7 mean?

As you've discovered, generic formal parameters are not static in Ada, 
and so cannot be used in a type declaration.

You can do

generic
    type Index is mod <>;
package P is
    Size : constant Positive := Index'Modulus;
end P;

> I realize that I could make the Index type a generic parameter but that 
> would require me to define the type at the point of instantiation and 
> that seems unnatural. Conceptually I'm trying to parameterize the 
> package on a (static) size. It doesn't seem like I should have to define 
> a type to express that concept.

Except there's no way to do that.

> template< int size >
> class Xyzzy {
>   char array[size];  // size is a compile time constant.
> };

This is a different kettle of fish. You can't declare new integer types 
in C++, so you can't compare what you're trying to do with C++. Array 
subtype constraints don't have to be static, or even constant:

generic
    Size : Positive; -- or Natural, if zero is acceptable
package P is
    subtype S is String (1 .. Size); -- Size is a non-static constant
end P;

declare
    N : Positive := Get;
begin
    if N rem 2 /= 0 then
       N := N + 1;
    end if;

    declare
       subtype S is String (1 .. N);
    begin
       null;
    end;
end;

Note that Integer is perfectly OK for using type String, for exponents, 
and for sizes and counts that will fit in a 16-bit signed integer, but 
for just about everything else you should be using user-defined types 
based on the requirements of the application. Whichever you use, if 
negative values are not meaningful, you should explicitly exclude them 
by using an appropriate subtype.

-- 
Jeff Carter
"We'll make Rock Ridge think it's a chicken
that got caught in a tractor's nuts!"
Blazing Saddles
87



  parent reply	other threads:[~2006-07-03  6:30 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-07-02 16:08 Question about generics Peter C. Chapin
2006-07-02 18:49 ` Martin Krischik
2006-07-03  6:30 ` Jeffrey R. Carter [this message]
2006-07-03 10:33   ` Peter C. Chapin
2006-07-03 11:42     ` Jean-Pierre Rosen
2006-07-03 16:44     ` Pascal Obry
2006-07-04  1:09       ` Peter C. Chapin
2006-07-04  6:17         ` M E Leypold
2006-07-04 10:48           ` Peter C. Chapin
2006-07-03 20:03     ` Jeffrey R. Carter
2006-07-03 20:18       ` Dmitry A. Kazakov
2006-07-04  0:08         ` Randy Brukardt
2006-07-04  7:48           ` Dmitry A. Kazakov
2006-07-04  0:43         ` Jeffrey R. Carter
2006-07-03  9:46 ` Martin Krischik
2006-07-04 13:29 ` Stephen Leake
2006-07-05 12:08   ` Dmitry A. Kazakov
  -- strict thread matches above, loose matches on Subject: below --
1993-09-02 17:45 question " Stef  Van Vlierberghe
1993-08-12 15:18 Robert I. Eachus
1993-08-11 18:48 cis.ohio-state.edu!magnus.acs.ohio-state.edu!math.ohio-state.edu!howland.
1993-08-11  0:25 agate!howland.reston.ans.net!europa.eng.gtefsd.com!darwin.sura.net!seas.g
1993-08-10 15:53 Robert I. Eachus
1993-08-09 21:29 Kenneth Anderson
1989-05-29 20:54 Question " "14827_DAVID PAPAY"
1989-05-29  7:02 "Jonathan B. Owen"
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox