#ifndef SINGLELIST_H
#define SINGLELIST_H

/*****************************************
 *
 * Author:  Harder, Douglas Wilhelm
 * Student ID:  12345678
 * Submitted for ECE 250
 * Semester of Submission:  Fall 2006
 *
 * By submitting this file, I affirm that
 * I am the author of all modifications to
 * the provided code.
 *
 *****************************************/

#include "SingleNode.h"
#include "Exception.h"

template <typename Object>
/**************
 * Class Name *
 **************/
class SingleList {
	/**************
	 * Attributes *
	 **************/
	private:
		SingleNode<Object> * list_head;		// initialized in constructor
		SingleNode<Object> * list_tail;		// initialized in constructor
		int count;				// initialized in constructor
		
	/**************
	 * Operations *
	 **************/
	public:
		SingleList();
		SingleList( const SingleList & list );
		~SingleList();	// destroy()
		
		// Accessors (these do not modify the object itself, but rather report information)
		
		int size() const;
		bool empty() const;

		Object front() const;
		Object back() const;

		SingleNode<Object> * head() const;
		SingleNode<Object> * tail() const;

		bool member( const Object & obj ) const;

		// Mutators (these may change the object itself)

		void push_front( const Object & obj );    // no return type
		void push_back( const Object & obj );    // no return type

		Object pop_front();

		bool remove( const Object & obj );
};

template <typename Object>
SingleList<Object>::SingleList() {
	// enter your implementation here
}

template <typename Object>
SingleList<Object>::SingleList( const SingleList<Object> & list ) {
	// enter your implementation here
}

template <typename Object>
SingleList<Object>::~SingleList() {	// destroy()
	// enter your implementation here
}

template <typename Object>
int SingleList<Object>::size() const {
	// enter your implementation here
	return 0;
}

template <typename Object>
bool SingleList<Object>::empty() const {
	// enter your implementation here
	return true;
}

template <typename Object>
Object SingleList<Object>::front() const {
	// enter your implementation here
	return Object();
}

template <typename Object>
Object SingleList<Object>::back() const {
	// enter your implementation here
	return Object();
}

template <typename Object>
SingleNode<Object> * SingleList<Object>::head() const {
	// enter your implementation here
	return 0;
}

template <typename Object>
SingleNode<Object> * SingleList<Object>::tail() const {
	// enter your implementation here
	return 0;
}

template <typename Object>
bool SingleList<Object>::member( const Object & obj ) const {
	// enter your implementation here
	return false;
}

template <typename Object>
void SingleList<Object>::push_front( const Object & obj ) {    // no return type
	// enter your implementation here
}

template <typename Object>
void SingleList<Object>::push_back( const Object & obj ) {    // no return type
	// enter your implementation here
}

template <typename Object>
Object SingleList<Object>::pop_front() {
	// enter your implementation here
	return Object();
}

template <typename Object>
bool SingleList<Object>::remove( const Object & obj ) {
	// enter your implementation here
	return false;
}

#endif