/*********************************************************************
 file label_dlist_iter.cc                                                  
 contains the implementation of class members of class               
 label_dlist_iterator.                                                     
*********************************************************************/

#include "label_dlist_iter.h"

/*********************************************************************
 implementation of class label_dlist_iterator                              
*********************************************************************/


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

template <class type>
label_dlist_iterator<type>::label_dlist_iterator(const base_label_dlist<type> *ls):label_cont_iterator<type>(ls)
{
  c= ls;
  init();
}

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

template <class type>
label_dlist_iterator<type>::label_dlist_iterator
(const label_dlist_iterator<type>& sl_iter):label_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 label_dlist_iterator.             
*********************************************************************/

template <class type>
const label_dlist_iterator<type>& label_dlist_iterator<type>::operator=
(const label_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 label_dlist_iterator<type>::init()
{
   next= c->head;
   cursor= NULL;
}

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

template <class type>
int label_dlist_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  
 label_dlist (the item cursor points to). If the list was freshly          
 initialized, NULL is returned.                                      
*********************************************************************/

template <class type>
label_dlist_item<type> *label_dlist_iterator<type>::current()
{
   return cursor;
}


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

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


/*********************************************************************
 public member function c_label                                      
 returns the label of the current item in the label_dlist (the item cursor 
 points to). Requires cursor to be not NULL.                         
*********************************************************************/

template <class type>
int label_dlist_iterator<type>::c_label()
{
  assert(cursor != NULL);
  return cursor->label;
}