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.9 required=5.0 tests=BAYES_00 autolearn=unavailable autolearn_force=no version=3.4.4 Path: eternal-september.org!reader01.eternal-september.org!reader02.eternal-september.org!.POSTED!not-for-mail From: Simon Wright Newsgroups: comp.lang.ada Subject: Re: [Newbie] doubly constrained array, dumb question Date: Tue, 27 Feb 2018 09:01:11 +0000 Organization: A noiseless patient Spider Message-ID: References: <62f83fe5-15d6-41cf-952f-bc3cb077d42f@googlegroups.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Injection-Info: reader02.eternal-september.org; posting-host="29ee5982ea5c320c6431d445c01a710a"; logging-data="32105"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/fAN3sJg9iTPgSt2uBOcPNhyIIumhnS9E=" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.3 (darwin) Cancel-Lock: sha1:7mwsAv8Z6pTQ2axgp5VbGc77ZfU= sha1:lhBMZNG8d+Y4KUNPoKRIR/xnedU= Xref: reader02.eternal-september.org comp.lang.ada:50677 Date: 2018-02-27T09:01:11+00:00 List-Id: "Randy Brukardt" writes: > "J-P. Rosen" 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").