#ifndef __LIST_HPP__
#define __LIST_HPP__
#include "OGuard.hpp"
#include "containers/PuncturedContainer.hpp"
#include "containers/RangedContainer.hpp"
#include "containers/PositionAdapter.hpp"
#include "containers/PositionFactory.hpp"
#include "containers/MutablePosition.hpp"
#include "containers/MutablePositionEnumeration.hpp"
#include "containers/MutableContainerAdapter.hpp"
#include "containers/ModifiableContainer.hpp"
#include "VersionedObject.hpp"
#include "iter/enumerations/TypedEnumeration.hpp"
#include "iter/enumerations/ResettableEnumeration.hpp"
#include "defines.h"
#if defined( USE_PER_CLASS_NEW )
#include "MemoryAllocator.hpp"
#endif
#include <stdarg.h>
class LGuard;
class ListEnumeration;
class ListPosition;
class ListCurrentPosition;
class EmptyContainer;
interface Top;
interface ListNode;
interface ListNodeFactory;
interface ListTailFactory;
interface ListHeadFactory;
interface ListCurrentFactory;
class List : public RangedContainer,
public ModifiableContainer,
public PuncturedContainer,
public virtual MutableContainerAdapter,
public virtual Object
{
friend LGuard;
friend ListEnumeration;
public: List();
public: List( List &aSource );
public: virtual ~List();
public: virtual Position *getCurrentPunct() const;
public: virtual Position *getAlwaysPunct() const;
public: virtual void clearAll();
public: virtual TypedEnumeration< ListNode > *getNodeEnumeration() const;
public: virtual boolean isFirst() const;
public: virtual boolean isLast() const;
public: virtual boolean atEnd() const;
public: virtual void next() THROWS( AfterLast * );
public: virtual void prev() THROWS( BeforeFirst * );
public: virtual Top *getCurrentValue() THROWS( AfterLast * );
public: virtual Top *setCurrentValue( Top *aNewValue ) THROWS( AfterLast * );
public: virtual void toFirst();
public: virtual void toLast();
public: virtual Index length() const;
public: virtual Top *car() const THROWS( EmptyContainer * );
public: virtual List *cdr() THROWS( EmptyContainer * );
public: virtual List *map( Map *aMap );
public: virtual List *append( Top *aValue );
public: virtual List *prepend( Top *aValue );
public: virtual void insert( Top *aValue );
public: virtual Top *behead() THROWS( EmptyContainer * );
public: virtual Top *betail() THROWS( EmptyContainer * );
public: virtual Top *remove() THROWS( AfterLast * );
public: virtual boolean isValidNode( const ListNode *aNode ) const;
public: virtual ListNodeFactory *getNodeFactory() const;
public: virtual void setNodeFactory( ListNodeFactory *aFactory );
public: virtual Index getLowBound() const;
public: virtual Index getHighBound() const;
public: virtual void setCurrentAt( const Index anIndex );
public: virtual Index getCurrentIndex() const;
public: virtual MutablePositionEnumeration *getMutableEnumeration() const;
public: virtual Top *getAt( const Index anIndex ) const;
public: virtual Top *setAt( const Index anIndex, Top *aNewValue );
public: virtual boolean isEmpty() const;
public: virtual PositionEnumeration *getEnumeration() const;
public: virtual Index getCardinality() const;
public: virtual boolean isValid( const Position *aPosition ) const;
public: virtual ListPosition *getCurrentPosition() const THROWS( AfterLast * );
public: virtual ListCurrentPosition *getPositionToCurrent() const;
public: virtual PositionFactory *getDefaultPositionFactory() const;
public: virtual boolean canRemoveSlot( Position *aPosition ) const;
public: virtual void removeSlot( Position *aPosition );
public: virtual ListTailFactory *getTailFactory() const;
public: virtual ListHeadFactory *getHeadFactory() const;
public: virtual ListCurrentFactory *getCurrentFactory() const;
public: virtual boolean equals( const Top *anOther ) const;
public: virtual Top *clone() const;
public: virtual String toString() const;
public: virtual String getClassName() const;
public: virtual boolean invariant() const;
#if defined( TESTING )
public: virtual boolean tester( int aParam ) const;
#endif
protected: List( ListNode *head, ListNode *tail, ListNode *current );
protected: void init();
protected: ListNode *getHead() const;
protected: ListNode *getTail() const;
protected: ListNode *getCurrent() const;
protected: void setHead( ListNode *aNode );
protected: void setTail( ListNode *aNode );
protected: void setCurrent( ListNode *aNode );
protected: ListNode *getNewNode( Top *aValue ) const;
protected: void appendNode( ListNode *aNode );
protected: void prependNode( ListNode *aNode );
protected: void insertNode( ListNode *aNode ) THROWS( AfterLast * );
protected: ListNode *current;
protected: ListNode *head;
protected: ListNode *tail;
protected: ListNodeFactory *factory;
};
class LGuard : public OGuard
{
public: LGuard( const List *aTarget, const Top *anOwner );
public: virtual ~LGuard();
protected: List *list;
protected: ListNode *savedCurrent;
};
class ListPosition : public MutablePosition,
public virtual PositionAdapter
{
public: ListPosition( List *aContainer, ListNode *aNode );
public: virtual ~ListPosition();
public: virtual Top *setValue( Top *aNewValue );
public: virtual boolean isValid () const;
public: virtual Top *getValue() const;
protected: ListNode *node;
#if defined( USE_PER_CLASS_NEW )
public: void *operator new( size_t size );
public: void operator delete( void *anAddress );
protected: static MemoryAllocator *getAllocator();
protected: static MemoryAllocator *allocator;
#endif
};
class ListNodeEnumeration : public ResettableEnumeration,
public TypedEnumeration< ListNode >,
public virtual Object
{
public: ListNodeEnumeration( ListNode *aFrom, ListNode *aTo );
public: virtual ~ListNodeEnumeration();
public: virtual ListNode *getNextTypedElement();
public: virtual Top *getNextElement();
public: virtual boolean hasMoreElements();
public: virtual void reset();
protected: ListNode *first;
protected: ListNode *last;
protected: ListNode *current;
};
class ListEnumeration : public MutablePositionEnumeration,
public virtual Object
{
public: ListEnumeration( List *aList );
public: virtual ~ListEnumeration();
public: virtual MutablePosition *getNextMutablePosition() THROWS( InvalidArgument * );
public: virtual boolean hasMoreElements() THROWS( InvalidArgument * );
protected: List *list;
protected: ListNode *current;
protected: static String madeInvalid;
};
class ListCurrentPosition : public MutablePosition,
public virtual PositionAdapter
{
public: ListCurrentPosition( const List *aContainer );
public: virtual ~ListCurrentPosition();
public: virtual Top *setValue( Top *aNewValue );
public: virtual boolean isValid () const;
public: virtual Top *getValue() const;
};
abstract class ListPositionFactory : public PositionFactory,
public virtual Object
{
public: ListPositionFactory( const List *aList );
public: virtual ~ListPositionFactory();
public: virtual MutablePosition *createPosition();
public: virtual ListPosition *createListPosition() = 0;
protected: List *list;
};
class ListTailFactory : public ListPositionFactory
{
public: ListTailFactory( const List *aList );
public: virtual ListPosition *createListPosition();
};
class ListHeadFactory : public ListPositionFactory
{
public: ListHeadFactory( const List *aList );
public: virtual ListPosition *createListPosition();
};
class ListCurrentFactory : public ListPositionFactory
{
public: ListCurrentFactory( const List *aList );
public: virtual ListPosition *createListPosition();
};
#endif