#ifndef __ENUMERATIONALGORITHMS_HPP__
#define __ENUMERATIONALGORITHMS_HPP__
#include "Object.hpp"
#include "algorithms/AlgorithmPackage.hpp"
#include "containers/Container.hpp"
#include "iter/enumerations/ResettableEnumeration.hpp"
#include "defines.h"
interface Enumeration;
interface ResettableEnumeration;
interface Cursor;
interface Container;
interface ModifiableContainer;
interface PositionFactory;
class EnumerationAlgorithms : public virtual AlgorithmPackage,
public virtual Object
{
public: virtual Index findIndex( Enumeration *anEnum,
const Top *anObject,
const Index aMaxSearch ) const;
public: virtual Index getCardinality( Enumeration *anEnum );
public: virtual boolean contains( Enumeration *anEnum, const Top *anElement );
public: virtual Container *getAsContainer( ResettableEnumeration *anEnum );
public: virtual boolean add( ModifiableContainer *aContainer, Enumeration *anEnum );
public: virtual boolean addAt( PositionFactory *aFactory, Enumeration *anEnum );
public: virtual ResettableEnumeration *getFromContainer( Container *aContainer );
public: virtual ResettableEnumeration *getSum( ResettableEnumeration *aFirst,
ResettableEnumeration *aSecond );
public: virtual ResettableEnumeration *getUnion( ResettableEnumeration *aFirst,
ResettableEnumeration *aSecond );
public: virtual ResettableEnumeration *getIntersection( ResettableEnumeration *aFirst,
ResettableEnumeration *aSecond );
public: virtual ResettableEnumeration *getProd( ResettableEnumeration *aFirst,
ResettableEnumeration *aSecond );
public: virtual ResettableEnumeration *getInterleaved( ResettableEnumeration *anEnum,
ResettableEnumeration *aSecond );
public: EnumerationAlgorithms();
public: virtual ~EnumerationAlgorithms();
public: static EnumerationAlgorithms *get();
public: virtual Top *clone() const;
public: virtual String getClassName() const;
protected: static EnumerationAlgorithms *instance;
#if defined( TESTING )
public: virtual boolean tester( int ) const;
#endif
};
abstract class EnumUnaryOp : public ResettableEnumeration
{
public: EnumUnaryOp( ResettableEnumeration *aFirst );
public: virtual ~EnumUnaryOp();
public: virtual void reset();
protected: ResettableEnumeration *firstArg;
};
abstract class EnumBinaryOp : public EnumUnaryOp
{
public: EnumBinaryOp( ResettableEnumeration *aFirst, ResettableEnumeration *aSecond );
public: virtual ~EnumBinaryOp();
public: virtual void reset();
protected: ResettableEnumeration *secondArg;
};
class SumEnumeration : public EnumBinaryOp,
public virtual Object
{
public: SumEnumeration( ResettableEnumeration *aFirst,
ResettableEnumeration *aSecond );
public: virtual ~SumEnumeration();
public: virtual Top *getNextElement();
public: virtual boolean hasMoreElements();
public: virtual void reset();
public: virtual Top *clone() const;
protected: boolean firstDone;
};
class UnionEnumeration : public EnumBinaryOp,
public virtual Object
{
public: UnionEnumeration( ResettableEnumeration *aFirst,
ResettableEnumeration *aSecond );
public: virtual ~UnionEnumeration();
public: virtual Top *getNextElement();
public: virtual boolean hasMoreElements();
public: virtual void reset();
public: virtual Top *clone() const;
protected: virtual boolean getNextElementInternal();
protected: Top *cachedObject;
protected: boolean firstDone;
protected: boolean cacheValid;
protected: boolean hasMore;
};
class IntersectionEnumeration : public EnumBinaryOp,
public virtual Object
{
public: IntersectionEnumeration( ResettableEnumeration *aFirst,
ResettableEnumeration *aSecond );
public: virtual ~IntersectionEnumeration();
public: virtual Top *getNextElement();
public: virtual boolean hasMoreElements();
public: virtual void reset();
public: virtual Top *clone() const;
protected: virtual boolean getNextElementInternal();
protected: Top *cachedObject;
protected: boolean cacheValid;
protected: boolean hasMore;
};
class ContainerEnumeration : public ResettableEnumeration,
public virtual Object
{
public: ContainerEnumeration( Container *aContainer );
public: virtual ~ContainerEnumeration();
public: virtual Top *getNextElement();
public: virtual boolean hasMoreElements();
public: virtual void reset();
public: virtual Top *clone() const;
protected: Container *container;
protected: Enumeration *en;
};
class ProdEnumeration : public EnumBinaryOp,
public virtual Object
{
public: ProdEnumeration( ResettableEnumeration *aFirst,
ResettableEnumeration *aSecond );
public: virtual ~ProdEnumeration();
public: virtual Top *getNextElement();
public: virtual boolean hasMoreElements();
public: virtual void reset();
public: virtual Top *clone() const;
protected: const boolean isEmpty;
protected: Top *rowObject;
};
class InterleavedEnumeration : public EnumBinaryOp,
public virtual Object
{
public: InterleavedEnumeration( ResettableEnumeration *aFirst,
ResettableEnumeration *aSecond );
public: virtual ~InterleavedEnumeration();
public: virtual Top *getNextElement();
public: virtual boolean hasMoreElements();
public: virtual void reset();
public: virtual Top *clone() const;
protected: ResettableEnumeration *current;
};
typedef EnumerationAlgorithms EAlg;
#endif