From: "M. A. Alves" <maa@liacc.up.pt>
To: comp.lang.ada@ada.eu.org
Subject: Re: Looping over a tagged record?
Date: Wed, 20 Jun 2001 16:01:28 +0100 (WEST)
Date: 2001-06-20T16:01:28+01:00 [thread overview]
Message-ID: <mailman.993045741.6638.comp.lang.ada@ada.eu.org> (raw)
In-Reply-To: <fm1Y6.2508$yp1.65358@www.newsranger.com>
> >. . , I was wondering if there is anyway to loop over all elements in
> >the record, checking their type and then taking the right action...
>
> If you really need to do this, you probably should have put the
> bounded strings into an array inside the record, instead of just
> making them flat fields.
Often I also want to merge record and array i.e. have named _and_
iteratable "components". Theoretically this comes down to "types as
objects", which Ada doesn't have. Practically, a "standard" Ada idiom for
this is an heterogenous array indexed on an enumeration e.g. (not tested):
...
type Field_Ptr is access Field'Class;
type Field_Names is (Field_1, Field_2, Field_3);
type Record_Type is array(Field_Names) of Field_Ptr;
A_Record: Record_Type := (
Field_1 => Field_Constructor_A(...),
Field_2 => Field_Constructor_A(...),
Field_3 => Field_Constructor_B(...));
Now we have a record-like object A_Record with "components" Field_1,
Field_2 of "type" A and Field_3 of "type" B. This example assumes
class-wide programming (including dispatching), with (tagged) type Field
being the root of some derivation class. Iterating over A_Record's
"components":
for I in A_Record'Range loop
Do_Something(A_Record(I).all); -- dispatching call
end loop;
Accessing "components" by name:
Do_Something(A_Record(Field_1).all);
This particular approach has a notorious shortcoming: field types are not
checked (Field_Ptr values can reference _any_ derived type in the class).
The remedy for this is left as an exercise ;-)
--
,
M A R I O data miner, LIACC, room 221 tel 351+226078830, ext 121
A M A D O Rua Campo Alegre, 823 fax 351+226003654
A L V E S P-4150 PORTO, Portugal mob 351+939354002
next prev parent reply other threads:[~2001-06-20 15:01 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-06-19 20:39 Looping over a tagged record? M R Goodwin
2001-06-19 21:31 ` Pascal Obry
2001-06-19 21:32 ` Pascal Obry
2001-06-19 22:20 ` Samuel T. Harris
2001-06-19 23:45 ` mgoodwinSPAMMY
2001-06-20 1:33 ` Pat Rogers
2001-06-20 3:13 ` Pat Rogers
2001-06-20 2:58 ` DuckE
2001-06-20 13:15 ` Ted Dennison
2001-06-20 15:01 ` M. A. Alves [this message]
2001-06-21 2:36 ` DuckE
2001-06-21 10:14 ` M. A. Alves
2001-06-21 13:24 ` Pat Rogers
2001-06-21 17:08 ` Charles Hixson
2001-06-21 18:58 ` tmoran
2001-06-21 23:02 ` Charles Hixson
2001-06-22 19:04 ` B.Gaffney
2001-06-22 20:36 ` Pascal Obry
2001-06-22 2:18 ` DuckE
2001-06-22 17:33 ` Charles Hixson
2001-06-22 18:24 ` tmoran
2001-09-13 0:29 ` Gnat Windows load error tmoran
2001-09-13 18:15 ` Jerry van Dijk
2001-09-13 23:17 ` tmoran
2001-09-13 3:58 ` Ada web crawler tmoran
2001-11-17 21:50 ` ada.strings.bounded slice errors tmoran
2001-11-18 17:16 ` Florian Weimer
2001-11-18 19:31 ` tmoran
2001-11-19 7:12 ` Florian Weimer
2002-02-08 20:55 ` How to get a traceback in Gnat 3.14p tmoran
2002-02-08 21:24 ` Pascal Obry
2002-02-08 22:28 ` tmoran
2002-02-11 0:10 ` How to use gnatelim in Gnat 3.14p? tmoran
2002-02-15 17:23 ` does gnatelim work? tmoran
2002-02-15 18:18 ` Stephen Leake
2002-02-15 21:58 ` tmoran
2002-02-18 1:31 ` Stephen Leake
2002-04-15 3:05 ` Announce: .rc files with Gnat tmoran
2002-04-15 14:48 ` Ted Dennison
2002-05-25 7:06 ` slice'access? tmoran
2002-05-25 16:47 ` slice'access? Robert Dewar
2002-05-25 18:28 ` slice'access? tmoran
2002-05-25 20:20 ` slice'access? Jeffrey Carter
2002-05-25 23:39 ` slice'access? tmoran
2002-05-26 14:22 ` slice'access? Robert Dewar
2002-09-30 1:54 ` 'write of bounded string? tmoran
2002-09-30 16:06 ` Stephen Leake
2002-10-27 23:01 ` phone# etc bdean
2002-10-28 3:04 ` tmoran
2002-11-06 3:14 ` A little Ada app tmoran
2002-11-06 11:37 ` Larry Kilgallen
2002-11-06 15:08 ` Ted Dennison
2002-11-06 18:02 ` tmoran
2001-06-21 3:09 ` Looping over a tagged record? gresset1
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox