/***********************************************************************/ /* file dlist_iter.cc */ /* contains the implementation of class members of class */ /* dlist_iterator. */ /***********************************************************************/ #include "dlist_iter.h" /***********************************************************************/ /* implementation of class dlist_iterator */ /***********************************************************************/ /***********************************************************************/ /* contructor */ /***********************************************************************/ template <class type> dlist_iterator<type>::dlist_iterator(const base_dlist<type> *ls): cont_iterator<type>(ls) { c= ls; init(); } /***********************************************************************/ /* copy constructor */ /***********************************************************************/ template <class type> dlist_iterator<type>::dlist_iterator (const dlist_iterator<type>& sl_iter):cont_iterator<type>(sl_iter) { c= sl_iter.c; next= sl_iter.next; cursor= sl_iter.cursor; } /***********************************************************************/ /* public member operator= */ /* copies all data members from the passed dlist_iterator. */ /***********************************************************************/ template <class type> const dlist_iterator<type>& dlist_iterator<type>::operator= (const dlist_iterator<type>& sl_iter) { c= sl_iter.c; next= sl_iter.next; cursor= sl_iter.cursor; } /***********************************************************************/ /* public member function init */ /* takes no argument, initializes the iterator and sets the pointer */ /* next to the head and cursor to NULL. thus a first call of member */ /* function step is necessary before use of current or c_value. */ /***********************************************************************/ template <class type> void dlist_iterator<type>::init() { next= c->head; cursor= NULL; } /***********************************************************************/ /* public member function step */ /* takes no argument and moves cursor and next further in the dlist. */ /* It returns 1 if the end wasn't reached, 0 otherwise. If the end was */ /* reached, cursor keeps pointing to the last item of the dlist, */ /* not to NULL. */ /***********************************************************************/ template <class type> int dlist_iterator<type>::step() { if (next != NULL) { cursor= next; next=next->next; return 1; } else { return 0; } } /***********************************************************************/ /* public member function step_back */ /* takes no argument and moves cursor and next back in the dlist. */ /* It returns 1 if the head wasn't reached, 0 otherwise. If the head */ /* was reached, cursor keeps pointing to the first item of the dlist, */ /* not to NULL. */ /***********************************************************************/ template <class type> int dlist_iterator<type>::step_back() { if (cursor->prev != NULL) { next= cursor; cursor= cursor->prev; return 1; } else { return 0; } } /***********************************************************************/ /* public member function current */ /* takes no argument and returns a pointer to the current item in the */ /* dlist (the item cursor points to). If the list was freshly */ /* initialized, NULL is returned. */ /***********************************************************************/ template <class type> dlist_item<type> *dlist_iterator<type>::current() { return cursor; } /***********************************************************************/ /* public member function c_value */ /* returns the value of the current item in the dlist (the item cursor */ /* points to). Requires cursor to be not NULL. */ /***********************************************************************/ template <class type> type dlist_iterator<type>::c_value() { assert(cursor != NULL); return cursor->data; }