X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/a362b4b2c4abbf2da6ec14cb44a8685a81107f6a..270869139db617e29a35bb9ded41087bb702f9ac:/lunaix-os/kernel/ds/btrie.c diff --git a/lunaix-os/kernel/ds/btrie.c b/lunaix-os/kernel/ds/btrie.c index 5ce7687..72758fb 100644 --- a/lunaix-os/kernel/ds/btrie.c +++ b/lunaix-os/kernel/ds/btrie.c @@ -16,14 +16,17 @@ #define BTRIE_INSERT 1 struct btrie_node* -__btrie_traversal(struct btrie* root, u32_t index, int options) +__btrie_traversal(struct btrie* root, unsigned long index, int options) { - index = index >> root->truncated; - u32_t lz = index ? ROUNDDOWN(31 - __builtin_clz(index), BTRIE_BITS) : 0; - u32_t bitmask = ((1 << BTRIE_BITS) - 1) << lz; - u32_t i = 0; + unsigned long lz; + unsigned long bitmask; + unsigned long i = 0; struct btrie_node* tree = root->btrie_root; + lz = index ? ICEIL(msbitl - clzl(index), root->order) : 0; + lz = lz * root->order; + bitmask = ((1 << root->order) - 1) << lz; + // Time complexity: O(log_2(log_2(N))) where N is the index to lookup while (bitmask && tree) { i = (index & bitmask) >> lz; @@ -49,24 +52,24 @@ __btrie_traversal(struct btrie* root, u32_t index, int options) } else { tree = subtree; } - bitmask = bitmask >> BTRIE_BITS; - lz -= BTRIE_BITS; + bitmask = bitmask >> root->order; + lz -= root->order; } return tree; } void -btrie_init(struct btrie* btrie, u32_t trunc_bits) +btrie_init(struct btrie* btrie, unsigned int order) { btrie->btrie_root = vzalloc(sizeof(struct btrie_node)); llist_init_head(&btrie->btrie_root->nodes); llist_init_head(&btrie->btrie_root->children); - btrie->truncated = trunc_bits; + btrie->order = order; } void* -btrie_get(struct btrie* root, u32_t index) +btrie_get(struct btrie* root, unsigned long index) { struct btrie_node* node = __btrie_traversal(root, index, 0); if (!node) { @@ -76,7 +79,7 @@ btrie_get(struct btrie* root, u32_t index) } void -btrie_set(struct btrie* root, u32_t index, void* data) +btrie_set(struct btrie* root, unsigned long index, void* data) { struct btrie_node* node = __btrie_traversal(root, index, BTRIE_INSERT); node->data = data; @@ -98,7 +101,7 @@ __btrie_rm_recursive(struct btrie_node* node) } void* -btrie_remove(struct btrie* root, u32_t index) +btrie_remove(struct btrie* root, unsigned long index) { struct btrie_node* node = __btrie_traversal(root, index, 0); if (!node) {