c392011.a
来自「linux下编程用 编译软件」· A 代码 · 共 300 行
A
300 行
-- C392011.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 if a function call with a controlling result is itself-- a controlling operand of an enclosing call on a dispatching operation,-- then its controlling tag value is determined by the controlling tag-- value of the enclosing call.---- TEST DESCRIPTION:-- The test builds and traverses a "ragged" list; a linked list which-- contains data elements of three different types (all rooted at-- Level_0'Class). The traversal of this list checks the objective-- by calling the dispatching operation "Check" using an item from the-- list, and calling the function create; thus causing the controlling-- result of the function to be determined by evaluating the value of-- the other controlling parameter to the two-parameter Check.------ CHANGE HISTORY:-- 22 SEP 95 SAIC Initial version-- 23 APR 96 SAIC Corrected commentary, differentiated integer.----!----------------------------------------------------------------- C392011_0package C392011_0 is type Level_0 is tagged record Ch_Item : Character; end record; function Create return Level_0; -- primitive dispatching function procedure Check( Left, Right: in Level_0 ); -- has controlling parametersend C392011_0;-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --with Report;with TCTouch;package body C392011_0 is The_Character : Character := 'A'; function Create return Level_0 is Created_Item_0 : constant Level_0 := ( Ch_Item => The_Character ); begin The_Character := Character'Succ(The_Character); TCTouch.Touch('A'); -- --- ---- ----- ---- --- -- --- ---- ----- ---- -- A return Created_Item_0; end Create; procedure Check( Left, Right: in Level_0 ) is begin TCTouch.Touch('B'); -- --- ---- ----- ---- --- -- --- ---- ----- ---- -- B end Check;end C392011_0;----------------------------------------------------------------- C392011_1with C392011_0;package C392011_1 is type Level_1 is new C392011_0.Level_0 with record Int_Item : Integer; end record; -- note that Create becomes abstract upon this derivation hence: function Create return Level_1; procedure Check( Left, Right: in Level_1 );end C392011_1;-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --with TCTouch;package body C392011_1 is Integer_1 : Integer := 0; function Create return Level_1 is Created_Item_1 : constant Level_1 := ( C392011_0.Create with Int_Item => Integer_1 ); -- note call to ^--------------^ -- A begin Integer_1 := Integer'Succ(Integer_1); TCTouch.Touch('C'); -- --- ---- ----- ---- --- -- --- ---- ----- ---- -- C return Created_Item_1; end Create; procedure Check( Left, Right: in Level_1 ) is begin TCTouch.Touch('D'); -- --- ---- ----- ---- --- -- --- ---- ----- ---- -- D end Check;end C392011_1;----------------------------------------------------------------- C392011_2with C392011_1;package C392011_2 is type Level_2 is new C392011_1.Level_1 with record Another_Int_Item : Integer; end record; -- note that Create becomes abstract upon this derivation hence: function Create return Level_2; procedure Check( Left, Right: in Level_2 );end C392011_2;-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --with TCTouch;package body C392011_2 is Integer_2 : Integer := 100; function Create return Level_2 is Created_Item_2 : constant Level_2 := ( C392011_1.Create with Another_Int_Item => Integer_2 ); -- note call to ^--------------^ -- AC begin Integer_2 := Integer'Succ(Integer_2); TCTouch.Touch('E'); -- --- ---- ----- ---- --- -- --- ---- ----- ---- -- E return Created_Item_2; end Create; procedure Check( Left, Right: in Level_2 ) is begin TCTouch.Touch('F'); -- --- ---- ----- ---- --- -- --- ---- ----- ---- -- F end Check;end C392011_2;------------------------------------------------------- C392011_2.C392011_3with C392011_0;package C392011_2.C392011_3 is type Wide_Reference is access all C392011_0.Level_0'Class; type Ragged_Element; type List_Pointer is access Ragged_Element; type Ragged_Element is record Data : Wide_Reference; Next : List_Pointer; end record; procedure Build_List; procedure Traverse_List;end C392011_2.C392011_3;-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --package body C392011_2.C392011_3 is The_List : List_Pointer; procedure Build_List is begin -- build a list that looks like: -- Level_2, Level_1, Level_2, Level_1, Level_0 -- -- the mechanism is to create each object, "pushing" the existing list -- onto the end: cons( new_item, car, cdr ) The_List := new Ragged_Element'( new C392011_0.Level_0'(C392011_0.Create), null ); -- Level_0 >> A The_List := new Ragged_Element'( new C392011_1.Level_1'(C392011_1.Create), The_List ); -- Level_1 -> Level_0 >> AC The_List := new Ragged_Element'( new C392011_2.Level_2'(C392011_2.Create), The_List ); -- Level_2 -> Level_1 -> Level_0 >> ACE The_List := new Ragged_Element'( new C392011_1.Level_1'(C392011_1.Create), The_List ); -- Level_1 -> Level_2 -> Level_1 -> Level_0 >> AC The_List := new Ragged_Element'( new C392011_2.Level_2'(C392011_2.Create), The_List ); -- Level_2 -> Level_1 -> Level_2 -> Level_1 -> Level_0 >> ACE end Build_List; procedure Traverse_List is Next_Item : List_Pointer := The_List; -- Check that if a function call with a controlling result is itself -- a controlling operand of an enclosing call on a dispatching operation, -- then its controlling tag value is determined by the controlling tag -- value of the enclosing call. -- Level_2 -> Level_1 -> Level_2 -> Level_1 -> Level_0 begin while Next_Item /= null loop -- here we go! -- these calls better dispatch according to the value in the particular -- list item; causing the call to create to dispatch accordingly. -- why do it twice? To make sure order makes no difference C392011_0.Check(Next_Item.Data.all, C392011_0.Create); -- Create will touch first, then Check touches C392011_0.Check(C392011_0.Create, Next_Item.Data.all); -- Here's what's s'pos'd to 'appen: -- Check( Lev_2, Create ) >> ACEF -- Check( Create, Lev_2 ) >> ACEF -- Check( Lev_1, Create ) >> ACD -- Check( Create, Lev_1 ) >> ACD -- Check( Lev_2, Create ) >> ACEF -- Check( Create, Lev_2 ) >> ACEF -- Check( Lev_1, Create ) >> ACD -- Check( Create, Lev_1 ) >> ACD -- Check( Lev_0, Create ) >> AB -- Check( Create, Lev_0 ) >> AB Next_Item := Next_Item.Next; end loop; end Traverse_List;end C392011_2.C392011_3;------------------------------------------------------------------- C392011with Report;with TCTouch;with C392011_2.C392011_3;procedure C392011 isbegin -- Main test procedure. Report.Test ("C392011", "Check that if a function call with a " & "controlling result is itself a controlling " & "operand of an enclosing call on a dispatching " & "operation, then its controlling tag value is " & "determined by the controlling tag value of " & "the enclosing call" ); C392011_2.C392011_3.Build_List; TCTouch.Validate( "A" & "AC" & "ACE" & "AC" & "ACE", "Build List" ); C392011_2.C392011_3.Traverse_List; TCTouch.Validate( "ACEFACEF" & "ACDACD" & "ACEFACEF" & "ACDACD" & "ABAB", "Traverse List" ); Report.Result;end C392011;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?