generic

  type Element is private;

package Queues_Generic is
------------------------------------------------------------------------
--| Specification for Generic FIFO Queues Package
--| Author: Michael B. Feldman, The George Washington University 
--| Last Modified: January 1996                                     
------------------------------------------------------------------------
  -- type definition

  type Queue (Capacity: Positive) is limited private;

  -- exported exceptions

  QueueFull  : exception;
  QueueEmpty : exception;

  -- constructors

  procedure MakeEmpty (Q : in out Queue);
  -- Pre:    Q is defined
  -- Post:   Q is empty

  procedure Enqueue (Q : in out Queue; E : in Element);
  -- Pre:    Q and E are defined
  -- Post:   Q is returned with E as the top Element
  -- Raises: QueueFull if Q already contains Capacity Elements

  procedure Dequeue (Q : in out Queue);
  -- Pre:    Q is defined
  -- Post:   Q is returned with the top Element discarded
  -- Raises: QueueEmpty if Q contains no Elements

  -- selector

  function First (Q : in Queue) return Element;
  -- Pre:    Q is defined
  -- Post:   The first Element of Q is returned
  -- Raises: QueueEmpty if Q contains no Elements

  -- inquiry operations

  function IsEmpty (Q : in Queue) return Boolean;
  -- Pre:    Q is defined
  -- Post:   returns True if Q is empty, False otherwise

  function IsFull  (Q : in Queue) return Boolean;
  -- Pre:    Q is defined
  -- Post:   returns True if Q is full, False otherwise

private

  type List is array (Positive range <>) of Element;
  type Queue (Capacity: Positive) is record
    Tail  : Natural := 0;
    Store : List(1..Capacity);
  end record;

end Queues_Generic;