|
|
|
@ -61,7 +61,7 @@ guint li_radixtree32_free(liRadixTree32 *tree) {
|
|
|
|
|
void li_radixtree32_insert(liRadixTree32 *tree, guint32 key, guint32 mask, gpointer data) {
|
|
|
|
|
liRadixNode32 *last_node, *leaf;
|
|
|
|
|
liRadixNode32 *node = tree->root[(key & tree->root_mask) >> (32 - tree->root_width)];
|
|
|
|
|
//g_print("root: %p, %x & %x => %x\n", (void*)node, key, tree->root_mask, (key & tree->root_mask) >> (32 - tree->root_width));
|
|
|
|
|
|
|
|
|
|
if (!node) {
|
|
|
|
|
/* no root node yet */
|
|
|
|
|
node = g_slice_new(liRadixNode32);
|
|
|
|
@ -77,11 +77,10 @@ void li_radixtree32_insert(liRadixTree32 *tree, guint32 key, guint32 mask, gpoin
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
do {//g_print("%x & %x => %x != %x\n", key, node->mask, key & node->mask, node->key);
|
|
|
|
|
if ((key & mask & node->mask) != node->key) {guint i;
|
|
|
|
|
do {
|
|
|
|
|
if ((key & mask & node->mask) != node->key) {
|
|
|
|
|
/* node key differs, split tree */
|
|
|
|
|
guint32 tmp;
|
|
|
|
|
liRadixNode32 *new_node;i=0;
|
|
|
|
|
liRadixNode32 *new_node;
|
|
|
|
|
|
|
|
|
|
/* the new internal node */
|
|
|
|
|
new_node = g_slice_new(liRadixNode32);
|
|
|
|
@ -101,14 +100,11 @@ void li_radixtree32_insert(liRadixTree32 *tree, guint32 key, guint32 mask, gpoin
|
|
|
|
|
leaf->left = NULL;
|
|
|
|
|
leaf->right = NULL;
|
|
|
|
|
|
|
|
|
|
do {//g_print("xxx #%u %x & %x => %x != %x\n", i++, key, new_node->mask, key&new_node->mask, node->key);
|
|
|
|
|
tmp = new_node->mask;
|
|
|
|
|
do {
|
|
|
|
|
new_node->mask <<= 1;
|
|
|
|
|
new_node->key &= new_node->mask;
|
|
|
|
|
} while ((key & mask & new_node->mask) != new_node->key);
|
|
|
|
|
//g_print("xxx %x & %x => %x != %x\n", key, new_node->mask, key&new_node->mask, node->key);
|
|
|
|
|
|
|
|
|
|
//if (key & (~ (~ new_node->mask >> 1))) {
|
|
|
|
|
if ((key & new_node->mask) > (key & (~ (~ new_node->mask >> 1)))) {
|
|
|
|
|
new_node->left = node;
|
|
|
|
|
new_node->right = leaf;
|
|
|
|
@ -138,7 +134,6 @@ void li_radixtree32_insert(liRadixTree32 *tree, guint32 key, guint32 mask, gpoin
|
|
|
|
|
last_node = node;
|
|
|
|
|
|
|
|
|
|
/* compare next bit */
|
|
|
|
|
//if (key & (~ (~ node->mask >> 1)))
|
|
|
|
|
if ((key & node->mask) > (key & (~ (~ node->mask >> 1))))
|
|
|
|
|
node = node->right;
|
|
|
|
|
else
|
|
|
|
@ -152,7 +147,6 @@ void li_radixtree32_insert(liRadixTree32 *tree, guint32 key, guint32 mask, gpoin
|
|
|
|
|
leaf->mask = mask;
|
|
|
|
|
leaf->parent = last_node;
|
|
|
|
|
|
|
|
|
|
//if (key & (~ (~ last_node->key >> 1)))
|
|
|
|
|
if ((key & last_node->mask) > (key & (~ (~ last_node->mask >> 1))))
|
|
|
|
|
last_node->right = leaf;
|
|
|
|
|
else
|
|
|
|
@ -167,7 +161,6 @@ gboolean li_radixtree32_remove(liRadixTree32 *tree, guint32 key, guint32 mask) {
|
|
|
|
|
while (node) {
|
|
|
|
|
if (!node->data || (key & mask) != node->key) {
|
|
|
|
|
/* compare next bit */
|
|
|
|
|
//if (key & (~ (~ node->key >> 1)))
|
|
|
|
|
if ((key & node->mask) > (key & (~ (~ node->mask >> 1))))
|
|
|
|
|
node = node->right;
|
|
|
|
|
else
|
|
|
|
@ -228,7 +221,7 @@ liRadixNode32 *li_radixtree32_lookup_node(liRadixTree32 *tree, guint32 key) {
|
|
|
|
|
liRadixNode32 *node = tree->root[(key & tree->root_mask) >> (32 - tree->root_width)];
|
|
|
|
|
liRadixNode32 *result = NULL;
|
|
|
|
|
|
|
|
|
|
while (node) {//g_print("%x & %x => %x != %x\n", key, node->mask, key & node->mask, node->key);
|
|
|
|
|
while (node) {
|
|
|
|
|
if ((key & node->mask) != node->key)
|
|
|
|
|
return result;
|
|
|
|
|
|
|
|
|
@ -236,7 +229,6 @@ liRadixNode32 *li_radixtree32_lookup_node(liRadixTree32 *tree, guint32 key) {
|
|
|
|
|
result = node;
|
|
|
|
|
|
|
|
|
|
/* compare next bit */
|
|
|
|
|
//if (key & (~ (~ node->key >> 1)))
|
|
|
|
|
if ((key & node->mask) > (key & (~ (~ node->mask >> 1))))
|
|
|
|
|
node = node->right;
|
|
|
|
|
else
|
|
|
|
|