#include "List.h"
#include "Element.h";

template< class T>
List<T>::List(void)
{
	this->first = NULL;
	this->count = 0;
}

template< class T>
List<T>::~List(void)
{
	Element<T> *walker = first;
	for ( int i = 0; i < this->count; i++ )
	{
		Element<T> *temp = walker->next;
		walker = walker->next;

		delete temp;
	}
}

template< class T>
void List<T>::addFirst(const T& item)
{
	Element<T> *temp = new Element<T>(item);
	if ( this->count != 0 )
	{
		temp->next = first->next;
		delete first->next;
		first = temp;
	}
	else
		first = temp;

	this->count += 1;
}

template< class T>
void List<T>::addElementAt(int index, const T& item)
{
	Element<T> *temp = new Element<T>(item);
	Element<T> *walker = this->first;

	if ( index > this->count )
	{	
		for ( int i = 0; i < this->count; i ++ )
		{
			walker = walker->next;
		}
		walker->next = temp;
	}
	else
	{	
		for ( int i = 0; i <= index; i ++ )
		{
			walker = walker->next;
		}
		temp->next = walker->next;
		walker->next = temp;
	}
}

template< class T>
bool List<T>::deleteElementAt(int index)
{
	if ( index > this->count )
		return false

	else
	{
		Element<T> *walker = this->first;
		for ( int i = 0; i < index; i ++ )
		{
			walker = walker->next;
		}
		
		Element<T> *temp = walker->next;
		walker->next = walker->next->next;

		delete temp;
	}

	return true;
}

template< class T>
bool List<T>::deleteElement(const T& item)
{
	Element<T> *walker = this->first;
	for ( int i = 0 ; i < this->count; i++ )
	{
		if ( walker->next->data == item )
		{
		
			Element<T> *temp = walker->next;
			walker->next = walker->next->next;

			delete temp;

			return true;
		}
		else
			walker = walker->next;
	}

	return false;
}

template< class T>
bool List<T>::isEmpty() const
{
	if ( this->count > 0 )
		return false;

	return true;
}

template< class T>
bool List<T>::set(int index, const T& item)
{
	if ( index > this->count )
		return false

	else
	{
		Element<T> *walker = this->first;

		for ( int i = 0; i <= this->count; i ++ )
		{
			walker = walker->next;
		}
		walker->data = item;
	}

	return true;
}

template< class T>
T List<T>::get(int index) const
{
	if ( index > this->count )
		return NULL

	else
	{
		Element<T> *walker = this->first;

		for ( int i = 0; i <= this->count; i ++ )
		{
			walker = walker->next;
		}
		return walker->data;
	}

	return NULL;
}

template< class T>
int List<T>::size()
{
	return this->count;
}
