-- CA11021.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 the generic parent package can depend on one of -- its own private generic children. -- -- TEST DESCRIPTION: -- A scenario is created that demonstrates the potential of adding a -- public generic child during code maintenance without distubing a large -- subsystem. After child is added to the subsystem, a maintainer -- decides to take advantage of the new functionality and rewrites -- the parent's body. -- -- Declare a generic package which declares high level operations for a -- complex number abstraction. Declare a private generic child package -- of this package which defines low level complex operations. In the -- parent body, instantiate the private child. Use the low level -- operation to complete the high level operation. -- -- In the main program, instantiate the parent generic package. -- Check that the operations in both packages perform as expected. -- -- -- CHANGE HISTORY: -- 06 Dec 94 SAIC ACVC 2.0 -- --! generic -- Complex number abstraction. type Int_Type is range <>; package CA11021_0 is -- Simulate a generic complex number support package. Complex numbers -- are treated as coordinates in the Cartesian plane. type Complex_Type is private; Zero : constant Complex_Type; -- Real number (0,0). function Real_Part (Complex_No : Complex_Type) return Int_Type; function Imag_Part (Complex_No : Complex_Type) return Int_Type; function Complex (Real, Imag : Int_Type) return Complex_Type; -- High level operation for complex number. function "*" (Factor : Int_Type; C : Complex_Type) return Complex_Type; -- ... and other complicated ones. private type Complex_Type is record Real : Int_Type; Imag : Int_Type; end record; Zero : constant Complex_Type := (Real => 0, Imag => 0); end CA11021_0; --==================================================================-- -- Private generic child of Complex_Number. private generic -- No parameter. package CA11021_0.CA11021_1 is -- ... Other declarations. -- Low level operation on complex number. function "+" (Left, Right : Complex_Type) return Complex_Type; function "-" (Right : Complex_Type) return Complex_Type; -- ... Various other operations in real application. end CA11021_0.CA11021_1; --==================================================================-- package body CA11021_0.CA11021_1 is function "+" (Left, Right : Complex_Type) return Complex_Type is begin return ( (Left.Real + Right.Real, Left.Imag + Right.Imag) ); end "+"; -------------------------------------------------- function "-" (Right : Complex_Type) return Complex_Type is begin return (-Right.Real, -Right.Imag); end "-"; end CA11021_0.CA11021_1; --==================================================================-- with CA11021_0.CA11021_1; -- Private generic child package. package body CA11021_0 is ----------------------------------------------------- -- Parent's body depends on private generic child. -- ----------------------------------------------------- -- Instantiate the private child. package Complex_Ops is new CA11021_1; use Complex_Ops; -- All user-defined operators -- directly visible. -------------------------------------------------- function "*" (Factor : Int_Type; C : Complex_Type) return Complex_Type is Result : Complex_Type := Zero; begin for I in 1 .. abs (Factor) loop Result := Result + C; -- Private generic child "+". end loop; if Factor < 0 then Result := - Result; -- Private generic child "-". end if; return Result; end "*"; -------------------------------------------------- function Real_Part (Complex_No : Complex_Type) return Int_Type is begin return (Complex_No.Real); end Real_Part; -------------------------------------------------- function Imag_Part (Complex_No : Complex_Type) return Int_Type is begin return (Complex_No.Imag); end Imag_Part; -------------------------------------------------- function Complex (Real, Imag : Int_Type) return Complex_Type is begin return (Real, Imag); end Complex; end CA11021_0; --==================================================================-- with CA11021_0; -- Complex number abstraction. with Report; procedure CA11021 is type My_Integer is range -100 .. 100; -------------------------------------------------- -- Declare instance of the generic complex package for one particular -- integer type. package My_Complex_Pkg is new CA11021_0 (Int_Type => My_Integer); use My_Complex_Pkg; -- All user-defined operators -- directly visible. -------------------------------------------------- Complex_One, Complex_Two : Complex_Type; My_Literal : My_Integer := -3; begin Report.Test ("CA11021", "Check that body of the generic parent package " & "can depend on its private generic child"); Complex_One := Complex (11, 6); Complex_Two := 5 * Complex_One; if Real_Part (Complex_Two) /= 55 and Imag_Part (Complex_Two) /= 30 then Report.Failed ("Incorrect results from complex operation"); end if; Complex_One := Complex (-4, 7); Complex_Two := My_Literal * Complex_One; if Real_Part (Complex_Two) /= 12 and Imag_Part (Complex_Two) /= -21 then Report.Failed ("Incorrect results from complex operation"); end if; Report.Result; end CA11021;