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