/* */ #include "defs.H" const int DEFAULT_LIST_CAPACITY = 100; template class Iterator; /* */ template class List { public: List(long size = DEFAULT_LIST_CAPACITY); /* */ Iterator* CreateIterator() const; /* */ long Count() const; Item& Get(long index) const; // ... }; /* */ template class Iterator { public: virtual void First() = 0; virtual void Next() = 0; virtual bool IsDone() const = 0; virtual Item CurrentItem() const = 0; protected: Iterator(); }; /* */ template class ListIterator : public Iterator { public: ListIterator(const List* aList); virtual void First(); virtual void Next(); virtual bool IsDone() const; virtual Item CurrentItem() const; /* */ private: const List* _list; long _current; }; /* */ template ListIterator::ListIterator ( const List* aList ) : _list(aList), _current(0) { } /* */ template void ListIterator::First () { _current = 0; } /* */ template void ListIterator::Next () { _current++; } /* */ template bool ListIterator::IsDone () const { return _current >= _list->Count(); } /* */ //class IteratorOutOfBounds; #define throw // /* */ template Item ListIterator::CurrentItem () const { if (IsDone()) { throw IteratorOutOfBounds; } return _list->Get(_current); } /* */ template class ReverseListIterator : public Iterator { public: ReverseListIterator(const List* aList); virtual void First(); virtual void Next(); virtual bool IsDone() const; virtual Item CurrentItem() const; }; /* */ class Employee { public: void Print(); }; /* */ void PrintEmployees (Iterator& i) { for (i.First(); !i.IsDone(); i.Next()) { i.CurrentItem()->Print(); } } /* */ template class SkipList : public List { public: }; template class SkipListIterator : public ListIterator { public: SkipListIterator(const List* aList); void First(); void Next(); bool IsDone() const; Item CurrentItem() const; }; void dummy () { /* */ List* employees; // ... ListIterator forward(employees); ReverseListIterator backward(employees); PrintEmployees(forward); PrintEmployees(backward); /* */ } /* */ void dummy2 () { /* */ SkipList* employees; // ... SkipListIterator iterator(employees); PrintEmployees(iterator); /* */ } /* */ template class AbstractList { public: virtual Iterator* CreateIterator() const = 0; // ... }; /* */ template Iterator* List::CreateIterator () const { return new ListIterator(this); } /* */ void dummy3() { /* */ // we know only that we have an AbstractList AbstractList* employees; // ... Iterator* iterator = employees->CreateIterator(); PrintEmployees(*iterator); delete iterator; /* */ } /* */ template class IteratorPtr { public: IteratorPtr(Iterator* i): _i(i) { } ~IteratorPtr() { delete _i; } /* */ Iterator* operator->() { return _i; } Iterator& operator*() { return *_i; } private: // disallow copy and assignment to avoid // multiple deletions of _i: IteratorPtr(const IteratorPtr&); IteratorPtr& operator=(const IteratorPtr&); private: Iterator* _i; }; /* */ void dummy4 () { /* */ AbstractList* employees; // ... IteratorPtr iterator(employees->CreateIterator()); PrintEmployees(*iterator); /* */ } /* */ template class ListTraverser { public: ListTraverser(List* aList); bool Traverse(); protected: virtual bool ProcessItem(const Item&) = 0; private: ListIterator _iterator; }; /* */ template ListTraverser::ListTraverser ( List* aList ) : _iterator(aList) { } /* */ template bool ListTraverser::Traverse () { bool result = false; for ( _iterator.First(); !_iterator.IsDone(); _iterator.Next() ) { result = ProcessItem(_iterator.CurrentItem()); /* */ if (result == false) { break; } } return result; } /* */ class PrintNEmployees : public ListTraverser { public: PrintNEmployees(List* aList, int n) : ListTraverser(aList), _total(n), _count(0) { } /* */ protected: bool ProcessItem(Employee* const&); private: int _total; int _count; }; /* */ bool PrintNEmployees::ProcessItem (Employee* const& e) { _count++; e->Print(); return _count < _total; } /* */ void dummy5 () { /* */ List* employees; // ... PrintNEmployees pa(employees, 10); pa.Traverse(); /* */ ListIterator i(employees); int count = 0; /* */ for (i.First(); !i.IsDone(); i.Next() ) { count++; i.CurrentItem()->Print(); /* */ if (count >= 10) { break; } } /* */ } /* */ template class FilteringListTraverser { public: FilteringListTraverser(List* aList); bool Traverse(); protected: virtual bool ProcessItem(const Item&) = 0; virtual bool TestItem(const Item&) = 0; private: ListIterator _iterator; }; /* */ template void FilteringListTraverser::Traverse () { bool result = false; /* */ for ( _iterator.First(); !_iterator.IsDone(); _iterator.Next() ) { if (TestItem(_iterator.CurrentItem())) { result = ProcessItem(_iterator.CurrentItem()); /* */ if (result == false) { break; } } } return result; } /* */