--::::::::::
--stlpbadv.ads  -- stack_lpbase-Advanced
--::::::::::
generic
package Stack_LPBase.Advanced is

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

function Size_Of (Stack: LPStack_Type) return natural;
   ---------------------------------------------------------------------
   -- Pre  Cond  : None
   -- Post Cond  : Returns a count of the number of object in the stack
   -- Exceptions : None
   ---------------------------------------------------------------------

function Equal (Stack_1, Stack_2: LPStack_Type;
                EQ              : EQ_Type) return boolean;
   ---------------------------------------------------------------------
   -- Pre  Cond  : None
   -- Post Cond  : Return true iff the stacks are identical
   -- Exceptions : None
   ---------------------------------------------------------------------

function Peek (Stack   : LPStack_Type;
               Position: positive) return Object_Type;
   ---------------------------------------------------------------------
   -- Pre  Cond  : 1 <= Position <= Size_Of (Stack)
   --              1 = top, Size_Of (Stack) = bottom
   -- Post Cond  : Returns Stack(Position)
   -- Exceptions : Invalid_Position
   ---------------------------------------------------------------------

procedure Poke (Stack   : in out LPStack_Type;
                Position: in     positive;
                Object  : in out Object_Type);
   ---------------------------------------------------------------------
   -- Pre  Cond  : 1 <= Position <= Size_Of (Stack)
   --              1 = top, Size_Of (Stack) = bottom
   -- Post Cond  : Stack(Position)' = Object
   -- Exceptions : Invalid_Position
   -- NOTE:   Swap used to exchange value of Object_Type
   ---------------------------------------------------------------------

procedure Insert (Object  : in out Object_Type;
                  Position: in     positive;
                  Stack   : in out LPStack_Type);
   ---------------------------------------------------------------------
   -- Pre  Cond : 1 <= Position <= Size_Of (Stack)
   -- Post Cond : Stack'=(a ,...,a          ,Object,a        ,...,a )
   --                      1      position-1         position      n
   -- Exceptions: Invalid_Position
   -- NOTE:   Swap used to exchange value of Object_Type
   ---------------------------------------------------------------------

procedure Remove (Stack   : in out LPStack_Type;
                  Position: in     positive;
                  Object  : in out Object_Type);
   ---------------------------------------------------------------------
   -- Pre  Cond : 1 <= Position <= Size_Of (Stack)
   -- Post Cond : Stack'=(a ,...,a          ,a          ,...,a )
   --                      1      position-1  position+1      n
   --             Object' = Stack(position)
   -- Exceptions: Invalid_Position
   -- NOTE:   Swap used to exchange value of Object_Type
   ---------------------------------------------------------------------

end Stack_LPBase.Advanced;