comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: APQ
Date: Wed, 5 Jan 2005 12:58:05 +0100
Date: 2005-01-05T12:58:05+01:00	[thread overview]
Message-ID: <14tct9l9a8k00$.18ys1gknymyvo.dlg@40tude.net> (raw)
In-Reply-To: sa41xd0c22i.fsf@snoopy.apana.org.au

On Wed, 05 Jan 2005 08:32:53 +1100, Brian May wrote:

>>>>>> "Dmitry" == Dmitry A Kazakov <mailbox@dmitry-kazakov.de> writes:
> 
>     Dmitry> You probably mean this:
> 
>     Dmitry> function Copy (C : Root_Connection_Type'Class)
>     Dmitry> return Root_Connection_Ptr is
>     Dmitry> begin
>     Dmitry> return new Root_Connection_Type'Class'(C);
>     Dmitry> end Copy;
> 
>     Dmitry> This indeed cannot work for limited types. This was the
>     Dmitry> reason why Copy was declared abstract primitive instead:
> 
>     Dmitry> function Copy (C : Root_Connection_Type)
>     Dmitry> return Root_Connection_Ptr is abstract;
> 
>     Dmitry> It will dispatch to an implementation which knows how to
>     Dmitry> copy itself:
> 
> I am under the impression (perhaps wrong impression, I haven't tested
> it) that
> 
> A := Copy(C);
> 
> will not work if C is a limited type, as there is an implied copy
> operation from the RHS to the LHS.

The following is an fully operational implementation of what I meant based
on Simple Components (http://www.dmitry-kazakov.de/ada/components.htm):

  -- The test program first:

with Connections;  use Connections;
with Connections.My_Connections;

procedure Test_Connections is
   A : Connection; -- Illegal, will not compile
   B : Connection := Connections.My_Connections.Create (10);
   C : Connection := Copy (B); -- Make a copy
   D : Connection := B; -- Reference
begin
   null;
end Test_Connections;

Here B and D are handles to the same internal connection object. They share
it. C is a handle to a copy of the object pointed by B,D. The connection
objects are automatically destroyed when the last handle disappear. User
sees only the type Connection.

   -- Abstract connection interface. A connection is a handle to
   -- the connection object. Handles are not limited, objects are.

with Object;
with Object.Handle;

package Connections is
   type Connection (<>) is private;
   function Copy (C : Connection) return Connection;
   
private
   type Root_Connection_Object is
      abstract new Object.Entity with null record;
   type Root_Connection_Ptr is access Root_Connection_Object'Class;
   function Copy (C : Root_Connection_Object)
      return Root_Connection_Ptr is abstract;

   package Connection_Handles is
      new Object.Handle (Root_Connection_Object, Root_Connection_Ptr);
   type Connection is new Connection_Handles.Handle with null record;
   function Ref (C : Root_Connection_Ptr) return Connection;
end Connections;

package body Connections is
   function Copy (C : Connection) return Connection is
   begin
      return Ref (Copy (Ptr (C).all));
   end Copy;

   function Ref (C : Root_Connection_Ptr) return Connection is
   begin
      return (Connection_Handles.Ref (C) with null record);
   end Ref;
end Connections;

  -- An implementation: My_Connection

package Connections.My_Connections is
   function Create (Parameter : Integer) return Connection;

private
   type My_Connection_Object is new Root_Connection_Object with record
      I : Integer;
   end record;
   function Copy (C : My_Connection_Object) return Root_Connection_Ptr;

end Connections.My_Connections;

package body Connections.My_Connections is
   function Create (Parameter : Integer) return Connection is
      This   : Root_Connection_Ptr := new My_Connection_Object;
      Object : My_Connection_Object
                  renames My_Connection_Object (This.all);
   begin
      Object.I := Parameter;
      return Ref (This);
   end Create;

   function Copy (C : My_Connection_Object) return Root_Connection_Ptr is
      This   : Root_Connection_Ptr := new My_Connection_Object;
      Object : My_Connection_Object
                  renames My_Connection_Object (This.all);
   begin
      Object.I := C.I;
      return This;
   end Copy;

end Connections.My_Connections;

> Also the thread "Return_By_Reference or Return_By_Copy (GNAT bug?)" might
> be relevant here.

Only in Ada 2005 there will be a way to have limited object constructors.
Which will be BTW still too little for a proper construction model. There
still will be no constructors with parameters. No copy constructors. No
class-wide constructors.

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



  reply	other threads:[~2005-01-05 11:58 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-12-15 23:31 APQ Brian May
2004-12-16 11:34 ` APQ Warren W. Gay VE3WWG
2004-12-16 23:58   ` APQ Randy Brukardt
2004-12-17  3:45     ` APQ Brian May
2004-12-17  4:03       ` APQ Warren W. Gay VE3WWG
2004-12-17  4:38         ` APQ Brian May
2004-12-17  9:06           ` APQ Egil H. H�vik
2004-12-17 11:42             ` APQ Brian May
2004-12-17 22:55               ` APQ Brian May
2004-12-18 15:52                 ` APQ Warren W. Gay VE3WWG
2004-12-18 18:23                   ` APQ Dmitry A. Kazakov
2004-12-21 23:34                     ` APQ Brian May
2004-12-22  8:57                       ` APQ Dmitry A. Kazakov
2004-12-22 10:07                   ` APQ Martin Krischik
2004-12-22 13:15                     ` APQ Dmitry A. Kazakov
2004-12-22 16:53                       ` APQ Martin Krischik
2004-12-22 17:21                         ` APQ Dmitry A. Kazakov
2004-12-22 18:23                           ` APQ Martin Krischik
2004-12-17  8:59       ` APQ Stephen Leake
2004-12-17 14:12       ` APQ Dmitry A. Kazakov
2004-12-17 23:20         ` APQ Brian May
2004-12-18 16:13           ` APQ Dmitry A. Kazakov
2004-12-21 23:29         ` APQ Brian May
2004-12-22  9:14           ` APQ Dmitry A. Kazakov
2005-01-04 21:32             ` APQ Brian May
2005-01-05 11:58               ` Dmitry A. Kazakov [this message]
2004-12-23 17:04           ` APQ (Connection Cloning) Warren W. Gay VE3WWG
2004-12-23 17:55             ` Georg Bauhaus
2004-12-23 18:52               ` Warren W. Gay VE3WWG
2005-01-03  7:40                 ` Frank Piron
2004-12-17 13:54 ` APQ Dmitry A. Kazakov
  -- strict thread matches above, loose matches on Subject: below --
2004-12-16  4:37 APQ Christoph Karl Walter Grein
replies disabled

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