--::::::::::
--qulplpad.ads   --       -Advanced
--::::::::::
with Queue_LPBase.Advanced;
generic
package Queue_Lpt_Lpt.Advanced is
   -----------------------------------------------
   -- DO NOT USE adv_lpq
      package adv_lpq is new lpq.Advanced;
   -----------------------------------------------

function Size (Queue: Queue_Type) return natural;
   -----------------------------------------------
   -- Pre  Cond  : None
   -- Post Cond  : Returns #(Queue)
   -- Exceptions : None
   -----------------------------------------------

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

function Eq (Queue_1, Queue_2: Queue_Type;
             Eq:  Eq_Type) return boolean;
   -----------------------------------------------
   -- Pre  Cond  : None
   -- Post Cond  : Returns (#(Queue_1) = #(Queue_2),
   --              FORALL i IN #(Queue_1),  Queue_1(i)=Queue_2(i))
   -- Exceptions : None
   -----------------------------------------------

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

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

function Peek (Queue   : Queue_Type;
               Position: positive  ) return Object_Type;
   -----------------------------------------------
   -- Pre  Cond  : 1 <= Position <= #(Queue)
   --              1 = Front, #(Queue) = Rear
   -- Post Cond  : Returns Queue(Position)
   -- Exceptions : Invalid_Position
   -----------------------------------------------

procedure Poke (Queue   : in out Queue_Type;
                Position: in     positive;
                Object  : in out Object_Type);
   -----------------------------------------------
   -- Pre  Cond  : 1 <= Position <= #(Queue)
   --              1 = Front, #(Queue) = Rear
   -- Post Cond  : Object' = Queue(Position)
   -- Exceptions : Invalid_Position
   -- NOTE:   Swap used to exchange value of Object_Type
   -----------------------------------------------

end Queue_Lpt_Lpt.Advanced;