comp.lang.ada
 help / color / mirror / Atom feed
From: Simon Wright <simon@pushface.org>
Subject: Re: [Newbie] doubly constrained array, dumb question
Date: Tue, 27 Feb 2018 09:01:11 +0000
Date: 2018-02-27T09:01:11+00:00	[thread overview]
Message-ID: <lyefl6kdrc.fsf@pushface.org> (raw)
In-Reply-To: p7252l$ros$1@franka.jacob-sparre.dk

"Randy Brukardt" <randy@rrsoftware.com> writes:

> "J-P. Rosen" <rosen@adalog.fr> wrote in message 
> news:p71rvj$vgh$1@gioia.aioe.org...
>> Le 26/02/2018 à 17:26, Mehdi Saada a écrit :
>>> Hello.
>>>
>>> I would like an constrained String subtype with narrower bounds that 
>>> Positive'Range.
>>> How can I do something like:
>>> subtype Possible_Length is NATURAL range 1..80;
>>> subtype T_Line is String (Possible_Length range <>);
>>> ? I know "range <>" isn't included in the definition of 
>>> "range_constraint". How can I express the same thing.
>>> So that I can get after, a dynamic string with:
>>> A: access T_LINE := new T_LINE'("BLABLABLA"); while checking for its 
>>> range.
>>>
>> You can't do that, because a subtype can't be both constrained and
>> unconstrainde at the same time...
>>
>> OTOH, you can define your own string type:
>> type Short_String is array (Possible_length range <>) of character;
>
> Or you could use a subtype with a dynamic predicate:
>
>     subtype Short_String is String
>        with Dynamic_Predicate => Short_String'First >= Possible_Length'First 
> and Short_String'Last <= Possible_Length'Last;
>
> This would be checked any time that you convert a string value into a 
> Short_String subtype (explicitly or implicitly), so it probably would give 
> the right effect. Note that unlike a real constraint, it wouldn't have any 
> effect on other subtypes, so:
>      Silly_Object : Short_String (1..100);
> would not raise Constraint_Error, but any attempt to assign into it would 
> raise Assertion_Error. (Assuming the Assertion_Policy is Check, it isn't for 
> GNAT by default.)

I tried this first:

   with Ada.Text_IO;
   procedure Short_String is
      pragma Assertion_Policy (Check);
      subtype Possible_Length is Integer range 0 .. 5;
      subtype Short_String is String
      with Dynamic_Predicate => Short_String'Length <= Possible_Length'Last;
   begin
      for J in 0 .. 6 loop
         declare
            S : Short_String (1 .. J) := (others => 'm');
            --  pragma Assert (S'Length <= Possible_Length'Last);
         begin
            S := (others => 'x');
            Ada.Text_IO.Put_Line (String (S) & S'Length'Img);
         end;
      end loop;
   end Short_String;

and then with your suggestion, and neither raised AE.

I put in an assertion as commented out, and it was triggered.

SPARK detectd the problem ("medium: predicate check might fail").


  reply	other threads:[~2018-02-27  9:01 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-26 16:26 [Newbie] doubly constrained array, dumb question Mehdi Saada
2018-02-26 17:02 ` J-P. Rosen
2018-02-26 21:40   ` Dmitry A. Kazakov
2018-02-26 23:26   ` Randy Brukardt
2018-02-27  9:01     ` Simon Wright [this message]
2018-02-27 22:11       ` Randy Brukardt
2018-02-26 20:52 ` Niklas Holsti
2018-02-27  1:29 ` Mehdi Saada
2018-02-27  9:18   ` Dmitry A. Kazakov
2018-02-27 11:43     ` Mehdi Saada
2018-02-27 14:19       ` Dmitry A. Kazakov
2018-02-27 17:08     ` G. B.
2018-02-27 17:37       ` Dmitry A. Kazakov
2018-02-27 14:34   ` Jere
2018-02-27 15:13     ` Dmitry A. Kazakov
2018-02-27  7:38 ` Jacob Sparre Andersen
replies disabled

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