--::::::::::
--stlpcnad.ads   --       -Advanced
--::::::::::
with Stack_LPBase.Advanced;
generic
package Stack_Lpt_Cntl.Advanced is
   ------------------------------------------------------
   -- WARNING: Do not use adv_LPS
      package adv_LPS is new LPS.Advanced;
   ------------------------------------------------------

subtype EQ_Type is adv_LPS.EQ_Type;
-- access
--   function (L, R: Object_Type) return boolean;

function Size_Of (Stack: Stack_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: Stack_Type;
                EQ              : EQ_Type) return boolean;
   ---------------------------------------------------------------------
   -- Pre  Cond  : None
   -- Post Cond  : Return true iff the stacks are identical
   -- Exceptions : None
   ---------------------------------------------------------------------

function Peek (Stack   : Stack_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 Stack_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 Stack_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 Stack_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_Lpt_Cntl.Advanced;