From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.5-pre1 (2020-06-20) on ip-172-31-74-118.ec2.internal X-Spam-Level: X-Spam-Status: No, score=0.0 required=3.0 tests=BAYES_20,FREEMAIL_FROM autolearn=ham autolearn_force=no version=3.4.5-pre1 X-Received: by 2002:aed:20a3:: with SMTP id 32mr2643024qtb.238.1615582168211; Fri, 12 Mar 2021 12:49:28 -0800 (PST) X-Received: by 2002:a25:c943:: with SMTP id z64mr22210070ybf.73.1615582168026; Fri, 12 Mar 2021 12:49:28 -0800 (PST) Path: eternal-september.org!reader02.eternal-september.org!news.uzoreto.com!tr1.eu1.usenetexpress.com!feeder.usenetexpress.com!tr2.iad1.usenetexpress.com!border1.nntp.dca1.giganews.com!nntp.giganews.com!news-out.google.com!nntp.google.com!postnews.google.com!google-groups.googlegroups.com!not-for-mail Newsgroups: comp.lang.ada Date: Fri, 12 Mar 2021 12:49:27 -0800 (PST) Injection-Info: google-groups.googlegroups.com; posting-host=192.160.103.146; posting-account=1tLBmgoAAAAfy5sC3GUezzrpVNronPA- NNTP-Posting-Host: 192.160.103.146 User-Agent: G2/1.0 MIME-Version: 1.0 Message-ID: <89128f73-fcc5-4e57-8067-d09877ba0211n@googlegroups.com> Subject: array from static predicate on enumerated type From: Matt Borchers Injection-Date: Fri, 12 Mar 2021 20:49:28 +0000 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Xref: reader02.eternal-september.org comp.lang.ada:61503 List-Id: Say, for example, I define a static predicate on a sub-type of an enumerate= d type, like: type LETTERS is ( A, B, C, D, E, F, G, H, I , J, K ); subtype CURVED is LETTERS with Static_Predicate CURVED in B | C | D | G | J; What I want is an array over CURVED (using CURVED as the index), but since = attributes 'First and 'Last (and thus 'Range) is not allowed, this cannot b= e done. Also, I am restricted in that the order of LETTERS cannot be rearranged. Has anybody come up with a clever data structure to make sub-types with pre= dicates easy and sensible for indexing (not iterating)? I only need read access, so I defined an array over 1..5 and then created a= function that takes a LETTERS type as input and outputs a POSITIVE. type ARR(1..5) of BOOLEAN; function ARR_IDX( u : CURVED ) return POSITIVE is (case u is when B =3D> 1, when C =3D> 2, when D =3D> 3, when G =3D> 4, = when J =3D> 5); states : ARR :=3D (others =3D> FALSE); b : BOOLEAN; Then later, b :=3D states(arr_idx(G)) What I don't like about this solution is all of it. If an element is added= to CURVED then the range of ARR would have to be updated and the case expr= ession for ARR_IDX also needs to be updated. At least with a case statemen= t or expression, the compiler can identify that part for me. I assume that internally an enumerated type is represented by its position = such that LETTERS.G'Pos =3D 6. Perhaps CURVED.G'Pos could result in 3? If= programmers could define an array over CURVED'Range, then any mapping math= could be done by the compiler that they would have to do manually anyway. = It seems reasonable that the compiler could take care of this for us effec= tively as I have done, but there would be the benefit of doing static check= s at compilation. Perhaps a language lawyer could explain why this can't b= e so when the sub-type mark is explicitly provided. I guess what I'm saying is that it would be nice if LETTERS.G equaled CURVE= D.G semantically (because CURVED is a sub-type), but LETTERS.G'Pos would no= t necessarily equal to CURVED.G'Pos. I'm sure this was discussed and that = there is a rational reason why this can't be so but I haven't given it a lo= t of thought myself. I'm not expecting the same kind of lookup speed from = the index mapping that needs to be done. Beyond this, as an alternate solution, I think some type of basic hash func= tionality built into the language syntax for enumerated types would be usef= ul and would go a long way to make Ada more contemporary and adoptable. Us= ing the generic hash packages in Containers is overkill for my needs. Matt