#pragma once

#include "style.h"

typedef int CollectionSize;
typedef int IteratorPosition;

class Iterator SIGNATURED
{
public:
	virtual ~Iterator();
	Logical TestInstance() const;

	virtual void First();
	virtual void Last();

	virtual void Next();
	virtual void Previous();

	void *ReadAndNextItem()		{ return ReadAndNextImplementation(); }
	void *ReadAndPreviousItem()	{ return ReadAndPreviousImplementation(); }
	void *GetCurrentItem()		{ return GetCurrentImplementation(); }

	virtual CollectionSize GetSize();
	void *GetNthItem(CollectionSize index)	{ return GetNthImplementation(index); }

	virtual Iterator& BeginIterator()	{ return BeginImplementation(); }
	virtual Iterator& EndIterator()		{ return EndImplementation(); }

	virtual Iterator& ForwardIterator()	{ return ForwardImplementation(); }
	virtual Iterator& BackwardIterator(){ return BackwardImplementation(); }

protected:
	Iterator();

	virtual void *ReadAndNextImplementation();
	virtual void *ReadAndPreviousImplementation();
	virtual void *GetCurrentImplementation();
	virtual void *GetNthImplementation(CollectionSize index);

	virtual Iterator& BeginImplementation()
	{
		First();
		return *this;
	}

	virtual Iterator& EndImplementation()
	{
		Last();
		return *this;
	}

	virtual Iterator& ForwardImplementation()
	{
		Next();
		return *this;
	}

	virtual Iterator& BackwardImplementation()
	{
		Previous();
		return *this;
	}
};