-- 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.Pool2

package FDB0A00.Pool2 is
  Pond : Stack_Heap( 5_000 );
end FDB0A00.Pool2;

---------------------------------------------------------------- CDB0A02_2

with 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_Pool

end 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 pool

with 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;

------------------------------------------------------------------ CDB0A02

with 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;
