00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef __PANALIX_COLLECTION_HPP
00012 #define __PANALIX_COLLECTION_HPP
00013
00014
00015
00016 namespace Collection {
00017 extern struct Memory::Heap::heapbox collection_heapbox;
00018
00019 void init();
00020 namespace Mem {
00021 void *kmalloc(uint32 size, char *name);
00022 void kfree(void *ptr);
00023 }
00024
00025
00026 #if 0
00027 namespace AvlTree_2 {
00028 template<typename T,int (*cmp)(T,T)>
00029 struct AvlTree {
00030 struct AvlNode {
00031 struct AvlNode *l, *r;
00032 T key;
00033 uint32 ht;
00034 };
00035
00036 struct AvlNode *nd;
00037
00038 void rotleft(struct AvlNode *&av) {
00039 testif(av!=null);
00040 testif(av->r != null);
00041
00042 struct AvlNode *v;
00043
00044 v= av->r;
00045 av->r = v->l;
00046 v->l = av;
00047
00048 av= v;
00049
00050 setHeight(av->l);
00051 setHeight(av);
00052 }
00053
00054 void rotright(struct AvlNode *&av) {
00055 testif(av!=null);
00056 testif(av->l!=null);
00057
00058 struct AvlNode *v;
00059
00060 v=av->l;
00061 av->l = av->l->r;
00062 v->r = av;
00063
00064 av= v;
00065
00066 setHeight(av->r);
00067 setHeight(av);
00068 }
00069
00070 void setHeight(struct AvlNode *&av) {
00071 uint32 ht=0;
00072 testif(av!=null);
00073 if (av->l)
00074 ht=av->l->ht;
00075 if (av->r)
00076 ht=MAX(ht,av->r->ht);
00077 av->ht= 1+ht;
00078 }
00079
00080 bool checkHt() { return checkHt(nd); }
00082 bool checkHt(struct AvlNode *&av) {
00083 if (av == null) return false;
00084 uint32 lh=0,rh=0;
00085 if (av->l)
00086 lh= av->l->ht;
00087 if (av->r)
00088 rh= av->r->ht;
00089
00090 bool ret = checkHt(av->r) || checkHt(av->l);
00091
00092 if (av->ht != 1+MAX(lh,rh) || lh > rh+1 || rh > lh+1) {
00093 kprintf("checkHt: ");
00094 write(av);
00095 kprintf("\n");
00096 return true;
00097 }
00098 return ret;
00099 }
00100
00101 uint32 height(struct AvlNode *&av) {
00102 if (av==null)
00103 return 0;
00104 return av->ht;
00105 }
00106
00107 void bal(struct AvlNode *&av) {
00108 uint32 hl=height(av->l);
00109 uint32 hr=height(av->r);
00110
00111 if (hl > hr+1) {
00112 if (height(av->l->l) >= height(av->l->r))
00113 rotright(av);
00114 else {
00115 rotleft(av->l);
00116 rotright(av);
00117 }
00118 }
00119 if (hr > hl+1) {
00120 if (height(av->r->r) >= height(av->r->l))
00121 rotleft(av);
00122 else {
00123 rotright(av->r);
00124 rotleft(av);
00125 }
00126 }
00127 }
00128
00129 bool insert(T v) {
00130 bool ret= insert(nd, v);
00131 return ret;
00132 }
00133
00134 bool insert(struct AvlNode *&av, T v) {
00135 if (av==null) {
00136 av= static_cast<struct AvlNode*>(kmalloc(sizeof(struct AvlNode),"avl node"));
00137 av->l=null;
00138 av->r=null;
00139 av->ht=1;
00140 av->key=v;
00141 return false;
00142 }
00143 int c= cmp(av->key,v);
00144 if (c==0) {
00145 av->key=v;
00146 return true;
00147 }
00148 if (c < 0) {
00149 bool ret=insert(av->r,v);
00150 setHeight(av);
00151 bal(av);
00152 return ret;
00153 }
00154 bool ret= insert(av->l,v);
00155 setHeight(av);
00156 bal(av);
00157
00158 return ret;
00159 }
00160
00161 bool remove(T v) { return remove(nd,v); }
00162 bool remove(struct AvlNode *&av, T v) {
00163 if (av==null) return false;
00164 int c = cmp(av->key,v);
00165 if (c==0) {
00166 if (av->r==null) {
00167 struct AvlNode *a;
00168 av=av->l;
00169 kfree(a);
00170 return true;
00171 } else {
00172 T a = removeMin(av->r);
00173 av->key=a;
00174 setHeight(av);
00175 bal(av);
00176 return true;
00177 }
00178 }
00179 bool ret;
00180 if (c < 0) {
00181 ret = remove(av->r,v);
00182 setHeight(av);
00183 bal(av);
00184 return ret;
00185 } else {
00186 ret= remove(av->l,v);
00187 setHeight(av);
00188 bal(av);
00189 }
00190 return ret;
00191 }
00192
00193 bool exists(T v) { return exists(nd,v); }
00194 bool exists(struct AvlNode *&av, T v) {
00195 if (av==null) return false;
00196 int c = cmp(av->key,v);
00197 if (c==0) return true;
00198 if (c<0) return exists(av->r,v);
00199 return exists(av->l,v);
00200 }
00201
00202 Collection::Option<T> find(T v) { return find(nd,v); }
00203 Collection::Option<T> find(struct AvlNode *&av, T v) {
00204 if (av==null) return Option<T>();
00205 int c = cmp(av->key,v);
00206 if (c==0) return Option<T>(v);
00207 if (c<0) return find(av->r,v);
00208 return find(av->l,v);
00209 }
00210
00211 T removeMin(struct AvlNode *&av) {
00212 testif(av!=null);
00213 if (av->l==null) {
00214 T ret= av->key;
00215 struct AvlNode *v=av->r;
00216 kfree(av);
00217 av= v;
00218 return ret;
00219 } else {
00220 T ret = removeMin(av->l);
00221 setHeight(av);
00222 return ret;
00223 }
00224 }
00225
00226 T findMin() { return findMin(nd); }
00227 T findMin(struct AvlNode *&av) {
00228 testif(av!=null);
00229 if (av->l == null)
00230 return av->key;
00231 return findMin(av->l);
00232 }
00233
00234 bool isEmpty() { return isEmpty(nd); }
00235 bool isEmpty(struct AvlNode *&av) {
00236 return av==null;
00237 }
00238
00239 void write() { write(nd); }
00240 void write(struct AvlNode *&av) {
00241 if (av == null) kprintf("-");
00242 else {
00243 kprintf("(");
00244 write(av->l);
00245 kprintf(",");
00246 kprintf("%d",av->key);
00247 kprintf(",");
00248 write(av->r);
00249 kprintf(",%d",av->ht);
00250 kprintf(")");
00251 }
00252 }
00253 };
00254
00255 }
00256 #endif
00257 }
00258
00259 #endif
00260