X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/c98390004f4f14cd8215302d77313f81e2546e22..90a3c35b295b07ebe3793bf5d3b882c3c1a5dc7c:/src/irc_dictionary.c diff --git a/src/irc_dictionary.c b/src/irc_dictionary.c index b393e54..06b115a 100644 --- a/src/irc_dictionary.c +++ b/src/irc_dictionary.c @@ -24,12 +24,9 @@ #include "stdinc.h" #include "sprintf_irc.h" -#include "tools.h" #include "irc_string.h" #include "client.h" -#include "memory.h" #include "setup.h" -#include "balloc.h" #include "irc_dictionary.h" static BlockHeap *elem_heap = NULL; @@ -198,40 +195,6 @@ irc_dictionary_get_linear_index(struct Dictionary *dict, const char *key) * * Retunes the tree, self-optimizing for the element which belongs to key. * - * Tuning the tree structure is a very complex operation. Unlike - * 2-3-4 trees and BTree/BTree+ structures, this structure is a - * constantly evolving algorithm. - * - * Instead of maintaining a balanced tree, we constantly adapt the - * tree by nominating a new root nearby the most recently looked up - * or added data. We are constantly retuning ourselves instead of - * doing massive O(n) rebalance operations as seen in BTrees, - * and the level of data stored in a tree is dynamic, instead of being - * held to a restricted design like other trees. - * - * Moreover, we are different than a radix/patricia tree, because we - * don't statically allocate positions. Radix trees have the advantage - * of not requiring tuning or balancing operations while having the - * disadvantage of requiring a large amount of memory to store - * large trees. Our efficiency as far as speed goes is not as - * fast as a radix tree; but is close to it. - * - * The retuning algorithm uses the comparison callback that is - * passed in the initialization of the tree container. If the - * comparator returns a value which is less than zero, we push the - * losing node out of the way, causing it to later be reparented - * with another node. The winning child of this comparison is always - * the right-most node. - * - * Once we have reached the key which has been targeted, or have reached - * a deadend, we nominate the nearest node as the new root of the tree. - * If an exact match has been found, the new root becomes the node which - * represents key. - * - * This results in a tree which can self-optimize for both critical - * conditions: nodes which are distant and similar and trees which - * have ordered lookups. - * * Inputs: * - node to begin search from * @@ -505,7 +468,7 @@ void irc_dictionary_destroy(struct Dictionary *dtree, s_assert(dtree != NULL); - DLINK_FOREACH_SAFE(n, tn, dtree->head) + RB_DLINK_FOREACH_SAFE(n, tn, dtree->head) { if (destroy_cb != NULL) (*destroy_cb)(n, privdata); @@ -513,7 +476,7 @@ void irc_dictionary_destroy(struct Dictionary *dtree, BlockHeapFree(elem_heap, n); } - MyFree(dtree); + rb_free(dtree); } /* @@ -542,7 +505,7 @@ void irc_dictionary_foreach(struct Dictionary *dtree, s_assert(dtree != NULL); - DLINK_FOREACH_SAFE(n, tn, dtree->head) + RB_DLINK_FOREACH_SAFE(n, tn, dtree->head) { /* delem_t is a subclass of node_t. */ struct DictionaryElement *delem = (struct DictionaryElement *) n; @@ -580,7 +543,7 @@ void *irc_dictionary_search(struct Dictionary *dtree, s_assert(dtree != NULL); - DLINK_FOREACH_SAFE(n, tn, dtree->head) + RB_DLINK_FOREACH_SAFE(n, tn, dtree->head) { /* delem_t is a subclass of node_t. */ struct DictionaryElement *delem = (struct DictionaryElement *) n;