/*********************************************************************
file base_dlist.cc
contains the implementation of class members of class
base_dlist.
*********************************************************************/
#include "base_dlist.h"
/*********************************************************************
implementation of class base_dlist
*********************************************************************/
/*********************************************************************
private member function find
*********************************************************************/
template <class type>
dlist_item<type> *base_dlist<type>::find(const type &dat)
{
dlist_item<type> *it;
it= head;
while ((it != NULL) && (it->data != dat)) it= it->next;
return it;
}
/*********************************************************************
constructor
*********************************************************************/
template <class type>
base_dlist<type>::base_dlist()
{
head = NULL;
tail= NULL;
}
/*********************************************************************
destructor.
*********************************************************************/
template <class type>
base_dlist<type>::~base_dlist()
{
clear();
}
/*********************************************************************
public member function add
prepends an item to the base_dlist. It returns a pointer to the
the prepended dlist_item.
*********************************************************************/
template <class type>
dlist_item<type> *base_dlist<type>::add(const type& dat)
{
if (head != NULL)
{
dlist_item<type> *it= new dlist_item<type>(dat);
it->next= head;
head= it;
}
else
{
head= new dlist_item<type>(dat);
tail= head;
}
this->sz++;
return head;
}
/*********************************************************************
public mamber function in
takes an argument of type and returns 1 if there is data in the
base_dlist identical to the argument, 0 otherwise.
*********************************************************************/
template <class type>
int base_dlist<type>::in(const type& dat)
{
return (find(dat) != NULL);
}
/*********************************************************************
public member function del_item
takes one argument of type and searches for identical data in the
base_dlist and deletes the item cotaining it if found. It returns
1 if anything was deleted, 0 otherwise. Only one item is deleted.
If there are multiple copies of the specific data in the base_dlist
it might remain in the list after del has terminated successfully.
*********************************************************************/
template <class type>
void base_dlist<type>::del_item(dlist_item<type> *it)
{
assert(it != NULL);
if (it->prev != NULL) {
it->prev->next= it->next;
}
else {
head= it->next;
}
if (it->next != NULL) {
it->next->prev= it->prev;
}
else {
tail= it->prev;
}
delete it;
this->sz--;
}
/*********************************************************************
public member function del
takes one argument of type and searches for identical data in the
base_dlist and deletes the item cotaining it if found. It returns
1 if anything was deleted, 0 otherwise. Only one item is deleted.
If there are multiple copies of the specific data in the base_dlist
it might remain in the list after del has terminated successfully.
*********************************************************************/
template <class type>
int base_dlist<type>::del(const type& dat)
{
dlist_item<type> *it= find(dat);
if ( it != NULL) {
del_item(it);
return 1;
}
else {
return 0;
}
}
/*********************************************************************
public member function clear
takes no argument and empties the whole base_dlist.
*********************************************************************/
template <class type>
void base_dlist<type>::clear()
{
this->sz= 0;
dlist_item<type> *tmp= head;
while (head != NULL) {
tmp= head->next;
delete head;
head= tmp;
}
head= NULL;
tail= NULL;
}
/*********************************************************************
public member function iterator()
returns a freshly created iterator for the base_dlist. The iterator
must be deleted by the calling function otherwise it will continue
to exist as garbage idefinitely.
*********************************************************************/
template <class type>
dlist_iterator<type> *base_dlist<type>::iterator()
{
return (new dlist_iterator<type>(this));
}