package com.db4o.lib;

class LinkedListIterator implements Iterator
{
	private Collection i_collection;

	private LinkedListObject i_previous;
	private LinkedListObject i_current;
	private LinkedListObject i_next;

	LinkedListIterator(Collection a_Collection, Object a_first){
		i_collection = a_Collection;
		i_next = (LinkedListObject)a_first;
	}

	public Object current(){
		if (i_current != null){
			return i_current.i_object;
		}
		return null;
	}

	public boolean hasNext(){
		return i_next != null;
	}

	public Object next(){
		if (i_current != null){
			// the condition accounts for remove
			i_previous = i_current;
		}
		i_current = i_next;
		if (i_next != null){
			i_next = i_next.i_next;
			return i_current.i_object;
		}
		return null;
	}

	public void remove(){
		if(i_current != null){
			if (i_current == (LinkedListObject)i_collection.getFirst()){
				i_collection.setFirst(i_next);
			}
			if (i_previous != null){
				((LinkedListObject)i_previous).i_next = i_next;
			}
			i_current = null;
			i_collection.sizeDecrement();
		}

	}

	void reset(Collection a_collection){
		i_collection = a_collection;
		reset();
	}

	public void reset(){
		i_next = (LinkedListObject)i_collection.getFirst();
		i_current = null;
		i_previous = null;
	}

	public int size(){
		return i_collection.size();
	}
}
