#ifndef __STACK_HPP__
#define __STACK_HPP__
#include "PuncturedContainer.hpp"
#include "ModifiableContainer.hpp"
#include "ContainerAdapter.hpp"
#include "MutableLayeredContainer.hpp"
#include "EmptyStack.hpp"
#include "PositionAdapter.hpp"
#include "defines.h"
class List;
class FromTopOfStackPosition;
class FromBottomOfStackPosition;
class Stack : virtual public ModifiableContainer,
virtual public PuncturedContainer,
virtual public MutableLayeredContainer,
virtual public ContainerAdapter
{
friend FromTopOfStackPosition;
friend FromBottomOfStackPosition;
public: Stack();
public: Stack( Stack &aSource );
public: virtual ~Stack();
public: virtual void push( Top *anElement );
public: virtual Top *pop() THROWS( EmptyStack * );
public: virtual void dup();
public: virtual void swap() THROWS( EmptyStack * );
public: virtual Top *exchange( Top *anElement ) THROWS( EmptyStack * );
public: virtual Top *top() const THROWS( EmptyStack * );
public: virtual PositionFactory *getDefaultPositionFactory() const;
public: virtual boolean canRemoveSlot( Position *aPosition ) const;
public: virtual void removeSlot( Position *aPosition );
public: virtual boolean isEmpty() const;
public: virtual PositionEnumeration *getEnumeration() const;
public: virtual MutablePositionEnumeration *getMutableEnumeration() const;
public: virtual Index getCardinality() const;
public: virtual boolean isValid( const Position *aPosition ) const;
public: virtual Position *getCurrentPunct() const;
public: virtual Position *getAlwaysPunct() const;
protected: virtual MutableContainer *getBaseMutableContainer() const;
public: virtual Top *clone() const;
public: virtual String getClassName() const;
#if defined( TESTING )
boolean tester( int ) const;
#endif
protected: void init();
protected: List *elements;
};
abstract class StackPosition : virtual public PositionAdapter
{
public: StackPosition( const Stack *aHost, const Index anOffset );
public: Stack *getStack() const;
public: virtual boolean isValid () const;
protected: const Stack *stack;
protected: const Index offset;
};
class FromTopOfStackPosition : public StackPosition
{
public: FromTopOfStackPosition( const Stack *aHost, const Index anOffset );
public: virtual Top *getValue() const;
};
class FromBottomOfStackPosition : public StackPosition
{
public: FromBottomOfStackPosition( const Stack *aHost, const Index anOffset );
public: virtual Top *getValue() const;
};
#endif