]> jfr.im git - irc/gameservirc.git/blobdiff - gameserv/list.h
Put a declaration for void log(const char *fmt, ...); in the list.h to make it
[irc/gameservirc.git] / gameserv / list.h
index e8b85100a499257851ef69a1c224abf924af2adb..fc7c3b187cba6456c70b25e87ce302d9e17e703c 100644 (file)
@@ -5,13 +5,14 @@
 #include <cassert>
 #include "listnode.h"
 #include "aClient.h"
-#include "extern.h"
 #include "options.h"
 
 using std::cout;
 using std::endl;
 using std::flush;
 
+void log(const char *fmt, ...);
+
 template <class T>
 class List {
     public:
@@ -19,6 +20,7 @@ class List {
        ~List();        //deconstructor
        T *insertAtFront( const T & );
        T *insertAtBack( T *&);
+       T *random(); // Returns a random element in the list
        ListNode<T> *insertAtBack_RLN( T *&);
        bool removeFromFront( T & );
        bool removeFromBack( T & );
@@ -33,15 +35,17 @@ class List {
        ListNode < T > *Find( T * );
         ListNode < T > *First() { return firstPtr; };
        ListNode < T > *Last() { return lastPtr; };
+       int elements; // Number of elements in the list
     private:
        ListNode < T > *firstPtr;
        ListNode < T > *lastPtr;
 
        ListNode < T > *getNewNode ( const T &  );
+       ListNode < T > *getNewNode ( T &  );
 };
 
 template <class T>
-List<T>::List() : firstPtr (0), lastPtr (0) {}
+List<T>::List() : firstPtr (0), lastPtr (0) {elements = 0;}
 
 template <class T>
 void List<T>::deleteNodes()
@@ -57,6 +61,7 @@ void List<T>::deleteNodes()
     }
     firstPtr = NULL;
     lastPtr = NULL;
+    elements = 0;
 }
 
 template <class T>
@@ -65,6 +70,21 @@ List<T>::~List()
     deleteNodes();
 }
 
+template<class T>
+T *List<T>::random()
+{
+    if (isEmpty())
+       return NULL;
+
+    int num = rand() % elements;
+    ListNode<T> *it = firstPtr;
+    for (int x = 0; x < num; x++)
+    {
+       it = it->Next();
+    }
+    return it->getData();
+}
+
 template<class T>
 T *List<T>::insertAtFront( const T &value )
 {
@@ -79,6 +99,7 @@ T *List<T>::insertAtFront( const T &value )
        firstPtr->prev = newPtr;
        firstPtr = newPtr;
     }
+    elements++;
     return firstPtr->getData();
 }
 
@@ -97,6 +118,7 @@ T *List<T>::insertAtBack(T *&value )
        lastPtr->next = newPtr;
        lastPtr = newPtr;
     }
+    elements++;
     return lastPtr->getData();
 }
 
@@ -115,6 +137,7 @@ ListNode<T> *List<T>::insertAtBack_RLN(T *&value )
        lastPtr->next = newPtr;
        lastPtr = newPtr;
     }
+    elements++;
     return lastPtr;
 }
 
@@ -135,6 +158,7 @@ bool List<T>::removeFromFront( T &value )
 
        value = tempPtr->getData();
        delete tempPtr;
+       elements--;
        return true;
     }
 }
@@ -155,8 +179,8 @@ bool List<T>::removeFromBack( T &value )
 
        value = tempPtr->getData();
        delete tempPtr;
+       elements--;
        return true;
-
     }
 }
 
@@ -173,6 +197,17 @@ ListNode<T> *List<T>::getNewNode( const T &value)
 
     return ptr;
 }
+
+template <class T>
+ListNode<T> *List<T>::getNewNode( T &value)
+{
+    ListNode<T> *ptr = new ListNode<T>(value);
+
+    assert( ptr != 0);
+
+    return ptr;
+}
+
 template<class T>
 ListNode<T> *List<T>::Find( T *value )
 {
@@ -212,8 +247,21 @@ void List<T>::print() const
                 << "   Password: " << currentPtr->getData()->stats->password << flush;
        cout << endl;
        */
+       /*
        cout << currentPtr->getData()->getString() << endl;
        currentPtr = currentPtr->next;
+       */
+       T *dat;
+       dat = currentPtr->getData();
+       log("name: %s", dat->name);
+       log("weapon: %s", dat->weapon);
+       log("death: %s", dat->death);
+       log("strength: %d", dat->strength);
+       log("exp: %ld", dat->exp);
+       log("gold: %ld", dat->gold);
+       log("maxhp: %d", dat->maxhp);
+       log("hp: %d", dat->hp);
+       currentPtr = currentPtr->next;
     }
 }
 #endif
@@ -279,6 +327,7 @@ ListNode<T> *List<T>::remove(T *remPtr)
                firstPtr->prev = 0;
                return newPtr;
            }
+           elements--;
        }
        newPtr = newPtr->next;
     }