/*/////////////////////////////////////////////////////////////////////////////
	
	File	:	linklist.cpp

	Author	:	Darren Boon

	Date	:	25/02/1997

/////////////////////////////////////////////////////////////////////////////*/

#include"linklist.hpp"

template<class T>
list<T>::list()
{
	size=0;
	head=cursor=0;
}

template<class T>
Bool list<T>::is_empty()
{
	if (size==0) return True;
	else return False;
}

template<class T>
void list<T>::reset()
{
	cursor = head;
}

template<class T>
Bool list<T>::end_of_list()
{
	if (cursor==0) return True; // assuming that null == 0
	else return False;
}

template<class T>
void list<T>::advance()
{
	before = cursor;
	cursor = cursor->next;
}

template<class T>
T list<T>::current_item()
{
	return cursor->item;
}

template<class T>
void list<T>::insert_before(T item)
{
	listnode<T> *new_node = new listnode<T>;
	new_node->item=item;
	new_node->next = cursor;
	if (is_empty()==True) head = new_node;
	else if(cursor == head)
	{
		new_node->next = head;
		head = new_node;
	}
	else before->next=new_node;
	cursor = new_node;
	size++;
}

template<class T>
void list<T>::insert_after(T item)
{
	if (is_empty()==True) insert_before(item);
	else
	{
		listnode<T> *new_node = new listnode<T>;
		new_node->item=item;
		new_node->next = cursor->next;
		cursor->next=new_node;
		before=cursor;
		cursor=new_node;
		size++;
	}
}

template<class T>
void list<T>::erase()
{
	if (head == cursor)
	{
		head = cursor->next;
		delete cursor;
		cursor = head;
		size--;
	}
	else
	{
		before->next = cursor->next;
		delete cursor;
		cursor = before->next;
		size--;
	}
}

template<class T>
list<T>::~list()
{
	for(cursor = head; cursor != 0;)
	{
		head = cursor->next;
		delete cursor;
		cursor=head;
	}
}
