17 #ifndef INC_KY_Kernel_RadixTree_H
18 #define INC_KY_Kernel_RadixTree_H
58 template<
class T,
class Accessor>
class RadixTree
60 enum { KeyBits = 8*
sizeof(UPInt) };
64 RadixTree() : Root(0) {}
66 void Clear() { Root = 0; }
75 Accessor::ClearLinks(node);
80 Accessor::SetParent(node, (T*)root);
84 UPInt key = Accessor::GetKey(node);
89 if (Accessor::GetKey(head) == key)
93 T** link = Accessor::GetChildPtr(head, (bits >> (KeyBits-1)) & 1);
103 Accessor::SetParent(node, head);
113 void Remove(T* node, T* rotor)
115 T* parent = Accessor::GetParent(node);
126 UPInt ic = Accessor::GetChild(parent, 0) != node;
127 Accessor::SetChild(parent, ic, rotor);
134 Accessor::SetParent(rotor, parent);
136 if ((child = Accessor::GetChild(node, 0)) != 0)
138 Accessor::SetChild(rotor, 0, child);
139 Accessor::SetParent(child, rotor);
142 if ((child = Accessor::GetChild(node, 1)) != 0)
144 Accessor::SetChild(rotor, 1, child);
145 Accessor::SetParent(child, rotor);
149 Accessor::ClearLinks(node);
158 if (((rotor = *(rp = Accessor::GetChildPtr(node, 1))) != 0) ||
159 ((rotor = *(rp = Accessor::GetChildPtr(node, 0))) != 0))
162 while ((*(cp = Accessor::GetChildPtr(rotor, 1)) != 0) ||
163 (*(cp = Accessor::GetChildPtr(rotor, 0)) != 0))
174 const T* FindEqual(UPInt key)
const
176 const T* node = Root;
178 while (node && Accessor::GetKey(node) != key)
180 node = Accessor::GetChild(node, (bits >> (KeyBits-1)) & 1);
187 static const T* GetLeftmost(
const T* node)
189 return Accessor::GetChild(node, Accessor::GetChild(node, 0) == 0);
193 static const T* GetRightmost(
const T* node)
195 return Accessor::GetChild(node, Accessor::GetChild(node, 1) != 0);
200 const T* FindGrEq(UPInt key)
const
204 UPInt rkey = ~UPInt(0);
208 const T* node = Root;
219 nkey = Accessor::GetKey(node);
221 if (nkey >= key && diff < rkey)
224 if ((rkey = diff) == 0)
229 rt = Accessor::GetChild(node, 1);
230 node = Accessor::GetChild(node, (bits >> (KeyBits-1)) & 1);
231 if (rt != 0 && rt != node)
248 nkey = Accessor::GetKey(node);
250 if (nkey >= key && diff < rkey)
255 node = GetLeftmost(node);
263 const T* FindLeEq(UPInt key)
const
267 UPInt rkey = ~UPInt(0);
271 const T* node = Root;
281 nkey = Accessor::GetKey(node);
283 if (nkey <= key && diff < rkey)
286 if ((rkey = diff) == 0)
291 lt = Accessor::GetChild(node, 0);
292 node = Accessor::GetChild(node, (bits >> (KeyBits-1)) & 1);
293 if (lt != 0 && lt != node)
310 nkey = Accessor::GetKey(node);
312 if (nkey <= key && diff < rkey)
317 node = GetRightmost(node);
327 template<
class T,
class Accessor>
class RadixTreeMulti
335 T* head = Tree.Insert(node);
342 node->pNext = head->pNext;
345 node->pNext->pPrev = node;
352 if (node->pPrev != node)
362 Tree.Remove(node, rotor);
371 const T* FindBestGrEq(UPInt key)
373 return Tree.FindGrEq(key);
377 const T* FindBestLeEq(UPInt key)
379 return Tree.FindLeEq(key);
383 T* PullBestGrEq(UPInt key)
385 T* node = (T*)Tree.FindGrEq(key);
390 node = (T*)node->pNext;
397 T* PullBestLeEq(UPInt key)
399 T* node = (T*)Tree.FindLeEq(key);
404 node = (T*)node->pNext;
410 RadixTree<T, Accessor> Tree;
Definition: gamekitcrowddispersion.h:20