unbound
0.1
|
Implementation of a redblack tree. More...
Defines | |
#define | BLACK 0 |
Node colour black. | |
#define | RED 1 |
Node colour red. | |
Functions | |
static void | rbtree_rotate_left (rbtree_t *rbtree, rbnode_t *node) |
rotate subtree left (to preserve redblack property) | |
static void | rbtree_rotate_right (rbtree_t *rbtree, rbnode_t *node) |
rotate subtree right (to preserve redblack property) | |
static void | rbtree_insert_fixup (rbtree_t *rbtree, rbnode_t *node) |
Fixup node colours when insert happened. | |
static void | rbtree_delete_fixup (rbtree_t *rbtree, rbnode_t *child, rbnode_t *child_parent) |
Fixup node colours when delete happened. | |
rbtree_t * | rbtree_create (int(*cmpf)(const void *, const void *)) |
Create new tree (malloced) with given key compare function. | |
void | rbtree_init (rbtree_t *rbtree, int(*cmpf)(const void *, const void *)) |
Init a new tree (malloced by caller) with given key compare function. | |
rbnode_t * | rbtree_insert (rbtree_t *rbtree, rbnode_t *data) |
Insert data into the tree. | |
rbnode_t * | rbtree_search (rbtree_t *rbtree, const void *key) |
Find key in tree. | |
static void | swap_int8 (uint8_t *x, uint8_t *y) |
helpers for delete: swap node colours | |
static void | swap_np (rbnode_t **x, rbnode_t **y) |
helpers for delete: swap node pointers | |
static void | change_parent_ptr (rbtree_t *rbtree, rbnode_t *parent, rbnode_t *old, rbnode_t *new) |
Update parent pointers of child trees of 'parent'. | |
static void | change_child_ptr (rbnode_t *child, rbnode_t *old, rbnode_t *new) |
Update parent pointer of a node 'child'. | |
rbnode_t * | rbtree_delete (rbtree_t *rbtree, const void *key) |
Delete element from tree. | |
int | rbtree_find_less_equal (rbtree_t *rbtree, const void *key, rbnode_t **result) |
Find, but match does not have to be exact. | |
rbnode_t * | rbtree_first (rbtree_t *rbtree) |
Returns first (smallest) node in the tree. | |
rbnode_t * | rbtree_last (rbtree_t *rbtree) |
Returns last (largest) node in the tree. | |
rbnode_t * | rbtree_next (rbnode_t *node) |
Returns next larger node in the tree. | |
rbnode_t * | rbtree_previous (rbnode_t *node) |
Returns previous smaller node in the tree. | |
static void | traverse_post (void(*func)(rbnode_t *, void *), void *arg, rbnode_t *node) |
recursive descent traverse | |
void | traverse_postorder (rbtree_t *tree, void(*func)(rbnode_t *, void *), void *arg) |
Call function for all elements in the redblack tree, such that leaf elements are called before parent elements. | |
Variables | |
rbnode_t | rbtree_null_node |
the NULL node, global alloc |
Implementation of a redblack tree.
rbtree_t* rbtree_create | ( | int(*)(const void *, const void *) | cmpf | ) |
Create new tree (malloced) with given key compare function.
cmpf,: | compare function (like strcmp) takes pointers to two keys. |
References rbtree_init().
Referenced by anchors_create(), forwards_apply_cfg(), insert_lock(), macro_store_create(), main(), outside_network_create(), and read_create().
void rbtree_init | ( | rbtree_t * | rbtree, |
int(*)(const void *, const void *) | cmpf | ||
) |
Init a new tree (malloced by caller) with given key compare function.
rbtree,: | uninitialised memory for new tree, returned empty. |
cmpf,: | compare function (like strcmp) takes pointers to two keys. |
References rbtree_t::cmp, rbtree_t::count, RBTREE_NULL, and rbtree_t::root.
Referenced by addr_tree_init(), autr_global_create(), local_zone_create(), local_zones_create(), mesh_create(), mesh_delete_all(), mesh_detach_subs(), mesh_state_create(), name_tree_init(), neg_setup_zone_node(), nsec3_hash_test(), nsec3_prove_nameerror(), nsec3_prove_nodata(), nsec3_prove_nods(), nsec3_prove_nxornodata(), nsec3_prove_wildcard(), rbtree_create(), rrset_canonical(), ub_ctx_create(), and val_neg_create().
rbnode_t* rbtree_insert | ( | rbtree_t * | rbtree, |
rbnode_t * | data | ||
) |
Insert data into the tree.
rbtree,: | tree to insert to. |
data,: | element to insert. |
References rbtree_t::cmp, rbnode_t::color, rbtree_t::count, fptr_ok, fptr_whitelist_rbtree_cmp(), rbnode_t::key, rbnode_t::left, rbnode_t::parent, rbtree_insert_fixup(), RBTREE_NULL, RED, rbnode_t::right, and rbtree_t::root.
Referenced by addr_tree_insert(), anchor_new_ta(), autr_tp_create(), canonical_sort(), context_deserialize_new_query(), context_new(), forwards_insert_data(), get_codeline(), insert_lock(), local_zones_add_zone(), lz_enter_zone_dname(), lz_find_create_node(), macro_assign(), mesh_attach_sub(), mesh_new_callback(), mesh_new_client(), mesh_new_prefetch(), mesh_state_attachment(), mesh_walk_supers(), name_tree_insert(), neg_create_zone(), neg_insert_data(), nsec3_hash_name(), parse_var_line(), read_create(), read_lock(), select_id(), serviced_create(), set_next_probe(), and todo_probe().
rbnode_t* rbtree_search | ( | rbtree_t * | rbtree, |
const void * | key | ||
) |
Find key in tree.
Returns NULL if not found.
rbtree,: | tree to find in. |
key,: | key that must match. |
References rbtree_find_less_equal().
Referenced by anchor_find(), context_deserialize_answer(), context_deserialize_cancel(), context_lookup_new_query(), find_id(), forwards_delete_zone(), get_codeline(), local_data_answer(), local_zones_find(), lookup_serviced(), lz_exists(), lz_find_node(), macro_getvar(), mesh_area_find(), name_tree_find(), need_hole_insert(), neg_find_data(), neg_find_zone(), nsec3_hash_name(), outnet_udp_cb(), rbtree_delete(), read_create(), read_lock(), set_next_probe(), and ub_cancel().
rbnode_t* rbtree_delete | ( | rbtree_t * | rbtree, |
const void * | key | ||
) |
Delete element from tree.
rbtree,: | tree to delete from. |
key,: | key of item to delete. |
References BLACK, change_child_ptr(), change_parent_ptr(), rbnode_t::color, rbtree_t::count, rbnode_t::left, log_assert, rbnode_t::parent, rbtree_delete_fixup(), RBTREE_NULL, rbtree_search(), RED, rbnode_t::right, swap_int8(), and swap_np().
Referenced by add_bg_result(), anchors_assemble_rrsets(), autr_tp_create(), autr_tp_remove(), del_empty_term(), forwards_delete_zone(), libworker_bg_done_cb(), local_zones_del_zone(), mesh_detach_subs(), mesh_run(), mesh_state_delete(), neg_delete_data(), neg_delete_zone(), outnet_serviced_query(), outnet_serviced_query_stop(), outnet_udp_cb(), parse_var_line(), pending_delete(), process_answer_detail(), serviced_callbacks(), set_next_probe(), todo_probe(), ub_cancel(), ub_resolve(), and ub_resolve_async().
int rbtree_find_less_equal | ( | rbtree_t * | rbtree, |
const void * | key, | ||
rbnode_t ** | result | ||
) |
Find, but match does not have to be exact.
rbtree,: | tree to find in. |
key,: | key to find position of. |
result,: | set to the exact node if present, otherwise to element that precedes the position of key in the tree. NULL if no smaller element. |
References rbtree_t::cmp, fptr_ok, fptr_whitelist_rbtree_cmp(), rbnode_t::key, rbnode_t::left, log_assert, RBTREE_NULL, rbnode_t::right, and rbtree_t::root.
Referenced by addr_tree_lookup(), anchors_lookup(), forwards_lookup(), forwards_next_root(), local_zones_lookup(), name_tree_lookup(), name_tree_next_root(), neg_closest_data(), neg_closest_data_parent(), neg_closest_zone_parent(), and rbtree_search().
rbnode_t* rbtree_first | ( | rbtree_t * | rbtree | ) |
Returns first (smallest) node in the tree.
rbtree,: | tree |
References rbnode_t::left, RBTREE_NULL, and rbtree_t::root.
Referenced by anchors_assemble_rrsets(), forwards_next_root(), name_tree_next_root(), remove_item(), sumtrees_inuse(), todo_probe(), and wait_probe_time().
rbnode_t* rbtree_last | ( | rbtree_t * | rbtree | ) |
Returns last (largest) node in the tree.
rbtree,: | tree |
References RBTREE_NULL, rbnode_t::right, and rbtree_t::root.
Referenced by neg_nsec3_getnc().
rbnode_t* rbtree_next | ( | rbnode_t * | rbtree | ) |
Returns next larger node in the tree.
rbtree,: | tree |
References rbnode_t::left, rbnode_t::parent, RBTREE_NULL, and rbnode_t::right.
Referenced by anchors_assemble_rrsets(), forwards_next_root(), is_terminal(), name_tree_next_root(), remove_item(), set_kiddo_parents(), and wipeout().
rbnode_t* rbtree_previous | ( | rbnode_t * | rbtree | ) |
Returns previous smaller node in the tree.
rbtree,: | tree |
References rbnode_t::left, rbnode_t::parent, RBTREE_NULL, and rbnode_t::right.
void traverse_postorder | ( | rbtree_t * | tree, |
void(*)(rbnode_t *, void *) | func, | ||
void * | arg | ||
) |
Call function for all elements in the redblack tree, such that leaf elements are called before parent elements.
So that all elements can be safely free()d. Note that your function must not remove the nodes from the tree. Since that may trigger rebalances of the rbtree.
tree,: | the tree |
func,: | function called with element and user arg. The function must not alter the rbtree. |
arg,: | user argument. |
References rbtree_t::root, and traverse_post().
Referenced by anchors_delete(), local_zones_delete(), macro_store_delete(), neg_cache_delete(), neg_clear_zones(), outside_network_delete(), and ub_ctx_delete().
{ RBTREE_NULL, RBTREE_NULL, RBTREE_NULL, NULL, BLACK }
the NULL node, global alloc
the global empty node