comp.lang.ada
 help / color / mirror / Atom feed
From: "Matthew Heaney" <matthew_heaney@acm.org>
Subject: Re: Array of Variant Records Question...
Date: 1999/09/13
Date: 1999-09-13T00:00:00+00:00	[thread overview]
Message-ID: <37dd87b2@news1.prserv.net> (raw)
In-Reply-To: wccyaeakcf0.fsf@world.std.com

In article <wccyaeakcf0.fsf@world.std.com> , Robert A Duff 
<bobduff@world.std.com>  wrote:

> Have you considered:
>
>     type And_Exp(L, R : access Bool_Exp'Class) is
>       new Bool_Exp with null record;
>
> ?


No, not here, though I've used this technique for another pattern (the
Command pattern).


>>    function New_And
>>      (L, R : access Bool_Exp'Class)
>>       return Bool_Exp_Access is
>>
>>       use And_Exp_Storage;
>>
>>       Exp : constant Exp_Access := New_Exp;
>>       -- type Exp_Access is access all And_Exp;
>>    begin
>>       Exp.L := Bool_Exp_Access (L);    -- (1)
>>       Exp.R := Bool_Exp_Access (R);    -- (2)
>>
>>       return Bool_Exp_Access (Exp);    -- (3)
>>    end New_And;
>
> Something's wrong with that.  How can New_Exp know to allocate an
> And_Exp record?

New_Exp is provided by a private generic storage manager that looks like
this:

  private generic
    type Exp_Type is new Bool_Exp with private;
  package Bool_Exps.Storage is

    type Exp_Access is access all Exp_Type;

    function New_Exp return Exp_Access;

    procedure Do_Free (Exp : access Exp_Type);

  end Bool_Exps.Storage;

The package is instantiated like this:

  package And_Exp_Storage is
    new Storage (And_Exp);


> And the "Exp.L" and "Exp.R" are illegal, because
> there's (presumably) no such components?  I'm confused.

Yes, there are L and R components.  Here's what an And_Exp looks like:

    type And_Exp is
      new Bool_Exp with record
         L, R : Bool_Exp_Access;
      end record;

You need New_Exp to return the specific type, precisely to give you access
to the representation of the type.

But after you fill in the components, you have to (manually) convert it back
to the class-wide root type.


> How about:
>
>     return new Bool_Exp'(Bool_Exp_Access(L), Bool_Exp_Access(R));
>
> which avoids the need for one of the conversions?

But I think you really meant:

  return new And_Exp'(...);

In my implementation, all allocation goes through some storage manager.
(There's a separate instantiation for each specific type in the class.)

I'll be discussing the Interpreter pattern in my upcoming Design Patterns
tutorial at this year's SIGAda conference.  You're going to be there too,
right?  Maybe you and I can finally get to meet face-to-face...

Matt




  reply	other threads:[~1999-09-13  0:00 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1999-09-08  0:00 Array of Variant Records Question Bruce Detter
1999-09-08  0:00 ` Ted Dennison
1999-09-08  0:00 ` Matthew Heaney
1999-09-08  0:00   ` Mike Silva
1999-09-08  0:00     ` Matthew Heaney
1999-09-09  0:00       ` Robert Dewar
1999-09-09  0:00         ` Matthew Heaney
1999-09-09  0:00           ` Matthew Heaney
1999-09-09  0:00             ` Mark Lundquist
1999-09-09  0:00             ` Robert Dewar
1999-09-09  0:00           ` Robert Dewar
1999-09-09  0:00             ` Brian Rogoff
1999-09-13  0:00               ` Matthew Heaney
1999-09-13  0:00                 ` Brian Rogoff
1999-09-14  0:00                   ` Robert Dewar
1999-09-14  0:00                   ` Robert Dewar
1999-09-14  0:00                     ` Brian Rogoff
1999-09-13  0:00                 ` Robert A Duff
1999-09-13  0:00                   ` Matthew Heaney [this message]
1999-09-09  0:00             ` Matthew Heaney
1999-09-10  0:00               ` Robert Dewar
1999-09-10  0:00                 ` Mark Lundquist
1999-09-10  0:00                   ` Matthew Heaney
1999-09-11  0:00                     ` Jean-Pierre Rosen
1999-09-14  0:00                     ` "cast away const" (was Re: Array of Variant Records Question...) Mark Lundquist
     [not found]                     ` <wccd7viiv59.fsf@world.std.com>
     [not found]                       ` <7rrmqd$l89@drn.newsguy.com>
     [not found]                         ` <wcciu59n2uf.fsf@world.std.com>
1999-09-22  0:00                           ` Array of Variant Records Question Robert I. Eachus
1999-09-23  0:00                             ` Robert Dewar
1999-09-23  0:00                               ` Robert I. Eachus
1999-09-22  0:00                       ` Robert I. Eachus
1999-09-10  0:00               ` Mark Lundquist
1999-09-10  0:00                 ` Matthew Heaney
1999-09-11  0:00                 ` Robert Dewar
1999-09-11  0:00               ` Richard D Riehle
1999-09-13  0:00                 ` Hyman Rosen
1999-09-14  0:00                 ` Mark Lundquist
     [not found]                   ` <7roohh$s6r@dfw-ixnews7.ix.netcom.com>
     [not found]                     ` <37e01168@news1.prserv.net>
     [not found]                       ` <7rp86o$c6h@dfw-ixnews3.ix.netcom.com>
     [not found]                         ` <37E18CC6.C8D431B@rational.com>
     [not found]                           ` <7rs8bn$s6@dfw-ixnews4.ix.netcom.com>
     [not found]                             ` <wccemfxn15s.fsf@world.std.com>
1999-09-22  0:00                               ` 'constant functions' and access constant params (was Re: Array of Variant Records Question...) Richard D Riehle
     [not found]                             ` <37e2e58c@news1.prserv.net>
1999-09-22  0:00                               ` Richard D Riehle
1999-09-22  0:00                                 ` Matthew Heaney
1999-09-22  0:00                                   ` Richard D Riehle
1999-09-22  0:00                                     ` Matthew Heaney
1999-09-22  0:00                                     ` Matthew Heaney
1999-09-23  0:00                                       ` Vincent Marciante
1999-09-23  0:00                                         ` Matthew Heaney
1999-09-24  0:00                                       ` Robert A Duff
1999-09-25  0:00                                         ` Matthew Heaney
1999-09-27  0:00                                       ` Richard D Riehle
1999-09-27  0:00                                         ` David Kristola
1999-09-27  0:00                                       ` Richard D Riehle
1999-09-23  0:00                                     ` Robert Dewar
1999-09-27  0:00                                       ` Richard D Riehle
1999-09-28  0:00                                         ` Robert Dewar
1999-09-28  0:00                                           ` "Competence" (was: 'constant functions' and access constant params) Ted Dennison
1999-09-28  0:00                                             ` Robert Dewar
1999-09-28  0:00                                         ` 'constant functions' and access constant params (was Re: Array of Variant Records Question...) Robert Dewar
1999-09-28  0:00                                           ` Richard D Riehle
1999-09-29  0:00                                             ` Robert A Duff
1999-09-29  0:00                                             ` Robert Dewar
1999-09-22  0:00                                 ` Mark Lundquist
1999-09-22  0:00                                   ` Mark Lundquist
1999-09-10  0:00             ` Proposed Ada features " Mark Lundquist
1999-09-10  0:00               ` Matthew Heaney
1999-09-10  0:00                 ` tmoran
1999-09-09  0:00     ` Array of Variant Records Question Nick Roberts
1999-09-09  0:00       ` Tucker Taft
1999-09-10  0:00         ` Nick Roberts
1999-09-09  0:00       ` Robert Dewar
1999-09-08  0:00 ` Martin C. Carlisle
1999-09-08  0:00 ` Thank you Bruce Detter
1999-09-08  0:00   ` Martin C. Carlisle
replies disabled

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