This is part 2... the actual file. ********** BEGIN FILE ********** /***********************************************************************\ [*] __ __ ___ __ _____ __ [*] Part of LexiMUD [*] [*] / / ___\ \/ (_) _\/__ \/ / [*] [*] [*] / / / _ \\ /| \ \ / /\/ / [*] All rights reserved [*] [*] / /__| __// \| |\ \ / / / /___ [*] Copyright(C) 1997-1998 [*] [*] \____/\___/_/\_\_\__/ \/ \____/ [*] Chris Jacobson (FearItself) [*] [*] LexiMUD Standard Template Library [*] fear@technologist.com [*] [-]-----------------------------------+-+-----------------------------[-] [*] File : stl.llist.h [*] [*] Usage: Linked List template [*] \***********************************************************************/ #ifndef __STL_LLIST_H__ #define __STL_LLIST_H__ template <class T> class LListNode; template <class T> class LList; template <class T> class LListIterator; template <class T> class LListNode { public: friend class LList<T>; friend class LListIterator<T>; LListNode(T item) : data(item), next(NULL) { }; ~LListNode(void) { }; private: T data; LListNode<T> * next; }; template <class T> class LList { public: friend class LListIterator<T>; LList(void) : head(NULL), iters(NULL), count(0) { }; LList(T item) : head(NULL), iters(NULL), count(0) { this->Add(item); } ~LList(void) { LListNode<T> * element; while(this->head) { element = this->head; this->head = this->head->next; delete element; } while(this->iters) delete this->iters; } void Append(T item) { // Add to end of list if (!item) return; LListNode<T> * node = new LListNode<T>(item); LListNode<T> * temp = this->head; if (!temp) this->head = node; else { while (temp->next) temp = temp->next; temp->next = node; } count++; } void Prepend(T item) { // Add to beginning of list if (!item) return; LListNode<T> * node = new LListNode<T>(item); node->next = this->head; this->head = node; count++; } void Add(T item) { this->Prepend(item); } // Add (to beginning) void Remove(T item) { LListIterator<T> * iter; LListNode<T> * element = NULL; if (!item || !this->head) return; if (this->head->data == item) { element = this->head; this->head = element->next; } else { LListNode<T> * temp = this->head; for (temp = this->head; temp; temp = temp->next) { if (temp->next && temp->next->data == item) break; } if (temp) { element = temp->next; temp->next = temp->next->next; } } if (!element) return; for (iter = this->iters; iter; iter = iter->next) iter->Update(element); delete element; count--; } void UpdateIters(void) { LListIterator<T> *iter; for (iter = this->iters; iter; iter = iter->next) iter->list = this; } T Top(void) { return this->head ? this->head->data : NULL; } SInt32 Count(void) { return count; } bool InList(T item) { LListNode<T> * element; if (!item || !this->head) return false; for (element = this->head; element; element = element->next) if (element->data == item) return true; return false; } private: LListNode<T> * head; LListIterator<T> * iters; SInt32 count; }; template <class T> class LListIterator { public: friend class LList<T>; LListIterator(LList<T> &theList) : list(&theList), current(NULL), next(NULL) { if (!this->list) return; this->Reset(); this->next = this->list->iters; this->list->iters = this; } ~LListIterator(void) { if (!this->list) return; this->list->iters = this->next; } inline void Update(LListNode<T> *element) { if (element == this->current) this->current = this->current->next; } inline T Peek(void) { return (this->current ? this->current->data : NULL); } inline T Next(void) { if (!current) return (T)NULL; T data = this->current->data; this->current = this->current->next; return data; } inline void Reset(void) { this->current = this->list->head; } private: LList<T> * list; LListNode<T> * current; LListIterator<T> * next; }; #define START_ITER(iter, var, type, list) \ LListIterator<type>* iter = new LListIterator<type>(list); \ while ((var = iter->Next())) #define END_ITER(iter) \ delete iter; #endif +------------------------------------------------------------+ | Ensure that you have read the CircleMUD Mailing List FAQ: | | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html | +------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST