/*-------------------------------------------------------*/
/* ProjectOmega                 									*/
/* Written by T.Miles												*/
/* ID: 289175															*/
/* Module:	Array Class	  										   */
/* Dynamic Array storage template								*/
/*-------------------------------------------------------*/

#ifndef _ARRAY_H
#define _ARRAY_H

#include <iostream.h>

template <class T>
class Array{
private:
	T *array;
	int arraySize;
	int maxSize;
	void Grow();
public:
	Array();
	~Array();
	void AddItem(T);
	int GetSize(){return arraySize;};
	T GetItem(int);
	T *GetItemAddress(int);
	void PutItem(int, T);
	void InsertItem(int,T);
	void DeleteItem(int);
	T operator [] (int);
};

template <class T>
Array<T>::Array(){
	arraySize=0;
	maxSize=1;
	array=new T;
}

template <class T>
Array<T>::~Array(){
	delete []array;
}

// Adds item to end of array
template <class T>
void Array<T>::AddItem(T item){
	if (arraySize==maxSize)
		Grow();
	array[arraySize++]=item;
}
	
template <class T>
void Array<T>::Grow(){
	T *oldArray=array;
	array=new T[maxSize*2];
	if (array){
		for (int n=0;n<arraySize;n++)
			array[n]=oldArray[n];
		delete[] oldArray;
		maxSize*=2;
	}
	else
		cout << "Unable to grow array" << endl;
//	cout << "Array Grown to " << maxSize << endl;
}

template <class T>
T Array<T>::GetItem(int index){
	if (index<arraySize && index>=0)
		return array[index];
}

template <class T>
T *Array<T>::GetItemAddress(int index){
	if (index<arraySize && index>=0)
		return &array[index];
}

template <class T>
T Array<T>::operator [] (int index){
	if (index < arraySize && index>=0)
		return array[index];
}

template <class T>
void Array<T>::PutItem(int index, T item){
	if (index <arraySize && index>=0)
		array[index]=item;
}

template <class T>
void Array<T>::InsertItem(int index, T item){
	if (arraySize+1 == maxSize)
		Grow();
	if (index<arraySize && index>0){
		for (int n=index;n<arraySize;n++)
			array[n]=array[n-1];
		array[index]=item;
		arraySize++;
	}
}	

template <class T>
void Array<T>::DeleteItem(int index){
	if (index==arraySize-1){
		arraySize--;
		if (arraySize<0)
			arraySize=0;
	}
	else
	if (index <arraySize-1 && index>=0){
		for (int n=index;n<arraySize-1;n++)
			array[n]=array[n+1];
		arraySize--;
	}
}

#endif