#include "queue.h"

Queue::Queue()
//Default constructor
{
  NumItems = 0;
  Front = 0;
  Rear = MaxQueue - 1;
}

void Queue::Insert(QElement El, int &Success)
//Inserts El in a queue.
//Pre : The queue has been created.
//Post: If the queue is not full, increments Rear and inserts El.
//      Sets Success to indicate success or failure.
{
  if (NumItems == MaxQueue)
    Success = False;                   //queue is full
  else
  {
    Rear = (Rear + 1) % MaxQueue;      //increment rear
    Items[Rear] = El;
    NumItems = NumItems + 1;
    Success = True;
  }
}

void Queue::Remove(QElement &El, int &Success)
//Removes element at front of queue and copies it to El.
//Pre : The queue has been created.
//Post:  If the queue is not empty, El contains its first
//       element, Front is decremented, and Success is True;
//       otherwise Success is False.
{
  if (NumItems == 0)
    Success = False;                      //queue is empty
  else
  {
    //Remove the element at the front of the queue
    El = Items[Front];
    Front = (Front + 1) % MaxQueue;       //increment Front
    NumItems = NumItems - 1;
    Success = True;
  }
}

void Queue::Retrieve(QElement &El, int &Success)
//Copies value at front of queue to El without removing it.
//Pre : The queue has been created.
//Post: If the queue is not empty, El contains its first element
//      and Success is True; otherwise Success is False.
{
   if (NumItems == 0)
     Success = False;    //queue is empty
   else
   {
     //Retrieve item at front of queue
     El = Items[Front];
     Success = True;
   }
}

int Queue::IsEmpty()
//Test for empty queue.
//Pre : Queue has been created.
//Post: Returns True (1) if queue is empty and
//      False (0) otherwise.
{
  return (NumItems == 0);
}

int Queue::IsFull()
//Test for full queue.
//Pre : Queue has been created.
//Post: Returns True (1) if queue is full and
//      False (0) otherwise.
{
  return (NumItems == MaxQueue);
}

int Queue::SizeOfQueue()
//Returns number of elements in queue.
{
  return NumItems;
}
