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
next prev parent 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