#include "oop.h"

Iterator::Iterator(oop anObject)
{
  mIterator= anObject->iterator();
}

Iterator::~Iterator(void)
{
  delete mIterator;
}

int Iterator::atEnd(void)
{
  return mIterator->atEnd();
}

oop Iterator::element(void)
{
  return mIterator->element();
}

oop Iterator::step(void)
{
  return mIterator->step();
}

oop Iterator::operator *(void)
{
  return element();
}

///

ArrayIterator::ArrayIterator(oop array)
{
  mArray= array;
  mIndex= 0;
  mLimit= array->size();
}

int ArrayIterator::atEnd(void)
{
  return mIndex >= mLimit;
}

oop ArrayIterator::element(void)
{
  return (mIndex >= mLimit) ? 0 : mArray->at(mIndex);
}

oop ArrayIterator::step(void)
{
  ++mIndex;
  return (mIndex >= mLimit) ? 0 : mArray->at(mIndex);
}

///

SetIterator::SetIterator(oop set) : ArrayIterator(set->array())
{
  mElement= ArrayIterator::element();
}

oop SetIterator::element(void)
{
  while ((!mElement) && (!ArrayIterator::atEnd()))
    mElement= ArrayIterator::step();
  return mElement;
}

int SetIterator::atEnd(void)
{
  return !element();
}

oop SetIterator::step(void)
{
  mElement= 0;
  return element();
}

