/***********************************************************************/
/* file slist_iter.cc                                                  */
/* contains the implementation of class members of class               */
/* slist_iterator.                                                     */
/***********************************************************************/

#include "slist_iter.h"

/***********************************************************************/
/* implementation of class slist_iterator                              */
/***********************************************************************/


/***********************************************************************/
/* contructor                                                          */
/***********************************************************************/

template <class type>
slist_iterator<type>::slist_iterator(const base_slist<type> *ls):
cont_iterator<type>(ls)
{
  c= ls;
  init();
}

/***********************************************************************/
/* copy constructor                                                    */
/***********************************************************************/

template <class type>
slist_iterator<type>::slist_iterator
(const slist_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 slist_iterator.             */
/***********************************************************************/

template <class type>
const slist_iterator<type>& slist_iterator<type>::operator=
(const slist_iterator<type>& sl_iter)
{
  c= sl_iter.c;
  next= sl_iter.next;
  cursor= sl_iter.cursor;
  return *this;
}


/***********************************************************************/
/* 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 slist_iterator<type>::init()
{
   next= c->head;
   cursor= NULL;
}

/***********************************************************************/
/* public member function step                                         */
/* takes no argument and moves cursor and next further in the slist.   */
/* 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 slist,       */
/* not to NULL.                                                        */
/***********************************************************************/

template <class type>
int slist_iterator<type>::step()
{
   if (next != NULL)
   {
      cursor= next;
      next=next->next;
      return 1;
   }
   else
   {
      return 0;
   }
}


/***********************************************************************/
/* public member function current                                      */
/* takes no argument and returns a pointer to the current item in the  */
/* slist (the item cursor points to). If the list was freshly          */
/* initialized, NULL is returned.                                      */
/***********************************************************************/

template <class type>
slist_item<type> *slist_iterator<type>::current()
{
   return cursor;
}


/***********************************************************************/
/* public member function c_value                                      */
/* returns the value of the current item in the slist (the item cursor */
/* points to). Requires cursor to be not NULL.                         */
/***********************************************************************/

template <class type>
type slist_iterator<type>::c_value()
{
  assert(cursor != NULL);
  return cursor->data;
}

/***********************************************************************/
/* public member function set_current                                  */
/* sets the value of the current an next item in the slist (the item   */
/* cursor and next point to points to). Requires arg to be not NULL    */
/* and better belong to the list.            .                         */
/***********************************************************************/

template <class type>
void slist_iterator<type>::set_current(slist_item<type> *nc)
{
  assert(nc != NULL);
  cursor= nc;
  next= nc->next;
}