// P.J. Waskiewicz  4/15/1998
// File: Tqueue.cc
// Implementation of queue ADT using a linked list

#include "Tqueue.h"

template <class T>
Queue <T>::Queue()
{
  // set both front and rear to null pointers
  f = 0;
  r = 0;
}

template <class T>
void Queue <T>::enqueue(T e)
{
  // create a new node, insert it at the rear of the queue
  nodePtr n(new Node);
  assert(n);
  n->next = 0;
  n->data = e;
  if(f != 0) { // existing queue is not empty
    r->next = n; // add new element to end of list
    r = n;
  }
  else { // adding first item in the queue
    f = n; // so front, rear must be same node
    r = n;
  }
}

template <class T>
T Queue<T>::dequeue()
{
  assert(f); // make sure queue is not empty
  nodePtr n(f);
  T frontElement(f->data);
  f = f->next;
  delete n;
  if(f == 0) // we're deleting last node
    r = 0;
  return frontElement;
}

template <class T>
T Queue<T>::front()
{
  assert(f);
  return f->data;
}

template <class T>
bool Queue<T>::isEmpty()
{
  // true if the queue is empty -- when f is a null pointer
  return f == 0;
}