-- CA11022.A -- -- Grant of Unlimited Rights -- -- Under contracts F33600-87-D-0337, F33600-84-D-0280, MDA903-79-C-0687, -- F08630-91-C-0015, and DCA100-97-D-0025, the U.S. Government obtained -- unlimited rights in the software and documentation contained herein. -- Unlimited rights are defined in DFAR 252.227-7013(a)(19). By making -- this public release, the Government intends to confer upon all -- recipients unlimited rights equal to those held by the Government. -- These rights include rights to use, duplicate, release or disclose the -- released technical data and computer software in whole or in part, in -- any manner and for any purpose whatsoever, and to have or permit others -- to do so. -- -- DISCLAIMER -- -- ALL MATERIALS OR INFORMATION HEREIN RELEASED, MADE AVAILABLE OR -- DISCLOSED ARE AS IS. THE GOVERNMENT MAKES NO EXPRESS OR IMPLIED -- WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING THE CONDITIONS OF THE -- SOFTWARE, DOCUMENTATION OR OTHER INFORMATION RELEASED, MADE AVAILABLE -- OR DISCLOSED, OR THE OWNERSHIP, MERCHANTABILITY, OR FITNESS FOR A -- PARTICULAR PURPOSE OF SAID MATERIAL. --* -- -- OBJECTIVE: -- Check that body of a child unit can instantiate its generic sibling. -- -- TEST DESCRIPTION: -- Declare a package that provides some types for the graphic -- application. Add a generic child package with a subprogram parameter -- to provide algorithms that can be used by different terminal types -- but that have to be customized to the specific terminal. Add child -- packages to take advantage of the parent types and to provide a -- customized operation for each of the different terminals. The -- customized operation will be passed as a generic subprogram parameter -- to the child package's sibling. -- -- The main program "with"s the child packages. Check that the -- operations in child units perform as expected. -- -- -- CHANGE HISTORY: -- 06 Dec 94 SAIC ACVC 2.0 -- --! package CA11022_0 is -- Graphic Manager type Row is range 1 .. 66; type Column is range 1 .. 80; type Radius is range 1 .. 3; type Length is range 5 .. 10; -- Testing artifice. TC_Screen : array (Row, Column) of boolean := (others => (others => false)); TC_Draw_Circle : boolean := false; TC_Draw_Square : boolean := false; -- ... and other complicated ones. end CA11022_0; -- No bodies required for CA11022_0. --==================================================================-- -- Child package to provide general graphic functionalities. generic with procedure Put_Dot (X : in Column; Y : in Row); package CA11022_0.CA11022_1 is procedure Draw_Square (At_Col : in Column; At_Row : in Row; Len : in Length); procedure Draw_Circle (At_Col : in Column; At_Row : in Row; Rad : in Radius); -- procedure Draw_Ellipse ... -- and other drawings ... end CA11022_0.CA11022_1; --==================================================================-- package body CA11022_0.CA11022_1 is procedure Draw_Square (At_Col : in Column; At_Row : in Row; Len : in Length) is begin -- use square drawing algorithm -- call Put_Dot (At_Col + Column (Len), At_Row + Row(Len)); -- as needed in the algorithm. TC_Draw_Square := true; end Draw_Square; ------------------------------------------------------- procedure Draw_Circle (At_Col : in Column; At_Row : in Row; Rad : in Radius) is begin -- use circle drawing algorithm -- call for I in 1 .. Rad loop Put_Dot (At_Col + Column(I), At_Row + Row(I)); end loop; -- as needed in the algorithm. TC_Draw_Circle := true; end Draw_Circle; end CA11022_0.CA11022_1; --==================================================================-- with CA11022_0.CA11022_1; -- Generic sibling. -- Child package to provide customized graphic functions for the -- VT100. package CA11022_0.CA11022_2 is -- VT100 Graphic. X : Column := 8; Y : Row := 3; R : Radius := 2; L : Length := 6; procedure VT100_Graphic; end CA11022_0.CA11022_2; --==================================================================-- package body CA11022_0.CA11022_2 is procedure VT100_Graphic is procedure VT100_Putdot (X : in Column; Y : in Row) is begin -- Light a pixel at location (X, Y); TC_Screen (Y, X) := true; end VT100_Putdot; ------------------------------------ -- Declare instance of the generic sibling package to draw a circle, -- a square, or an ellipse customized for the VT100. package VT100_Graphic is new CA11022_0.CA11022_1 (VT100_Putdot); begin VT100_Graphic.Draw_Circle (X, Y, R); VT100_Graphic.Draw_Square (X, Y, L); end VT100_Graphic; end CA11022_0.CA11022_2; --==================================================================-- with CA11022_0.CA11022_1; -- Generic sibling. -- Child package to provide customized graphic functions for the -- IBM3270. package CA11022_0.CA11022_3 is -- IBM3270 Graphic. X : Column := 39; Y : Row := 11; R : Radius := 3; L : Length := 7; procedure IBM3270_Graphic; end CA11022_0.CA11022_3; --==================================================================-- package body CA11022_0.CA11022_3 is procedure IBM3270_Graphic is procedure IBM3270_Putdot (X : in Column; Y : in Row) is begin -- Light a pixel at location (X + 2, Y); TC_Screen (Y, X + Column(2)) := true; end IBM3270_Putdot; ------------------------------------ -- Declare instance of the generic sibling package to draw a circle, -- a square, or an ellipse customized for the IBM3270. package IBM3270_Graphic is new CA11022_0.CA11022_1 (IBM3270_Putdot); begin IBM3270_Graphic.Draw_Circle (X, Y, R); IBM3270_Graphic.Draw_Square (X, Y, L); end IBM3270_Graphic; end CA11022_0.CA11022_3; --==================================================================-- with CA11022_0.CA11022_2; -- VT100 Graphic, implicitly with -- CA11022_0, Graphic Manager. with CA11022_0.CA11022_3; -- IBM3270 Graphic. with Report; procedure CA11022 is begin Report.Test ("CA11022", "Check that body of a child unit can depend on " & "its generic sibling"); -- Customized graphic functions for the VT100 terminal. CA11022_0.CA11022_2.VT100_Graphic; if not CA11022_0.TC_Screen (4,9) and not CA11022_0.TC_Screen (5,10) and not CA11022_0.TC_Screen (9,14) and not CA11022_0.TC_Draw_Circle and not CA11022_0.TC_Draw_Square then Report.Failed ("Wrong results for the VT100"); end if; CA11022_0.TC_Draw_Circle := false; CA11022_0.TC_Draw_Square := false; -- Customized graphic functions for the IBM3270 terminal. CA11022_0.CA11022_3.IBM3270_Graphic; if not CA11022_0.TC_Screen (12,42) and not CA11022_0.TC_Screen (13,43) and not CA11022_0.TC_Screen (14,44) and not CA11022_0.TC_Screen (46,18) and not CA11022_0.TC_Draw_Circle and not CA11022_0.TC_Draw_Square then Report.Failed ("Wrong results for the IBM3270"); end if; Report.Result; end CA11022;