package body QueuesGeneric is

 

  procedure makeEmpty (Q : in out queue ) is

     begin

       Q.tail := 0;

     end makeEmpty;

    

  procedure Enqueue (Q : in out Queue;  E : in Element) is

     begin

       if Q.tail = q.capacity then

          raise QueueFull;

       else

          Q.tail := q.tail + 1;

          Q.store (Q.tail) := E;

       end if;

     end Enqueue;

    

   procedure Dequeue (Q : in out Queue) is

      begin

        if q.tail = 0 then

           raise QueueEmpty;

        else

           Q.store(1..Q.tail-1) := Q.store (2..Q.tail); -- slice

           Q.tail := Q.tail - 1;

        end if;

      end Dequeue;

     

    function first (Q : in Queue) return Element is

       begin

         if q.tail = 0  then

            raise QueueEmpty;

         else

            return Q.Store(1);

         end if;

       end first;

      

     function isEmpty (Q: in Queue) return boolean is

        begin

          return Q.tail = 0;

        end IsEmpty;

       

     function isFull (Q : in Queue) return Boolean is

        begin

          return Q.tail = Q.capacity;

        end isFull;

       

     end QueuesGeneric;