-- Copyright (c) 1995/6    John Beidler
--                         Computing Sciences Dept.
--                         Univ. of Scranton, Scranton, PA 18510
--
--                         (717) 941-7446 voice
--                         (717) 941-4250 FAX
--                         beidler@cs.uofs.edu
--
--  For use by non-profit educational institutions only.
--  This software is GUARANTEED.  Please report any errors.  All
--  corrections will be made as soon as possible (normally within
--  one working day).
------------------------------------------------------------------
package List_Polymorphic_Cntl.Advanced is

type EQ_Type is access function (L, R: Holder_Class_Ptr) return boolean;

function Size (List: List_Type) return integer;
   ------------------------------------------------------------------
   -- Pre Cond : None
   -- Post Cond: returns the number of objects in the list
   -- Exception: None
   ------------------------------------------------------------------

procedure Insert (Object  : in out Place_Holder'Class;
                  Position: in     positive;
                  List    : in     List_Type);
   ---------------------------------------------------------------------
   -- Pre  Cond : 1 <= Position <= Size (List)
   -- Post Cond : List'=(a ,...,a          ,Object,a        ,...,a )
   --                     1      position-1         position      n
   -- Exceptions: constraint_error
   -- NOTE:   Swap used to exchange value of Holder_Class_Ptr
   ---------------------------------------------------------------------

generic
   type Extended_Type is new Place_Holder with private;
procedure g_Remove (List    : in     List_Type;
                    Position: in     positive;
                    Object  : in out Extended_Type);
procedure Remove (List    : in     List_Type;
                  Position: in     positive;
                  Object  : in out Holder_Class_Ptr);
   ---------------------------------------------------------------------
   -- Pre  Cond : 1 <= Position <= Size (List)
   -- Post Cond : List'=(a ,...,a          ,a          ,...,a )
   --                     1      position-1  position+1      n
   --             Object' = List(position)
   -- Exceptions: constraint_error
   -- NOTE:   Swap used to exchange value of Holder_Class_Ptr
   ---------------------------------------------------------------------

generic
   type Extended_Type is new Place_Holder with private;
function g_Peek (List : List_Type;
                 Index: positive) return Extended_Type;
function Peek (List : List_Type;
               Index: positive) return Holder_Class_Ptr;
   ------------------------------------------------------------------
   -- Pre Cond : List /= {}, 1 <= Index <= #(List)
   -- Post Cond: Returns List(Index)
   -- Exception: List_Underflow or constraint_error
   ------------------------------------------------------------------

procedure Poke (List  : in out List_Type;
                Index : in     positive;
                Object: in     Place_Holder'Class);
   ----------------------------------------------------------------
   -- Pre Cond : 1 <= Index <= #(List)
   -- Post Cond: List(Index)' = Object
   -- Exception: constraint_error
   -- NOTE:   Swap used to exchange value of Holder_Class_Ptr
   ------------------------------------------------------------------

end List_Polymorphic_Cntl.Advanced;