/*
	Programmer: Mark Dehus
	Compiles and runs fine on VC7.1, MiniGW, GCC
	and any other UP TO DATE ANSI STANDARD Compilers.

	VC6 is NOT an ANSI standard compiler and I am not
	responsible for whatever out of date junk it may produce.
*/

#include <iostream>
#include "queue.h"

using namespace std;

queue::queue(int s)
{
	queueArray = new int[s];
	queueSize = s;
	front = 0;
	rear = 0;
	numItems = 0;

	for (int i = 0; i < s; i++)
		queueArray[i] = -1;
}

queue::~queue()
{
	delete [] queueArray;
}

void queue::resize(int s)
{
	// Init a temp array to hold data
	tempArray = new int[queueSize];


	// Make a copy of the main array
	if (!isEmpty())
	{
		for (int i = 0; i < queueSize; i++)
			tempArray[i] = queueArray[i];
	}

	delete [] queueArray;

	queueArray = new int[s];
	
	if (!isEmpty())
	{
		numItems = 0;
		for (int i = 0; i < queueSize; i++)
		{
			queueArray[i] = tempArray[i];
			numItems++;
		}
	}

	delete [] tempArray;
}

void queue::enqueue(int num)
{
	if (isFull())
		cout << "The queue is full.\n";
	else{
		// Calc the new rear pos
  		rear = (rear + 1) % queueSize;
		// put in a new item
		queueArray[rear] = num;
		// update item count
		numItems++;
    }
}

int queue::dequeue()
{
	if (isEmpty())
		cout << "The queue is empty.\n";
	else
	{
		// Send to front
		front = (front + 1) % queueSize;
		// Update item count
		numItems--;
		return queueArray[front];
	}

	return -1;
}

bool queue::isEmpty()
{
	bool status;
	
	if (numItems)
		status = false;
	else
		status = true;
		
	return status;
}

bool queue::isFull()
{
	bool status;
	
	if (numItems < queueSize)
		status = false;
	else
		status = true;

	return status;
}

void queue::clear()
{
	front = queueSize - 1;
	rear = queueSize -1;
	numItems = 0;
}
