/* $Id: dlist.c,v 1.1 1996/10/10 10:01:15 roitzsch Exp $ (C)opyright 1996 by Konrad-Zuse-Center, Berlin All rights reserved. Part of the Kaskade distribution */ #include "dlist.h" template DList:: DList() { first = last = 0; noOfElements = 0; } //------------------------------------------------------------------------- template void DList:: add(T* elem) { ++noOfElements; if (first != 0) last->next = elem; else first = elem; elem->prev = last; last = elem; elem->next = 0; } //------------------------------------------------------------------------- template void DList:: insert(T* elem) { ++noOfElements; if (first != 0) first->prev = elem; else last = elem; elem->next = first; elem->prev = 0; first = elem; } //------------------------------------------------------------------------- template void DList:: substitute(T* elem, T* elem1, T* elem2) { ++noOfElements; T *prevElem = elem->prev, *nextElem = elem->next; if (elem == first) first = elem1; if (elem == last ) last = elem2; elem1->next = elem2; elem2->prev = elem1; elem1->prev = prevElem; elem2->next = nextElem; if (prevElem != 0) prevElem->next = elem1; if (nextElem != 0) nextElem->prev = elem2; } //------------------------------------------------------------------------- template void DList:: remove(T* elem) // do NOT delete ! { --noOfElements; if (elem == first) { first = elem->next; if (elem->next) (elem->next)->prev = 0; else last = 0; } else if (elem == last) { last = elem->prev; (elem->prev)->next = 0; } else { (elem->prev)->next = elem->next; (elem->next)->prev = elem->prev; } } //------------------------------------------------------------------------- template T* DList:: inList(T* elem) { T *lp; for (lp=first; lp; lp=lp->next) if ((*lp)==(*elem)) return lp; return 0; } //------------------------------------------------------------------------- template void DList:: deleteAll() { if (first) { T* elem; while (first) { elem = first; first = first->next; delete elem; } } noOfElements = 0; first = last = 0; } //------------------------------------------------------------------------- template int DList:: MemSpace() const { return noOfElements*sizeof(T) + 2*sizeof(T*) + sizeof(int); } //------------------------------------------------------------------------- /* template ostream& operator<< (ostream& os, DList& list) { T* l; for (l=list.first; l; l=l->next) os << (*l) << " next: " << l->next <<"\n"; return os; } */