
00001 #ifndef _TList_H_ 00002 #define _TList_H_ 00003 00004 namespace xi { 00005 00006 // Quick and dirty List for small numbers of items. 00007 00008 template <class T> 00009 class TList 00010 { 00011 private: 00012 00013 class Elem 00014 { 00015 public: 00016 Elem *next; 00017 T data; 00018 Elem(T d) : next(0), data(d) {;} 00019 }; 00020 00021 Elem *first; 00022 Elem *current; 00023 unsigned int len; 00024 00025 public: 00026 00027 TList(void) : first(0), len(0) {;} 00028 00029 int empty(void) { return ! first; } 00030 00031 T begin(void) { 00032 current = first; 00033 return (current ? current->data : T(0)); 00034 } 00035 00036 int end(void) { 00037 return (current == 0); 00038 } 00039 00040 T next (void) { 00041 current = current->next; 00042 return (current ? current->data : T(0)); 00043 } 00044 00045 T front(void) { 00046 return ((first==0) ? 0 : first->data); 00047 } 00048 00049 T pop(void) { 00050 T data = T(0); 00051 if(first) { 00052 data = first->data; 00053 Elem *nn = first->next; 00054 delete first; 00055 first = nn; 00056 len --; 00057 } 00058 return data; 00059 } 00060 00061 void remove(T data) { 00062 // case 1: empty list 00063 if (first == 0) 00064 return; 00065 // case 2: first element to be removed 00066 if(first->data == data) { 00067 Elem *tbr = first; 00068 first = first->next; 00069 len --; 00070 delete tbr; 00071 return; 00072 } 00073 // case 3: middle or last element to be removed 00074 Elem *nn; 00075 Elem *prev = first; 00076 for(nn=first->next; nn; nn = nn->next) { 00077 if (nn->data == data) { 00078 prev->next = nn->next; 00079 len --; 00080 delete nn; 00081 return; 00082 } 00083 prev = nn; 00084 } 00085 } 00086 00087 void append(T data) { 00088 Elem *e = new Elem(data); 00089 if(first == 0) { 00090 first = e; 00091 } else { 00092 Elem *nn; 00093 for( nn = first ; nn->next ; nn = nn->next ); 00094 nn->next = e; 00095 } 00096 len++; 00097 } 00098 00099 int length(void) { 00100 return len; 00101 } 00102 }; 00103 00104 } 00105 00106 #endif
1.5.5