guint8 bit;
gsize kremain = keylen;
uintptr_t value;
+ guint8 *k = key;
bit = 1 << 7;
value = RADIX_NO_VALUE;
node = tree->root;
while (node && kremain) {
- if (node->value != RADIX_NO_VALUE) {
- value = node->value;
- }
-
if (node->skipped) {
/* It is obviously a leaf node */
if (node->d.s.keylen <= keylen &&
return value;
}
}
+ if (node->value != RADIX_NO_VALUE) {
+ value = node->value;
+ }
- if (*key & bit) {
+ if (*k & bit) {
node = node->d.n.right;
}
else {
bit >>= 1;
if (bit == 0) {
- key ++;
+ k ++;
bit = 1 << 7;
kremain --;
}
guint levels_uncompress)
{
guint8 *nkey = node->d.s.key + start_level / NBBY;
- guint8 bit = 1 << (8 - start_level % NBBY);
+ guint8 bit = 1 << (7 - start_level % NBBY);
struct radix_compressed_node *leaf, *next;
/* Make compressed leaf */
memcpy (leaf, node, sizeof (*node));
node->skipped = FALSE;
+ node->value = RADIX_NO_VALUE;
msg_debug ("uncompress %ud levels of tree", levels_uncompress);
}
/* Attach leaf node */
- msg_debug ("attach leaf node with value %p", leaf->value);
+ msg_debug ("attach leaf node to %s with value %p", (*nkey & bit) ? "right" : "left",
+ leaf->value);
if (*nkey & bit) {
node->d.n.right = leaf;
node->d.n.left = NULL;
guint cur_level = 0;
guint8 bit;
gsize kremain = keylen;
+ uintptr_t oldval;
bit = 1 << 7;
node = tree->root;
TRUE);
*prev = next;
}
+ else if (next->value == RADIX_NO_VALUE) {
+ msg_debug ("insert value node with %p", value);
+ next->value = value;
+ }
+ else {
+ oldval = next->value;
+ next->value = value;
+ msg_debug ("replace value for node with: %p, old value: %p", value, oldval);
+ return oldval;
+ }
return next->value;
}