#ifndef LIST_H_ #define LIST_H_ #include #include "StartConv.h" // Incomplete class declarations for // the const_iterator, iterator, and list, // because all these classes refer to each other. template class ConstListItr; template class ListItr; template class list; // The basic doubly linked list node. // Everything is private, and is accessible // only by the iterators and list classes. template class ListNode { Object data; ListNode *prev; ListNode *next; ListNode( const Object & d = Object( ), ListNode * p = NULL, ListNode * n = NULL ) : data( d ), prev( p ), next( n ) { } friend class ConstListItr; friend class ListItr; friend class list; }; template class list { public: typedef ListItr iterator; typedef ConstListItr const_iterator; list( ); ~list( ); list( const list & rhs ); const list & operator= ( const list & rhs ); iterator begin( ); const_iterator begin( ) const; iterator end( ); const_iterator end( ) const; int size( ) const; bool empty( ) const; Object & front( ); const Object & front( ) const; Object & back( ); const Object & back( ) const; void push_front( const Object & x ); void push_back( const Object & x ); void pop_front( ); void pop_back( ); iterator insert( iterator itr, const Object & x ); iterator erase( iterator itr ); iterator erase( iterator start, iterator end ); friend class ConstListItr; friend class ListItr; private: typedef ListNode node; int theSize; node *head; node *tail; void init( ); void makeEmpty( ); }; template class ConstListItr { public: ConstListItr( ); virtual ~ConstListItr( ) { } virtual const Object & operator* ( ) const; ConstListItr & operator++ ( ); ConstListItr operator++ ( int ); ConstListItr & operator-- ( ); ConstListItr operator-- ( int ); bool operator== ( const ConstListItr & rhs ) const; bool operator!= ( const ConstListItr & rhs ) const; protected: typedef ListNode node; node *head; node *current; friend class list; void assertIsInitialized( ) const; void assertIsValid( ) const; void assertCanAdvance( ) const; void assertCanRetreat( ) const; Object & retrieve( ) const; ConstListItr( const list & source, node *p ); }; template class ListItr : public ConstListItr { public: ListItr( ); Object & operator* ( ); const Object & operator* ( ) const; ListItr & operator++ ( ); ListItr operator++ ( int ); ListItr & operator-- ( ); ListItr operator-- ( int ); protected: typedef ListNode node; friend class list; ListItr( const list & source, node *p ); }; #include "EndConv.h" #include "list.cpp" #endif