#ifndef LIST_H #define LIST_H #include template class ListIter; template struct ListNode { ListNode( ListNode *n, const T &t ) : n_( n ), e_( t ) {} ListNode *n_; T e_; }; template class List : public Container { public: List() : hd_( 0 ) {} ~List(); ListIter *genIter() const { return new ListIter( *this ); } List *clone() const; void insert( const T &t ) { ListNode *tmp = new ListNode( hd_, t ); hd_ = tmp; } private: friend class ListIter; List( const List & ); List &operator =( const List & ); ListNode *hd_; }; template class ListIter : public Iter { public: ListIter( const List &l ) : c_( l.hd_ ), l_( &l ) {} virtual ~ListIter() {} virtual void reset() { c_ = l_->hd_; } virtual void next() { c_ = c_->n_; } virtual bool done() const { return !c_; } virtual T &get() const { return c_->e_; } private: ListNode *c_; const List *l_; }; template List::~List() { ListNode *p = hd_, *q; while( p ) { q = p; p = p->n_; delete q; } } template List *List::clone() const { // not efficient, but interesting... std::auto_ptr n1( new List ); for( ListIter i( *this ); !i.done(); i.next() ) n1->insert( i.get() ); List *n2( new List ); for( ListIter i( *n1 ); !i.done(); i.next() ) n2->insert( i.get() ); return n2; } #endif