00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 # ifdef DELTA_COMPILER
00027
00028 class GenericSListElem : public ResourceObj {
00029 protected:
00030 void* _data;
00031 GenericSListElem* _next;
00032 public:
00033 GenericSListElem(void* d, GenericSListElem* n = NULL) { _data = d; _next = n; }
00034
00035 void* dataL() const { return this ? _data : NULL; }
00036 void setDataL(void* d) { _data = d; }
00037
00038 GenericSListElem* nextL() const { return _next; }
00039 void setNextL(GenericSListElem* n) { _next = n; }
00040
00041 protected:
00042 void insertAfterL(void* d) { _next = new GenericSListElem(d, _next); }
00043
00044 friend class GenericSList;
00045 };
00046
00047 typedef bool (*slistFindFn)(void* token, void* elem);
00048
00049 class GenericSList : public PrintableResourceObj {
00050 protected:
00051 GenericSListElem* _head;
00052 GenericSListElem* _tail;
00053 int _len;
00054 public:
00055 GenericSList() { _head = _tail = NULL; _len = 0; }
00056
00057 void prependL(void* d) {
00058 _head = new GenericSListElem(d, _head);
00059 if (_tail == NULL) _tail = _head;
00060 _len++;
00061 }
00062 void appendL(void* d) {
00063 GenericSListElem* e = new GenericSListElem(d);
00064 if (_tail == NULL) {
00065 _head = _tail = e;
00066 } else {
00067 _tail->_next = e;
00068 _tail = e;
00069 }
00070 _len++;
00071 }
00072
00073 GenericSListElem* headL() const { return _head; }
00074 GenericSListElem* tailL() const { return _tail; }
00075
00076 void applyL(void f(void*));
00077
00078 bool isEmpty() const { return _head == NULL; }
00079 bool nonEmpty() const { return ! isEmpty(); }
00080 int length() const { return _len; }
00081 bool includesL(void* p) const { return findL(p) != NULL; }
00082 GenericSListElem* findL(void* p) const;
00083 GenericSListElem* findL(void* p, slistFindFn f) const;
00084
00085 void* nthL(int i) const;
00086
00087 void* firstL() const { return headL()->dataL(); }
00088 void* secondL() const { return headL()->nextL()->dataL(); }
00089 void* lastL() const { return tailL()->dataL(); }
00090
00091 void insertAfterL(GenericSListElem* e, void* d);
00092 void removeL(void* d);
00093 void removeAfterL(GenericSListElem* e);
00094
00095 protected:
00096 void* removeHeadL() {
00097 assert(nonEmpty(), "removing from an empty list");
00098 void* d = firstL();
00099 _head = headL()->nextL();
00100 if (--_len == 0) _tail = _head;
00101 return d; }
00102
00103 public:
00104 void pushL(void* d) { prependL(d); }
00105 void* popL() { return removeHeadL(); }
00106
00107 void print();
00108 void print_short();
00109 };
00110
00111
00112 template <class T> class SListElem : public GenericSListElem {
00113 public:
00114 SListElem(T d, SListElem<T>* n = NULL) : GenericSListElem((void*) d, (GenericSListElem*) n) {} \
00115
00116 T data() const { return (T)GenericSListElem::dataL(); }
00117 void setData(T d) { GenericSListElem::setDataL((void*) d); }
00118 SListElem<T>* next() const { return (SListElem<T>*) GenericSListElem::nextL(); }
00119 void setNext(SListElem<T>* n) { GenericSListElem::setNextL(n); }
00120 void insertAfter(T d) { GenericSListElem::insertAfterL((void*) d); }
00121 };
00122
00123 template <class T> class SList : public GenericSList {
00124 public:
00125 SList() {}
00126
00127 SListElem<T>* head() const { return (SListElem<T>*) GenericSList::headL(); }
00128 SListElem<T>* tail() const { return (SListElem<T>*) GenericSList::tailL(); }
00129 bool includes(T e) const { return GenericSList::includesL((void*)e); }
00130 SListElem<T>* find(T e) const { return (SListElem<T>*)GenericSList::findL((void*)e); }
00131 SListElem<T>* find(void* token, slistFindFn f) const {
00132 return (SListElem<T>*)GenericSList::findL(token, (slistFindFn)f); }
00133
00134 T first() const { return (T) GenericSList::firstL(); }
00135 T second() const { return (T) GenericSList::secondL(); }
00136 T at(int i) const { return (T) GenericSList::nthL(i); }
00137 T last() const { return (T) GenericSList::lastL(); }
00138
00139 void prepend(T d) { GenericSList::prependL((void*) d); }
00140 void append(T d) { GenericSList::appendL((void*) d); }
00141 void apply(void f(T)) { GenericSList::applyL((void (*)(void*))f); }
00142 void insertAfter(SListElem<T>* e, T d) { GenericSList::insertAfterL((SListElem<T>*) e, (void*) d); }
00143 void removeAfter(SListElem<T>* e, T d) { GenericSList::removeAfterL((SListElem<T>*) e); }
00144 void remove(T d) { GenericSList::removeL((void*) d); }
00145 T removeHead() { return (T) GenericSList::removeHeadL(); }
00146 void push(T d) { GenericSList::pushL((void*) d); }
00147 T pop() { return (T) GenericSList::popL(); }
00148 void apply(Closure<T>* c) {
00149 SListElem<T>* nexte;
00150 for (SListElem<T>* e = head(); e; e = nexte) { nexte = e->next(); c->do_it(e->data()); }
00151 }
00152 };
00153
00154 # endif