00001 /* 00002 panaLiX, Adrian Panasiuk 2002-5,8 00003 http://panalix.sourceforge.net/ 00004 ad.ek336@gmail.com 00005 00006 small osdev project 00007 provided under GPLv3 license. 00008 */ 00009 00010 00011 #ifndef __PANALIX_LIST_HPP 00012 #define __PANALIX_LIST_HPP 00013 00014 #include "src/common/shared.hpp" 00015 #include "src/collection/collection.hpp" 00016 00017 namespace Collection { 00018 00019 00022 template <typename T> 00023 struct List { 00024 struct ListNode { 00025 struct ListNode *next; 00026 T v; 00027 }; 00028 struct ListNode *head, *tail; 00029 00030 List() : head(null), tail(null) { } 00031 00032 void push_front(T v) { 00033 struct ListNode *l = static_cast<struct ListNode*>(Collection::Mem::kmalloc(sizeof(struct ListNode), const_cast<char*>("listnode"))); 00034 l->next=head; 00035 l->v=v; 00036 head= l; 00037 if (tail == null) 00038 tail= l; 00039 } 00040 00041 void push_back(T v) { 00042 struct ListNode *l = static_cast<struct ListNode*>(Collection::Mem::kmalloc(sizeof(struct ListNode), "listnode")); 00043 l->next=null; 00044 l->v=v; 00045 l->tail->next=l; 00046 tail= l; 00047 } 00048 00049 T get_front() { 00050 return head->v; 00051 } 00052 00053 T get_back() { 00054 return tail->v; 00055 } 00056 00057 T pop_front() { 00058 //throws if list is empty 00059 T v = head->v; 00060 struct ListNode *l= head; 00061 head=head->next; 00062 if (head==null) 00063 tail=null; 00064 Collection::Mem::kfree(l); 00065 return v; 00066 } 00067 00068 //czas liniowy 00069 //throws if list is empty 00070 T pop_back() { 00071 struct ListNode *l; 00072 T v; 00073 if (head==tail) { 00074 v= head->v; 00075 Collection::Mem::kfree(head); 00076 head=tail=null; 00077 return v; 00078 } 00079 for (l=head; l->next->next; l=l->next) ; 00080 v= l->next->v; 00081 l->next=null; 00083 Collection::Mem::kfree(tail); 00084 tail=l; 00085 return v; 00086 } 00087 00088 bool isEmpty() { 00089 return head==null; 00090 } 00091 00092 }; 00093 } 00094 00095 #endif 00096