comp.lang.ada
 help / color / mirror / Atom feed
* Passing an instance of a generic child as a generic parameter
@ 2008-06-14 20:54 Dennis Hoppe
  2008-06-15  8:57 ` Dmitry A. Kazakov
  0 siblings, 1 reply; 4+ messages in thread
From: Dennis Hoppe @ 2008-06-14 20:54 UTC (permalink / raw)


Hi there,

I'm trying to pass an instance of a generic child unit to another 
generic package, but the only syntax, I could found specifies a concrete 
generic package.
Let's first have a look at my pathological example:

-- GENERIC PARENT 'other' ADS
generic
   B : Integer;
package Other is
   type Object is tagged null record;
   procedure Solve (Obj : Object);	
end Other;


-- GENERIC PARENT 'other' ADB
with Ada.Text_IO;

package body Other is
   procedure Solve (Obj : Object) is
   begin
     Ada.Text_IO.Put_Line ("solved");
   end;
end Other;


-- GENERIC CHILD of 'other' ADS
with Other;

generic
   -- omitted
package Other.Child is
   type Instance is new Other.Object with null record;	
	
   overriding
   procedure Solve (Obj : in Instance);
end Other.Child;


-- GENERIC CHILD of 'other' ADB
with Ada.Text_IO;

package body Other.Child is
   procedure Solve (Obj : in Instance) is
   begin
     Ada.Text_IO.Put ("other child");
   end;
end Other.Child;


-- GENERIC PARENT 'parent' ADS
with Other;

generic
   A: Integer;
   with package XX is new Other (A);
parent Parent is
   type Object is abstract tagged null record;
   procedure Print (Obj: in Object; X : in XX.Object'Class);
end Parent;


-- GENERIC PARENT 'parent' ADB
with Ada.Text_IO;

package body Parent is
   procedure Print (Obj : in Object; X : in XX.Object'Class) is
   begin
     X.Solve;
     Ada.Text_IO.Put (Integer'Image(A));
   end;
end Parent;

-- GENERIC CHILD of 'parent' ADS
with Parent;

generic
   -- omitted
	
package Parent.Child is
   type Instance is new Parent.Object with null record;
	
   overriding	
   procedure Print (Obj : in Instance; X : in XX.Object'Class);
end Parent.Child;


-- GENERIC CHILD of 'parent' ADB
with Ada.Text_IO;

package body Parent.Child is
   procedure Print (Obj : in Instance; X : in XX.Object'Class) is
   begin
     Ada.Text_IO.Put_Line ("child");
     X.Solve;
   end;	
end Parent.Child;


-- TESTSUITE
with Parent;
with Other;
with Other.Child;

procedure Test is
   A : Integer := 2;
   package O is new Other (A);
   package E is new O.Child;
   package P is new Parent (A, O);
		
   procedure Calls (Obj : P.Object'Class; X : in O.Object'Class) is		 
  begin -- Calls
       P.Print (Obj, X);
     end Calls;
	
   X : C.Instance;
   OO : O.Object;
   EE : E.Instance;
begin -- Test
   Calls (X, OO);
end Test;



Ok, if I declare 'package P is new Parent (A, O);' and call the Calls 
procedure with 'Calls (X, OO);' all went fine, because O is an instance 
of Other. I want further to declare my package P with a child unit of 
Other, so that:

procedure Test is
   A : Integer := 2;
   package O is new Other (A);
   package E is new O.Child;
   package P is new Parent (A, E);  -- O is replaced by the child E
   ..                               -- compiler error expected

end Test;

Is it possible to declare a generic package parameter to accept 
children, too? Or should I better solve this challenge with another 
approach?

generic
   A: Integer;
   with package XX is new Other (A);
   ..

... won't do it.


Thanks in advance,
   Dennis



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2008-06-15 12:04 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-06-14 20:54 Passing an instance of a generic child as a generic parameter Dennis Hoppe
2008-06-15  8:57 ` Dmitry A. Kazakov
2008-06-15  9:04   ` Dmitry A. Kazakov
2008-06-15 12:04     ` Dennis Hoppe

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