blob: 3e4d9c40b307f296da99b9543bb6b0105e22820e [file] [log] [blame]
-- CC70002.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 a formal package actual part may specify actual parameters
-- for a generic formal package. Check that these actual parameters may
-- be formal types, formal objects, and formal subprograms. Check that
-- the visible part of the generic formal package includes the first list
-- of basic declarative items of the package specification, and that if
-- the formal package actual part is (<>), it also includes the generic
-- formal part of the template for the formal package.
--
-- TEST DESCRIPTION:
-- Declare a generic package which defines a "signature" for mathematical
-- groups. Declare a second generic package which defines a
-- two-dimensional matrix abstraction. Declare a third generic package
-- which provides mathematical group operations for two-dimensional
-- matrices. Provide this third generic with two formal parameters: (1)
-- a generic formal package with the second generic as template and a
-- (<>) actual part, and (2) a generic formal package with the first
-- generic as template and an actual part that takes a formal type,
-- object, and subprogram from the first formal package as actuals.
--
--
-- CHANGE HISTORY:
-- 06 Dec 94 SAIC ACVC 2.0
--
--!
generic -- Mathematical group signature.
type Group_Type is private;
Identity : in Group_Type;
with function Operation (Left, Right : Group_Type) return Group_Type;
-- with function Inverse... (omitted for brevity).
package CC70002_0 is
function Power (Left : Group_Type; Right : Integer) return Group_Type;
-- ... Other group operations.
end CC70002_0;
--==================================================================--
package body CC70002_0 is
-- The implementation of Power is purely artificial; the validity of its
-- implementation in the context of the abstraction is irrelevant to the
-- feature being tested.
function Power (Left : Group_Type; Right : Integer) return Group_Type is
Result : Group_Type := Identity;
begin
Result := Operation (Result, Left); -- All this really does is add
return Result; -- one to each matrix element.
end Power;
end CC70002_0;
--==================================================================--
generic -- 2D matrix abstraction.
type Element_Type is range <>;
type Abscissa is range <>;
type Ordinate is range <>;
type Matrix_2D is array (Abscissa, Ordinate) of Element_Type;
package CC70002_1 is
Add_Ident : constant Matrix_2D := (Abscissa => (others => 1));
-- Artificial for
-- testing purposes.
-- ... Other identity matrices.
function "+" (A, B : Matrix_2D) return Matrix_2D;
-- ... Other operations.
end CC70002_1;
--==================================================================--
package body CC70002_1 is
function "+" (A, B : Matrix_2D) return Matrix_2D is
C : Matrix_2D;
begin
for I in Abscissa loop
for J in Ordinate loop
C(I,J) := A(I,J) + B(I,J);
end loop;
end loop;
return C;
end "+";
end CC70002_1;
--==================================================================--
with CC70002_0; -- Mathematical group signature.
with CC70002_1; -- 2D matrix abstraction.
generic -- Mathematical 2D matrix addition group.
with package Matrix_Ops is new CC70002_1 (<>);
-- Although the restriction of the formal package below to signatures
-- describing addition groups, and then only for 2D matrices, is rather
-- artificial in the context of this "application," the passing of types,
-- objects, and subprograms as actuals to a formal package is not.
with package Math_Sig is new CC70002_0
(Group_Type => Matrix_Ops.Matrix_2D,
Identity => Matrix_Ops.Add_Ident,
Operation => Matrix_Ops."+");
package CC70002_2 is
-- Add two matrices that are to be multiplied by coefficients:
-- [ ] = CA*[ ] + CB*[ ].
function Add_Matrices_With_Coefficients (A : Matrix_Ops.Matrix_2D;
CA : Integer;
B : Matrix_Ops.Matrix_2D;
CB : Integer)
return Matrix_Ops.Matrix_2D;
-- ...Other operations.
end CC70002_2;
--==================================================================--
package body CC70002_2 is
function Add_Matrices_With_Coefficients (A : Matrix_Ops.Matrix_2D;
CA : Integer;
B : Matrix_Ops.Matrix_2D;
CB : Integer)
return Matrix_Ops.Matrix_2D is
Left, Right : Matrix_Ops.Matrix_2D;
begin
Left := Math_Sig.Power (A, CA); -- Multiply 1st array by its coeff.
Right := Math_Sig.Power (B, CB); -- Multiply 2nd array by its coeff.
return (Matrix_Ops."+" (Left, Right));-- Add these two arrays.
end Add_Matrices_With_Coefficients;
end CC70002_2;
--==================================================================--
with CC70002_0; -- Mathematical group signature.
with CC70002_1; -- 2D matrix abstraction.
with CC70002_2; -- Mathematical 2D matrix addition group.
with Report;
procedure CC70002 is
subtype Cell_Type is Positive range 1 .. 3;
subtype Category_Type is Positive range 1 .. 2;
type Data_Points is new Natural range 0 .. 100;
type Table_Type is array (Cell_Type, Category_Type) of Data_Points;
package Data_Table_Support is new CC70002_1 (Data_Points,
Cell_Type,
Category_Type,
Table_Type);
package Data_Table_Addition_Group is new CC70002_0
(Group_Type => Table_Type,
Identity => Data_Table_Support.Add_Ident,
Operation => Data_Table_Support."+");
package Table_Add_Ops is new CC70002_2
(Data_Table_Support, Data_Table_Addition_Group);
Scores_Table : Table_Type := ( ( 12, 0),
( 21, 33),
( 49, 9) );
Expected : Table_Type := ( ( 26, 2),
( 44, 68),
( 100, 20) );
begin
Report.Test ("CC70002", "Check that a generic formal package actual " &
"part may specify formal objects, formal subprograms, " &
"and formal types");
Scores_Table := Table_Add_Ops.Add_Matrices_With_Coefficients
(Scores_Table, 2,
Scores_Table, 1);
if (Scores_Table /= Expected) then
Report.Failed ("Incorrect result for multi-dimensional array");
end if;
Report.Result;
end CC70002;