00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 #ifndef UTIL_H
00017 #define UTIL_H
00018 #include<ErrorType.h>
00019 #include<Debug.h>
00020 class ListNode
00021 {
00022     public:
00023     void *element;
00024     ListNode *next;
00025     
00026 };
00027 
00028 class ListIterator
00029 {
00030     ListNode *iter;
00031     ListNode *start;
00032     ListIterator();
00033     public:
00034 
00035     ListIterator(ListNode *head) { iter = head; start = head; }
00036 
00037     bool hasElement()
00038     {
00039         if (iter == NULL) return false; else return true;
00040     }
00041 
00042     void reset()
00043     {
00044         iter = start;
00045     }
00046     
00047     void* nextElement(bool isRemove = false) 
00048     {
00049         if (iter == NULL) return NULL;
00050         ListNode *node = iter;
00051         iter = iter ->next;
00052         return node->element;
00053     }
00054 
00055     
00056     void* getElement(int index)
00057     {
00058         ListNode *localIter = start;
00059         if (localIter == NULL) return NULL;
00060         for (int i=0; i <index; i++) {
00061            localIter = localIter->next;
00062            if (localIter == NULL) break;
00063         }
00064         return localIter->element;
00065     }
00066 };
00067 
00068 class Identifier
00069 {
00070     public:
00071     char name[IDENTIFIER_LENGTH];
00072 };
00073 
00074 class List
00075 {
00076     ListNode *head;
00077     int totalElements;
00078     public:
00079     List() { head = NULL; totalElements = 0;}
00080 
00081     DbRetVal append(void *elem)
00082     {
00083         ListNode *newNode = new ListNode();
00084         newNode->element = elem;
00085         newNode->next = NULL;
00086         totalElements++;
00087         
00088         if (NULL == head) { head = newNode; return OK; }
00089 
00090         ListNode *iter = head;
00091         while (NULL != iter->next) iter = iter->next;
00092         iter->next = newNode;
00093         return OK;
00094     }
00095     
00096     
00097     DbRetVal remove(void *elem) 
00098     {
00099         if (NULL == head)
00100         {
00101             printError(ErrNotExists, "There are no elements in the list. Empty list");
00102             return ErrNotExists;
00103         }
00104         ListNode *iter = head, *prev = head;
00105         while (iter != NULL)
00106         {
00107             if (elem == iter->element)
00108             {
00109                 prev->next = iter->next;
00110                 delete iter;
00111                 totalElements--;
00112                 if (iter == head) { head = NULL; return OK;}
00113                 return OK;
00114             }
00115             prev = iter;
00116             iter = iter->next;
00117         }
00118         printError(ErrNotFound, "There are no elements in the list");
00119         return ErrNotFound;
00120     }
00121 
00122     
00123     void* get(int index)
00124     {
00125         ListNode *localIter = head;
00126         if (localIter == NULL) return NULL;
00127         for (int i=0; i <index -1; i++) {
00128            localIter = localIter->next;
00129            if (localIter == NULL) break;
00130         }
00131         return localIter->element;
00132     }
00133 
00134 
00135     bool exists(void *elem) 
00136     {
00137         ListNode *iter = head;
00138         while (iter != NULL)
00139         {
00140             if (elem == iter->element)
00141             {
00142                 return true;
00143             }
00144             iter = iter->next;
00145         }
00146         return false;
00147     }
00148 
00149     ListIterator getIterator()
00150     {
00151         ListIterator iter(head);
00152         return iter;
00153     }
00154     void reset()
00155     {
00156         if (NULL == head) return;
00157         ListNode *iter = head, *prevIter = head;
00158         while (iter->next != NULL)
00159         {
00160             prevIter = iter;
00161             iter = iter->next;
00162             delete prevIter;
00163 
00164         }
00165         delete iter;
00166         head = NULL;
00167         totalElements = 0;
00168         return;
00169     }
00170     int size()
00171     {
00172         return totalElements;
00173     }
00174 
00175 };
00176 class UniqueID
00177 {
00178    int startID;
00179    Mutex mutex;
00180    public:
00181    UniqueID() { startID = 1; mutex.init(); }
00182    int getID()
00183    {
00184       
00185       if (mutex.getLock(-1, false) != 0) return 0;
00186       startID++;
00187       mutex.releaseLock(-1, false); 
00188       return startID;
00189    }
00190 };
00191 
00192 #endif