cdb0a01.a
来自「linux下编程用 编译软件」· A 代码 · 共 306 行
A
306 行
-- CDB0A01.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 storage pool may be user_determined, and that storage-- is allocated by calling Allocate.---- Check that a storage.pool may be specified using 'Storage_Pool-- and that S'Storage_Pool denotes the storage pool of the type S.---- TEST DESCRIPTION:-- The package System.Storage_Pools is exercised by two very similar-- packages which define a tree type and exercise it in a simple manner.-- One package uses a user defined pool. The other package uses a-- storage pool assigned by the implementation; Storage_Size is-- specified for this pool.-- The dispatching procedures Allocate and Deallocate are tested as an-- intentional side effect of the tree packages.---- For completeness, the actions of the tree packages are checked for-- correct operation.---- TEST FILES:-- The following files comprise this test:---- FDB0A00.A (foundation code)-- CDB0A01.A------ CHANGE HISTORY:-- 02 JUN 95 SAIC Initial version-- 07 MAY 96 SAIC Removed ambiguity with CDB0A02-- 13 FEB 97 PWB.CTA Corrected lexically ordered string literal--!---------------------------------------------------------------- CDB0A01_1---------------------------------------------------------- FDB0A00.Pool1package FDB0A00.Pool1 is User_Pool : Stack_Heap( 5_000 );end FDB0A00.Pool1;---------------------------------------------------------- FDB0A00.Comparatorwith System.Storage_Pools;package FDB0A00.Comparator is function "="( A,B : System.Storage_Pools.Root_Storage_Pool'Class ) return Boolean;end FDB0A00.Comparator;-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --with TCTouch;package body FDB0A00.Comparator is function "="( A,B : System.Storage_Pools.Root_Storage_Pool'Class ) return Boolean is use type System.Address; begin return A'Address = B'Address; end "=";end FDB0A00.Comparator;---------------------------------------------------------------- CDB0A01_2with FDB0A00.Pool1;package CDB0A01_2 is type Cell; type User_Pool_Tree is access Cell; for User_Pool_Tree'Storage_Pool use FDB0A00.Pool1.User_Pool; type Cell is record Data : Character; Left,Right : User_Pool_Tree; end record; procedure Insert( Item: Character; On_Tree : in out User_Pool_Tree ); procedure Traverse( The_Tree : User_Pool_Tree ); procedure Defoliate( The_Tree : in out User_Pool_Tree );end CDB0A01_2;-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --with TCTouch;with Unchecked_Deallocation;package body CDB0A01_2 is procedure Deallocate is new Unchecked_Deallocation(Cell,User_Pool_Tree); -- Sort: zeros on the left, ones on the right... procedure Insert( Item: Character; On_Tree : in out User_Pool_Tree ) is begin if On_Tree = null then On_Tree := new Cell'(Item,null,null); elsif Item > On_Tree.Data then Insert(Item,On_Tree.Right); else Insert(Item,On_Tree.Left); end if; end Insert; procedure Traverse( The_Tree : User_Pool_Tree ) is begin if The_Tree = null then null; -- how very symmetrical else Traverse(The_Tree.Left); TCTouch.Touch(The_Tree.Data); Traverse(The_Tree.Right); end if; end Traverse; procedure Defoliate( The_Tree : in out User_Pool_Tree ) is begin if The_Tree.Left /= null then Defoliate(The_Tree.Left); end if; if The_Tree.Right /= null then Defoliate(The_Tree.Right); end if; Deallocate(The_Tree); end Defoliate;end CDB0A01_2;---------------------------------------------------------------- CDB0A01_3with FDB0A00.Pool1;package CDB0A01_3 is type Cell; type System_Pool_Tree is access Cell; for System_Pool_Tree'Storage_Size use 2000; -- assumptions: Cell is <= 20 storage_units -- Tree building exercise requires O(15) cells -- 2000 > 20 * 15 by a generous margin type Cell is record Data: Character; Left,Right : System_Pool_Tree; end record; procedure Insert( Item: Character; On_Tree : in out System_Pool_Tree ); procedure Traverse( The_Tree : System_Pool_Tree ); procedure Defoliate( The_Tree : in out System_Pool_Tree );end CDB0A01_3;-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --with TCTouch;with Unchecked_Deallocation;package body CDB0A01_3 is procedure Deallocate is new Unchecked_Deallocation(Cell,System_Pool_Tree); -- Sort: zeros on the left, ones on the right... procedure Insert( Item: Character; On_Tree : in out System_Pool_Tree ) is begin if On_Tree = null then On_Tree := new Cell'(Item,null,null); elsif Item > On_Tree.Data then Insert(Item,On_Tree.Right); else Insert(Item,On_Tree.Left); end if; end Insert; procedure Traverse( The_Tree : System_Pool_Tree ) is begin if The_Tree = null then null; -- how very symmetrical else Traverse(The_Tree.Left); TCTouch.Touch(The_Tree.Data); Traverse(The_Tree.Right); end if; end Traverse; procedure Defoliate( The_Tree : in out System_Pool_Tree ) is begin if The_Tree.Left /= null then Defoliate(The_Tree.Left); end if; if The_Tree.Right /= null then Defoliate(The_Tree.Right); end if; Deallocate(The_Tree); end Defoliate;end CDB0A01_3;------------------------------------------------------------------ CDB0A01with Report;with TCTouch;with FDB0A00.Comparator;with FDB0A00.Pool1;with CDB0A01_2;with CDB0A01_3;procedure CDB0A01 is Banyan : CDB0A01_2.User_Pool_Tree; Torrey : CDB0A01_3.System_Pool_Tree; use type CDB0A01_2.User_Pool_Tree; use type CDB0A01_3.System_Pool_Tree; Countess : constant String := "Ada Augusta Lovelace"; Cenosstu : constant String := " AALaaacdeeglostuuv"; Insertion : constant String := "AAAAAAAAAAAAAAAAAAAA"; Deallocation : constant String := "DDDDDDDDDDDDDDDDDDDD";begin -- Main test procedure. Report.Test ("CDB0A01", "Check that a storage pool may be " & "user_determined, and that storage is " & "allocated by calling Allocate. Check that " & "a storage.pool may be specified using " & "'Storage_Pool and that S'Storage_Pool denotes " & "the storage pool of the type S" );-- Check that S'Storage_Pool denotes the storage pool for the type S. TCTouch.Assert( FDB0A00.Comparator."="(FDB0A00.Pool1.User_Pool, CDB0A01_2.User_Pool_Tree'Storage_Pool ), "'Storage_Pool not correct for CDB0A01_2.User_Pool_Tree"); TCTouch.Assert_Not( FDB0A00.Comparator."="(FDB0A00.Pool1.User_Pool, CDB0A01_3.System_Pool_Tree'Storage_Pool ), "'Storage_Pool not correct for CDB0A01_3.System_Pool_Tree");-- Check that storage is allocated by calling Allocate. for Count in Countess'Range loop CDB0A01_2.Insert( Countess(Count), Banyan ); end loop; TCTouch.Validate(Insertion, "Allocate calls via CDB0A01_2" ); for Count in Countess'Range loop CDB0A01_3.Insert( Countess(Count), Torrey ); end loop; TCTouch.Validate("", "Allocate calls via CDB0A01_3" ); CDB0A01_2.Traverse(Banyan); TCTouch.Validate(Cenosstu, "Traversal of Banyan" ); CDB0A01_3.Traverse(Torrey); TCTouch.Validate(Cenosstu, "Traversal of Torrey" ); CDB0A01_2.Defoliate(Banyan); TCTouch.Validate(Deallocation, "Deforestation of Banyan" ); TCTouch.Assert(Banyan = null, "Banyan Deallocation result not null"); CDB0A01_3.Defoliate(Torrey); TCTouch.Validate("", "Deforestation of Torrey" ); TCTouch.Assert(Torrey = null, "Torrey Deallocation result not null"); Report.Result;end CDB0A01;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?