comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Access to function returning class-wide type
Date: Thu, 21 Aug 2008 22:56:32 +0200
Date: 2008-08-21T22:56:35+02:00	[thread overview]
Message-ID: <saffln97j381$.1xderlppcvf4u$.dlg@40tude.net> (raw)
In-Reply-To: g8kg18$48s$1@registered.motzarella.org

On Thu, 21 Aug 2008 21:30:28 +0200, Pawe� 'Nivertius' P�azie�ski wrote:

> Dmitry A. Kazakov wrote:
> 
>> So you could replace it with a map condition->type tag and then proceed
>> with Ada.Tags.Generic_Dispatching_Constructor, because the map
>> tag->constructor is for free, here you do not need pointers any more, in
>> Ada 2005. The compiler will force to override the "constructor" for each
>> concrete derived type.
>> -------------
>> Having said that, there still is a difficult problem with construction of
>> the map. I don't know if it is an issue for you, but it is for the
>> persistency layer I designed. The problem is that if the map is
>> open-ended, you need some mechanism of registration of each new type in
>> the map. This is still unresolved in Ada. The pattern I am using is that
>> each package declaring a new type is required to call some class-wide
>> procedure registering the type upon package elaboration. In your case it
>> is the condition associated with the type tag. That cannot be enforced,
>> and it works only at the library level, i.e. for "immortal" types.
> 
> I think that the map condition->type tag is in my case same problem as map
> condition->constructor pointer. I need the map registration anyway, because
> it basically needs to be changed at run-time.

Why then N is a parameter? When each type knows its N you don't need to
pass it back.

> Altrough, all the types I
> need to register are library-level types, so the registration mechanism is
> pretty simple.

Then the pattern is (assuming N is unknown in advance):

package A is 
   type Abstracted is abstract tagged null record;
   procedure Register
             (  N : out Natural; -- Given upon registration
                Constructor : not null access
                   function return Abstracted'Class
             );
end A;
   
package B is
   type Derived is new Abstracted with ...;
end B;

package body B is
   My_N : Natural;

   function Create return Abstracted'Class is
   begin
        return Derived'(...); -- Returns derived
   end Create;

begin
   Register (My_N, Create'Access);
end B;

You don't need to declare Create in A at all. Each type will declare it in
order to call to Register anyway.

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de



  reply	other threads:[~2008-08-21 20:56 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-08-21 10:13 Access to function returning class-wide type Paweł 'Nivertius' Płazieński
2008-08-21 10:33 ` Paweł 'Nivertius' Płazieński
2008-08-21 11:02 ` Dmitry A. Kazakov
2008-08-21 11:56   ` Paweł 'Nivertius' Płazieński
2008-08-21 13:34     ` Dmitry A. Kazakov
2008-08-22  4:53       ` Randy Brukardt
2008-08-22 23:50         ` Randy Brukardt
2008-08-21 12:01 ` Georg Bauhaus
2008-08-21 13:01   ` Paweł 'Nivertius' Płazieński
2008-08-21 13:50     ` Dmitry A. Kazakov
2008-08-21 19:30       ` Paweł 'Nivertius' Płazieński
2008-08-21 20:56         ` Dmitry A. Kazakov [this message]
2008-08-22  7:34           ` Paweł 'Nivertius' Płazieński
2008-08-21 17:02 ` Adam Beneschan
2008-08-21 19:22   ` Paweł 'Nivertius' Płazieński
replies disabled

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