#ifndef __SET_HPP__
#define __SET_HPP__
#include "containers/EmptyContainer.hpp"
#include "MutableContainer.hpp"
#include "MutableContainerAdapter.hpp"
#include "ModifiableContainer.hpp"
#include "PositionFactory.hpp"
#include "Map.hpp"
#include "defines.h"
class List;
class SetPosition;
class SetPositionFactory;
class Set : public virtual MutableContainerAdapter,
public ModifiableContainer
{
friend SetPositionFactory;
friend SetPosition;
public: Set();
public: virtual ~Set();
public: virtual MutablePositionEnumeration *getMutableEnumeration() const;
public: virtual Top *setValue( MutablePosition *aPosition, Top *aNewValue );
public: virtual Top *getValue( const Position *aPosition );
public: virtual PositionFactory *getDefaultPositionFactory() const;
public: virtual boolean canRemoveSlot( Position *aPosition ) const;
public: virtual void removeSlot( Position *aPosition );
public: virtual void add( const Top *anObject );
public: virtual Top *getAny() const THROWS( EmptyContainer * );
public: virtual Top *getAndRemove() const;
public: virtual boolean isEmpty() const;
public: virtual Index getCardinality() const;
public: virtual Top *clone() const;
public: virtual String getClassName() const;
protected: Set( List *aCore );
protected: Position *unify( const Top *anObject ) const;
protected: MutablePosition *getNew( const Top *anObject ) const;
protected: List *getCore() const;
#if defined( TESTING )
public: virtual boolean tester( int aParam ) const;
#endif
protected: List *core;
};
class SetPositionFactory : public PositionFactory,
public virtual Object
{
public: SetPositionFactory( Set *aSet );
public: ~SetPositionFactory();
public: virtual MutablePosition *createPosition();
protected: Set *set;
};
class SetPosition : public MutablePosition,
public virtual PositionAdapter
{
public: SetPosition( Set *aContainer );
public: virtual ~SetPosition();
public: void setCore( MutablePosition *aCorePosition );
public: virtual boolean isValid () const;
public: virtual Top *setValue( Top *aNewValue );
public: virtual Top *getValue() const;
public: virtual String getClassName() const;
public: Set *getSet() const;
protected: MutablePosition *corePosition;
};
class SetPositionMap : public Map,
virtual public Object
{
public: SetPositionMap( Set *aSet );
public: virtual ~SetPositionMap();
public: virtual Top *apply( Top *anArg );
protected: Set *set;
};
#endif