| -- CA11014.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 an instantiation of a child package of a generic package |
| -- can use its parent's declarations and operations, including a formal |
| -- package of the parent. |
| -- |
| -- TEST DESCRIPTION: |
| -- Declare a list abstraction in a generic package which manages lists of |
| -- elements of any discrete type. Declare a generic package which |
| -- operates on lists of elements of integer types. Declare a generic |
| -- child of this package which defines additional list operations. |
| -- Use the formal discrete type as the generic formal actual part for the |
| -- parent formal package. |
| -- |
| -- Declare an instance of parent, then declare an instance of the child |
| -- which is itself a child the parent's instance. In the main program, |
| -- check that the operations in both instances perform as expected. |
| -- |
| -- |
| -- CHANGE HISTORY: |
| -- 06 Dec 94 SAIC ACVC 2.0 |
| -- 15 Nov 95 SAIC Update and repair for ACVC 2.0.1 |
| -- 07 Sep 96 SAIC Change formal param E to be out only. |
| -- 19 Oct 96 SAIC ACVC 2.1: Added pragma Elaborate to context |
| -- clauses of CA11014_0, CA11014_1, and CA11014_5. |
| -- 27 Feb 97 PWB.CTA Added elaboration pragma at package CA11014_4 |
| --! |
| |
| -- Actual package for the parent's formal. |
| generic |
| |
| type Element_Type is (<>); -- List elems may be of any discrete types. |
| |
| package CA11014_0 is |
| |
| type Node_Type; |
| type Node_Pointer is access Node_Type; |
| |
| type Node_Type is record |
| Item : Element_Type; |
| Next : Node_Pointer := null; |
| end record; |
| |
| type List_Type is record |
| First : Node_Pointer := null; |
| Current : Node_Pointer := null; |
| Last : Node_Pointer := null; |
| end record; |
| |
| -- Return true if current element is last in the list. |
| function End_Of_List (L : List_Type) return boolean; |
| |
| -- Set "current" pointer to first list element. |
| procedure Reset (L : in out List_Type); |
| |
| end CA11014_0; |
| |
| --==================================================================-- |
| |
| package body CA11014_0 is |
| |
| function End_Of_List (L : List_Type) return boolean is |
| begin |
| return (L.Current = null); |
| end End_Of_List; |
| ------------------------------------------------------- |
| procedure Reset (L : in out List_Type) is |
| begin |
| L.Current := L.First; -- Set "current" pointer to first |
| end Reset; -- list element. |
| |
| end CA11014_0; |
| |
| --==================================================================-- |
| |
| with CA11014_0; -- Generic list abstraction. |
| pragma Elaborate (CA11014_0); |
| generic |
| |
| -- Import the list abstraction defined in CA11014_0. |
| with package List_Mgr is new CA11014_0 (<>); |
| |
| package CA11014_1 is |
| |
| -- Write to current element and advance "current" pointer. |
| procedure Write_Element (L : in out List_Mgr.List_Type; |
| E : in List_Mgr.Element_Type); |
| |
| -- Read from current element and advance "current" pointer. |
| procedure Read_Element (L : in out List_Mgr.List_Type; |
| E : out List_Mgr.Element_Type); |
| |
| -- Add element to end of list. |
| procedure Add_Element (L : in out List_Mgr.List_Type; |
| E : in List_Mgr.Element_Type); |
| |
| end CA11014_1; |
| |
| --==================================================================-- |
| |
| package body CA11014_1 is |
| |
| procedure Write_Element (L : in out List_Mgr.List_Type; |
| E : in List_Mgr.Element_Type) is |
| begin |
| L.Current.Item := E; -- Write to current element. |
| L.Current := L.Current.Next; -- Advance "current" pointer. |
| end Write_Element; |
| ------------------------------------------------------- |
| procedure Read_Element (L : in out List_Mgr.List_Type; |
| E : out List_Mgr.Element_Type) is |
| begin |
| E := L.Current.Item; -- Retrieve current element. |
| L.Current := L.Current.Next; -- Advance "current" pointer. |
| end Read_Element; |
| ------------------------------------------------------- |
| procedure Add_Element (L : in out List_Mgr.List_Type; |
| E : in List_Mgr.Element_Type) is |
| New_Node : List_Mgr.Node_Pointer := new List_Mgr.Node_Type'(E, null); |
| use type List_Mgr.Node_Pointer; |
| begin |
| if L.First = null then -- No elements in list, so add new |
| L.First := New_Node; -- element at beginning of list. |
| else |
| L.Last.Next := New_Node; -- Add new element at end of list. |
| end if; |
| L.Last := New_Node; -- Set last-in-list pointer. |
| end Add_Element; |
| |
| end CA11014_1; |
| |
| --==================================================================-- |
| |
| -- Generic child of list operation. This child adds a layer of |
| -- functionality to the parent generic. |
| |
| generic |
| |
| package CA11014_1.CA11014_2 is |
| |
| procedure Write_First_To_List (L : in out List_Mgr.List_Type); |
| |
| -- ... Various other operations used by the application. |
| |
| end CA11014_1.CA11014_2; |
| |
| --==================================================================-- |
| |
| package body CA11014_1.CA11014_2 is |
| |
| procedure Write_First_To_List (L : in out List_Mgr.List_Type) is |
| begin |
| List_Mgr.Reset (L); -- Parent's formal package. |
| |
| while not List_Mgr.End_Of_List (L) loop -- Parent's formal package. |
| Write_Element (L, List_Mgr.Element_Type'First); |
| -- Parent's operation, |
| end loop; -- parent's formal. |
| |
| end Write_First_To_List; |
| |
| end CA11014_1.CA11014_2; |
| |
| --==================================================================-- |
| |
| package CA11014_3 is |
| |
| type Points is range 0 .. 100; |
| |
| -- ... Various other types used by the application. |
| |
| end CA11014_3; |
| |
| |
| -- No body for CA11014_3; |
| |
| --==================================================================-- |
| |
| -- Declare instances of the generic list packages for the discrete type. |
| -- The instance of the child must itself be declared as a child of the |
| -- instance of the parent. |
| |
| with CA11014_0; -- Generic list abstraction. |
| with CA11014_3; -- Package containing discrete type declaration. |
| pragma Elaborate (CA11014_0); |
| package CA11014_4 is new CA11014_0 (CA11014_3.Points); -- Points list. |
| |
| with CA11014_4; -- Points list. |
| with CA11014_1; -- Generic list operation. |
| pragma Elaborate (CA11014_1); |
| package CA11014_5 is new CA11014_1 (CA11014_4); -- Scores list. |
| |
| with CA11014_1.CA11014_2; -- Additional generic list operation, |
| with CA11014_5; |
| pragma Elaborate (CA11014_5); |
| package CA11014_5.CA11014_6 is new CA11014_5.CA11014_2; |
| -- Points list operation. |
| |
| --==================================================================-- |
| |
| with CA11014_1.CA11014_2; -- Additional generic list operation, |
| -- implicitly with list operation. |
| with CA11014_3; -- Package containing discrete type declaration. |
| with CA11014_4; -- Points list. |
| with CA11014_5.CA11014_6; -- Points list operation. |
| with Report; |
| |
| procedure CA11014 is |
| |
| package Lists_Of_Scores renames CA11014_4; |
| package Score_Ops renames CA11014_5; |
| package Point_Ops renames CA11014_5.CA11014_6; |
| |
| Scores : Lists_Of_Scores.List_Type; -- List of points. |
| |
| type TC_Score_Array is array (1 .. 3) of CA11014_3.Points; |
| |
| TC_Initial_Values : constant TC_Score_Array := (10, 21, 49); |
| TC_Final_Values : constant TC_Score_Array := (0, 0, 0); |
| |
| TC_Initial_Values_Are_Correct : boolean := false; |
| TC_Final_Values_Are_Correct : boolean := false; |
| |
| -------------------------------------------------- |
| |
| -- Initial list contains 3 scores with the values 10, 21, and 49. |
| procedure TC_Initialize_List (L : in out Lists_of_Scores.List_Type) is |
| begin |
| for I in TC_Score_Array'range loop |
| Score_Ops.Add_Element (L, TC_Initial_Values(I)); |
| -- Operation from generic parent. |
| end loop; |
| end TC_Initialize_List; |
| |
| -------------------------------------------------- |
| |
| -- Verify that all scores have been set to zero. |
| procedure TC_Verify_List (L : in out Lists_of_Scores.List_Type; |
| Expected : in TC_Score_Array; |
| OK : out boolean) is |
| Actual : TC_Score_Array; |
| begin |
| Lists_of_Scores.Reset (L); -- Operation from parent's formal. |
| for I in TC_Score_Array'range loop |
| Score_Ops.Read_Element (L, Actual(I)); |
| -- Operation from generic parent. |
| end loop; |
| OK := (Actual = Expected); |
| end TC_Verify_List; |
| |
| -------------------------------------------------- |
| |
| begin -- CA11014 |
| |
| Report.Test ("CA11014", "Check that an instantiation of a child package " & |
| "of a generic package can use its parent's " & |
| "declarations and operations, including a " & |
| "formal package of the parent"); |
| |
| TC_Initialize_List (Scores); |
| TC_Verify_List (Scores, TC_Initial_Values, TC_Initial_Values_Are_Correct); |
| |
| if not TC_Initial_Values_Are_Correct then |
| Report.Failed ("List contains incorrect initial values"); |
| end if; |
| |
| Point_Ops.Write_First_To_List (Scores); |
| -- Operation from generic child package. |
| |
| TC_Verify_List (Scores, TC_Final_Values, TC_Final_Values_Are_Correct); |
| |
| if not TC_Final_Values_Are_Correct then |
| Report.Failed ("List contains incorrect final values"); |
| end if; |
| |
| Report.Result; |
| |
| end CA11014; |