#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; } };