00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 # include "incls/_precompiled.incl"
00025 
00026 #ifdef DELTA_COMPILER
00027 
00028 # include "incls/_slist.cpp.incl"
00029   
00030 GenericSListElem* GenericSList::findL(void* p) const {
00031   for (GenericSListElem* e = headL(); e; e = e->nextL()) {
00032     if (e->dataL() == p) return e;
00033   }
00034   return NULL;
00035 }
00036 
00037 GenericSListElem* GenericSList::findL(void* token, slistFindFn f) const {
00038   for (GenericSListElem* e = headL(); e; e = e->nextL()) {
00039     if (f(token, e->dataL())) return e;
00040   }
00041   return NULL;
00042 }
00043 
00044 void* GenericSList::nthL(int n) const {
00045   assert(n < length(), "non-existing element");
00046   GenericSListElem* e = headL();
00047   for (int i = 0; i < n; i++, e = e->nextL()) ;
00048   return e->dataL();
00049 }
00050 
00051 void GenericSList::insertAfterL(GenericSListElem* e, void* d) {
00052   if (e == tailL()) {
00053     appendL(d);
00054   } else if (e == NULL) {
00055     prependL(d);
00056   } else {
00057     GenericSListElem* newe = new GenericSListElem(d, e->nextL());
00058     e->setNextL(newe);
00059     _len++;
00060   }
00061 }
00062 
00063 void GenericSList::removeAfterL(GenericSListElem* e) {
00064   if (e == NULL) {
00065     removeHeadL();
00066   } else {
00067     GenericSListElem* deletee = e->nextL();
00068     e->_next = deletee->nextL();
00069     if (deletee == tailL()) _tail = e;
00070     _len--;
00071   }
00072 }
00073 
00074 void GenericSList::removeL(void* p) {
00075   GenericSListElem* prev = NULL;
00076   for (GenericSListElem* e = headL(); e && e->dataL() != p;
00077        prev = e, e = e->nextL()) ;
00078   if (e == NULL) fatal("not in list");
00079   removeAfterL(prev);
00080   assert(!includesL(p), "remove doesn't work");
00081 }
00082 
00083 void GenericSList::applyL(void f(void*)) {
00084   GenericSListElem* nexte;      
00085   for (GenericSListElem* e = headL(); e; e = nexte) {
00086     nexte = e->nextL();
00087     f(e->dataL());
00088   }
00089 }
00090 
00091 void GenericSList::print_short() { lprintf("GenericSList %#lx", this); }
00092 
00093 static void print_them(void* p) {
00094   ((PrintableResourceObj*)p)->print_short(); lprintf(" ");
00095 }
00096 
00097 void GenericSList::print() {
00098   print_short(); lprintf(": ");
00099   ((GenericSList*)this)->applyL(print_them);
00100 }
00101 
00102 # endif