-// Generic radix tree implementation. It's only kernel-specific because
-// it uses the kernel page allocator; each node takes up one page. The
-// depth of the tree is dynamically growable (but not currently
-// shrinkable).
+// This is like RadixTree, but it uses the kernel page allocator; each
+// node takes up one page. The depth of the tree is dynamically growable
+// (but not currently shrinkable). It also auto-guesses radix_bits based
+// on the size of T, so as to fit a page.
#ifndef _KERN_RADIX_H
#define _KERN_RADIX_H
namespace Util {
// Key must be an integer.
template <typename T, typename Key>
- class RadixTree {
+ class PageRadixTree {
void *toplevel;
uint depth; // in bits
node = new_node;
}
- assert(shift == RADIX_final_shift - dir_shift);
- return static_cast<T *>(node) + key_to_offset(key);
+ assert(shift == 0 || shift == RADIX_final_shift - dir_shift);
+ return (T *)((unsigned long)node +
+ (key_to_offset(key) << RADIX_data_bits));
}
- RadixTree()
+ PageRadixTree()
{
toplevel = Mem::alloc_pages(1);
bzero(toplevel, Arch::page_size);