#include <queue>
using namespace std;
#ifndef _SI221QUEUE_
#define _SI221QUEUE_

/***************************************************
* This is a nice definition of a class queue that
* matches the abstract data type for queue given
* in "Data Structures and Other Objects Using C++".
***************************************************/
template<class DataType>
class Queue {
public:

  Queue();
  ~Queue();
  bool isEmpty() const;
  void push(const DataType& val);
  void pop();
  DataType getFront() const;

private:

  Queue(const Queue& Q) {}
  Queue& operator=(const Queue& Q) {}
  queue<DataType> *I;
};


/***************************************************
** DON'T LOOK BELOW THIS LINE! ********************
***************************************************/
template<class T>
Queue<T>::Queue() {
  I = new queue<T>;
}

template<class T>
Queue<T>::~Queue() {
  delete I;
}

template<class T>
bool Queue<T>::isEmpty() const {
  return I->empty();
}

template<class T>
void Queue<T>::push(const T& val) {
  I->push(val);
}

template<class T>
void Queue<T>::pop() {
  I->pop();
}

template<class T>
T Queue<T>::getFront() const {
  return I->front();
}

#endif // ifndef _SI221QUEUE_
