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").
next prev parent 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