cdb0a02.a

来自「linux下编程用 编译软件」· A 代码 · 共 330 行

A
330
字号
-- CDB0A02.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 several access types can share the same pool.----      Check that any exception propagated by Allocate is--      propagated by the allocator.----      Check that for an access type S, S'Max_Size_In_Storage_Elements--      denotes the maximum values for Size_In_Storage_Elements that will--      be requested via Allocate.---- TEST DESCRIPTION:--      After checking correct operation of the tree packages, the limits of--      the storage pools (first the shared user defined storage pool, then--      the system storage pool) are intentionally exceeded.  The test checks--      that the correct exception is raised.------ TEST FILES:--      The following files comprise this test:----         FDB0A00.A   (foundation code)--         CDB0A02.A------ CHANGE HISTORY:--      10 AUG 95   SAIC   Initial version--      07 MAY 96   SAIC   Disambiguated for 2.1--      13 FEB 97   PWB.CTA  Reduced minimum allowable--                           Max_Size_In_Storage_Units, for implementations--                           with larger storage units--      25 JAN 01   RLB    Removed dubious checks on Max_Size_In_Storage_Units;--                         tightened important one.--!---------------------------------------------------------- FDB0A00.Pool2package FDB0A00.Pool2 is  Pond : Stack_Heap( 5_000 );end FDB0A00.Pool2;---------------------------------------------------------------- CDB0A02_2with FDB0A00.Pool2;package CDB0A02_2 is  type Small_Cell;  type Small_Tree is access Small_Cell;  for Small_Tree'Storage_Pool use FDB0A00.Pool2.Pond;  -- first usage  type Small_Cell is record    Data: Character;    Left,Right : Small_Tree;  end record;  procedure Insert( Item: Character; On_Tree : in out Small_Tree );  procedure Traverse( The_Tree : Small_Tree );  procedure Defoliate( The_Tree : in out Small_Tree );  procedure TC_Exceed_Pool;  Pool_Max_Elements : constant := 6000;                      -- to guarantee overflow in TC_Exceed_Poolend CDB0A02_2;-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --with TCTouch;with Report;with Unchecked_Deallocation;package body CDB0A02_2 is  procedure Deallocate is new Unchecked_Deallocation(Small_Cell,Small_Tree);  -- Sort: zeros on the left, ones on the right...  procedure Insert( Item: Character; On_Tree : in out Small_Tree ) is  begin    if On_Tree = null then      On_Tree := new Small_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 : Small_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 Small_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;  procedure TC_Exceed_Pool is    Wild_Branch : Small_Tree;  begin    for Ever in 1..Pool_Max_Elements loop       Wild_Branch := new Small_Cell'('a', Wild_Branch, Wild_Branch);       TCTouch.Validate("A","Allocating element for overflow");    end loop;    Report.Failed(" Pool_Overflow not raised on exceeding user pool size");  exception    when FDB0A00.Pool_Overflow => null; -- anticipated case    when others =>      Report.Failed("wrong exception raised in user Exceed_Pool");  end TC_Exceed_Pool;end CDB0A02_2;---------------------------------------------------------------- CDB0A02_3-- This package is essentially identical to CDB0A02_2, except that the size-- of a cell is significantly larger.  This is used to check that different-- access types may share a single poolwith FDB0A00.Pool2;package CDB0A02_3 is  type Large_Cell;  type Large_Tree is access Large_Cell;  for Large_Tree'Storage_Pool use FDB0A00.Pool2.Pond;  -- second usage  type Large_Cell is record    Data: Character;    Extra_Data : String(1..2);    Left,Right : Large_Tree;  end record;  procedure Insert( Item: Character; On_Tree : in out Large_Tree );  procedure Traverse( The_Tree : Large_Tree );  procedure Defoliate( The_Tree : in out Large_Tree );end CDB0A02_3;-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --with TCTouch;with Unchecked_Deallocation;package body CDB0A02_3 is  procedure Deallocate is new Unchecked_Deallocation(Large_Cell,Large_Tree);  -- Sort: zeros on the left, ones on the right...  procedure Insert( Item: Character; On_Tree : in out Large_Tree ) is  begin    if On_Tree = null then      On_Tree := new Large_Cell'(Item,(Item,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 : Large_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 Large_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 CDB0A02_3;------------------------------------------------------------------ CDB0A02with Report;with TCTouch;with System.Storage_Elements;with CDB0A02_2;with CDB0A02_3;with FDB0A00;procedure CDB0A02 is  Banyan : CDB0A02_2.Small_Tree;  Torrey : CDB0A02_3.Large_Tree;  use type CDB0A02_2.Small_Tree;  use type CDB0A02_3.Large_Tree;  Countess1    : constant String := "Ada ";  Countess2    : constant String := "Augusta ";  Countess3    : constant String := "Lovelace";  Cenosstu     : constant String := "  AALaaacdeeglostuuv";  Insertion    : constant String := "AAAAAAAAAAAAAAAAAAAA"                                  & "AAAAAAAAAAAAAAAAAAAA";  Deallocation : constant String := "DDDDDDDDDDDDDDDDDDDD";begin  -- Main test procedure.   Report.Test ("CDB0A02", "Check that several access types can share " &                           "the same pool.  Check that any exception " &                           "propagated by Allocate is propagated by the " &                           "allocator.  Check that for an access type S, " &                           "S'Max_Size_In_Storage_Elements denotes the " &                           "maximum values for Size_In_Storage_Elements " &                           "that will be requested via Allocate" );  -- Check that access types can share the same pool.  for Count in Countess1'Range loop    CDB0A02_2.Insert( Countess1(Count), Banyan );  end loop;  for Count in Countess1'Range loop    CDB0A02_3.Insert( Countess1(Count), Torrey );  end loop;  for Count in Countess2'Range loop    CDB0A02_2.Insert( Countess2(Count), Banyan );  end loop;  for Count in Countess2'Range loop    CDB0A02_3.Insert( Countess2(Count), Torrey );  end loop;  for Count in Countess3'Range loop    CDB0A02_2.Insert( Countess3(Count), Banyan );  end loop;  for Count in Countess3'Range loop    CDB0A02_3.Insert( Countess3(Count), Torrey );  end loop;  TCTouch.Validate(Insertion, "Allocate calls via CDB0A02_2" );  CDB0A02_2.Traverse(Banyan);  TCTouch.Validate(Cenosstu, "Traversal of Banyan" );  CDB0A02_3.Traverse(Torrey);  TCTouch.Validate(Cenosstu, "Traversal of Torrey" );  CDB0A02_2.Defoliate(Banyan);  TCTouch.Validate(Deallocation, "Deforestation of Banyan" );  TCTouch.Assert(Banyan = null, "Banyan Deallocation result not null");  CDB0A02_3.Defoliate(Torrey);  TCTouch.Validate(Deallocation, "Deforestation of Torrey" );  TCTouch.Assert(Torrey = null, "Torrey Deallocation result not null");  -- Check that for an access type S, S'Max_Size_In_Storage_Elements  -- denotes the maximum values for Size_In_Storage_Elements that will  -- be requested via Allocate. (Of course, all we can do is check that  -- whatever was requested of Allocate did not exceed the values of the  -- attributes.)  TCTouch.Assert( FDB0A00.TC_Largest_Request in 1 ..                  System.Storage_Elements.Storage_Count'Max (                    CDB0A02_2.Small_Cell'Max_Size_In_Storage_Elements,                    CDB0A02_3.Large_Cell'Max_Size_In_Storage_Elements),                  "An object of excessive size was allocated.  Size: "   & System.Storage_Elements.Storage_Count'Image(FDB0A00.TC_Largest_Request));  -- Check that an exception raised in Allocate is propagated by the allocator.  CDB0A02_2.TC_Exceed_Pool;  Report.Result;end CDB0A02;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?