00001 #ifndef _LinkedList_h_ 00002 #define _LinkedList_h_ 00003 00004 template <class T=uint32_t> 00005 class LinkedList { 00006 private: 00007 typedef struct entry { 00008 struct entry* next; 00009 T data; 00010 } entry_t; 00011 00012 entry_t* elements; 00013 uint32_t elementCount; 00014 00015 void destroy(){ 00016 entry_t* ptr = elements; 00017 while(ptr){ 00018 entry_t* tmp = ptr; 00019 ptr = ptr->next; 00020 delete tmp; 00021 } 00022 elements = NULL; 00023 elementCount = 0; 00024 } 00025 00026 public: 00027 LinkedList() : elements(NULL),elementCount(0) { } 00028 ~LinkedList(){ 00029 destroy(); 00030 } 00031 T insert(T newEntry){ 00032 entry_t* newNode = new entry_t; 00033 newNode->next = elements; 00034 newNode->data = newEntry; 00035 elements = newNode; 00036 elementCount++; 00037 return newNode->data; 00038 } 00039 T shift(){ 00040 entry_t* toDelete = elements; 00041 ASSERT(toDelete && "Trying to delete an element from empty list"); 00042 elements = toDelete->next; 00043 T ret = toDelete->data; 00044 delete toDelete; 00045 elementCount--; 00046 return ret; 00047 } 00048 bool empty(){ 00049 ASSERT(elements || !elementCount); 00050 return (!elements); 00051 } 00052 void clear(){ 00053 destroy(); 00054 elementCount = 0; 00055 } 00056 void print(){ 00057 PRINT_INFOR("List 0x%x with %d ele : ", this, elementCount); 00058 entry_t* ptr = elements; 00059 while(ptr){ 00060 PRINT_INFOR("\t0x%x",ptr); 00061 ptr = ptr->next; 00062 } 00063 PRINT_INFOR("\n"); 00064 } 00065 uint32_t size() { return elementCount; } 00066 }; 00067 00068 #endif