#include "../List.h"
#include <iostream>
#include <cstddef>

using std::cout; using std::endl;


int main()
{
	List<int> l;

	l.push_back(new ListNode<int>(1));
	l.push_back(new ListNode<int>(2));
	l.push_back(new ListNode<int>(3));
	l.push_back(new ListNode<int>(4));
	l.push_back(new ListNode<int>(5));
	l.push_back(new ListNode<int>(6));
	l.push_back(new ListNode<int>(7));
	l.push_back(new ListNode<int>(8));

	cout << "List:" << endl;
	for (List<int>::iterator i = l.begin(); i != l.end(); ++i) {
		cout << *i << endl;
	}
	cout << endl;


	for (List<int>::iterator i = l.begin(); i != l.end(); ++i) {
		if ((*i) == 4)
			l.remove(i);
	}

	std::cerr << "Removed 4 (by iterator)...\n";
	for (List<int>::iterator i = l.begin(); i != l.end(); ++i) {
		cout << *i << endl;
	}
	cout << endl;
	
	l.remove(1);

	std::cerr << "Removed 1 (head) (by value)...\n";
	for (List<int>::iterator i = l.begin(); i != l.end(); ++i) {
		cout << *i << endl;
	}
	cout << endl;
	
	for (List<int>::iterator i = l.begin(); i != l.end(); ++i) {
		if ((*i) == 2)
			l.remove(i);
	}

	std::cerr << "Removed 2 (head) (by iterator)...\n";
	for (List<int>::iterator i = l.begin(); i != l.end(); ++i) {
		cout << *i << endl;
	}
	cout << endl;
	
	l.remove(5);

	std::cerr << "Removed 5 (by value)...\n";
	for (List<int>::iterator i = l.begin(); i != l.end(); ++i) {
		cout << *i << endl;
	}
	cout << endl;
	
	l.remove(8);

	std::cerr << "Removed 8 (tail) (by value)...\n";
	for (List<int>::iterator i = l.begin(); i != l.end(); ++i) {
		cout << *i << endl;
	}
	cout << endl;
	
	for (List<int>::iterator i = l.begin(); i != l.end(); ++i) {
		if ((*i) == 7)
			l.remove(i);
	}

	std::cerr << "Removed 7 (tail) (by iterator)...\n";
	for (List<int>::iterator i = l.begin(); i != l.end(); ++i) {
		cout << *i << endl;
	}
	cout << endl;

	List<int> r;
	r.push_back(new ListNode<int>(9));
	r.remove(9);
	std::cerr << "Should not see ANY numbers:\n";
	for (List<int>::iterator i = r.begin(); i != r.end(); ++i) {
		cout << *i << endl;
	}
	return 0;
}