]> jfr.im git - irc/gameservirc.git/blobdiff - gameserv/list.h
Fixed a core bug hopefully
[irc/gameservirc.git] / gameserv / list.h
index d19e5564614454726289ca9b41a7bd936816c83b..e8b85100a499257851ef69a1c224abf924af2adb 100644 (file)
@@ -17,14 +17,19 @@ class List {
     public:
        List();         //constructor
        ~List();        //deconstructor
-       void insertAtFront( const T & );
-       void insertAtBack( T *&);
+       T *insertAtFront( const T & );
+       T *insertAtBack( T *&);
+       ListNode<T> *insertAtBack_RLN( T *&);
        bool removeFromFront( T & );
        bool removeFromBack( T & );
        bool del( T *);
        ListNode < T > *remove( T * );
        bool isEmpty() const;
+       #ifdef DEBUGMODE
        void print() const;
+       #endif
+        void deleteNodes();
+
        ListNode < T > *Find( T * );
         ListNode < T > *First() { return firstPtr; };
        ListNode < T > *Last() { return lastPtr; };
@@ -39,35 +44,29 @@ template <class T>
 List<T>::List() : firstPtr (0), lastPtr (0) {}
 
 template <class T>
-List<T>::~List()
+void List<T>::deleteNodes()
 {
-    if (!isEmpty())
+    if (isEmpty())
+       return;
+    ListNode<T> *it = firstPtr, *tempPtr;
+    while (it)
     {
-       #ifdef DEBUGMODE
-           log("Destroying Nodes");
-       #endif
-
-       ListNode<T> *currentPtr = firstPtr, *tempPtr;
-
-       while (currentPtr) 
-       {
-           tempPtr = currentPtr;
-           currentPtr = currentPtr->Next();
-
-           #ifdef DEBUGMODE
-               log("Deleting Memory address: %s", tempPtr->getData());
-           #endif
-           
-               delete tempPtr;
-       }
-       #ifdef DEBUGMODE
-           log("All Nodes destroyed");
-       #endif
+       tempPtr = it;
+       it = it->Next();
+       delete tempPtr;
     }
+    firstPtr = NULL;
+    lastPtr = NULL;
+}
+
+template <class T>
+List<T>::~List()
+{
+    deleteNodes();
 }
 
 template<class T>
-void List<T>::insertAtFront( const T &value )
+T *List<T>::insertAtFront( const T &value )
 {
     ListNode<T> *newPtr = getNewNode ( value );
 
@@ -80,10 +79,29 @@ void List<T>::insertAtFront( const T &value )
        firstPtr->prev = newPtr;
        firstPtr = newPtr;
     }
+    return firstPtr->getData();
+}
+
+template<class T>
+T *List<T>::insertAtBack(T *&value )
+{
+    ListNode<T> *newPtr = getNewNode(*value);
+
+    if (isEmpty())
+    {
+       firstPtr = lastPtr = newPtr;
+    }
+    else
+    {
+       newPtr->prev = lastPtr;
+       lastPtr->next = newPtr;
+       lastPtr = newPtr;
+    }
+    return lastPtr->getData();
 }
 
 template<class T>
-void List<T>::insertAtBack(T *&value )
+ListNode<T> *List<T>::insertAtBack_RLN(T *&value )
 {
     ListNode<T> *newPtr = getNewNode(*value);
 
@@ -97,6 +115,7 @@ void List<T>::insertAtBack(T *&value )
        lastPtr->next = newPtr;
        lastPtr = newPtr;
     }
+    return lastPtr;
 }
 
 
@@ -163,6 +182,7 @@ ListNode<T> *List<T>::Find( T *value )
     currentPtr = firstPtr;
     while (currentPtr)
     {
+       cout << currentPtr->getData() << endl << value << endl;
        if (currentPtr->getData() == value)
            return currentPtr;
        currentPtr = currentPtr->Next();
@@ -184,12 +204,15 @@ void List<T>::print() const
     currentPtr = firstPtr;
     while (currentPtr)
     {
+       /*
        cout << "aClient: " << *currentPtr->getData() << flush;
 
         if (currentPtr->getData()->stats)
            cout << "  Player Name: " << currentPtr->getData()->stats->name 
                 << "   Password: " << currentPtr->getData()->stats->password << flush;
        cout << endl;
+       */
+       cout << currentPtr->getData()->getString() << endl;
        currentPtr = currentPtr->next;
     }
 }