60# define ALPHA_0 .292893f
61# define ALPHA_1 .707106f
62# define ALPHA_2 .414213f
63# define ALPHA_3 .585786f
72#define WEIGHT(n) ((n) ? (n)->weight : 1U)
121static wb_node* node_new(
void* key);
147 dct->
_vtable = &wb_tree_vtable;
158static inline unsigned
161 unsigned rotations = 0;
163 if (weight * 1000U < n->
weight * 293U) {
183 if ((n->
rlink = a) != NULL)
189 if ((nr->
llink = b) != NULL)
196 }
else if (weight * 1000U > n->
weight * 707U) {
200 if (weight * 1000U > nl->
weight * 414U) {
217 if ((nl->
rlink = a) != NULL)
223 if ((n->
llink = b) != NULL)
244 parent = node; node = node->
llink;
246 parent = node; node = node->
rlink;
251 wb_node*
const add = node = node_new(key);
255 if (!(node->
parent = parent)) {
261 parent->
llink = node;
263 parent->
rlink = node;
265 unsigned rotations = 0;
266 while ((node = parent) != NULL) {
269 rotations += fixup(
tree, node);
302 unsigned rotations = 0;
306 rotations += fixup(
tree, parent);
319 remove_node(
tree, node);
345 *datum = node->
datum;
388 if (parent->
llink == node) {
395 unsigned lweight, rweight;
396 if (!node_verify(
tree, node, node->
llink, &lweight) ||
397 !node_verify(
tree, node, node->
rlink, &rweight))
404 *weight = lweight + rweight;
420 unsigned root_weight;
421 return node_verify(
tree, NULL,
tree->
root, &root_weight);
444 itor->
_vtable = &wb_tree_itor_vtable;
472 remove_node(itor->
tree, itor->
node);
dict_remove_result(* dict_remove_func)(void *obj, const void *key)
int(* dict_compare_func)(const void *, const void *)
bool(* dict_select_func)(void *obj, size_t n, const void **key, void **datum)
void(* dict_invalidate_func)(void *itor)
size_t(* dict_traverse_func)(void *obj, dict_visit_func visit, void *user_data)
dict_insert_result(* dict_insert_func)(void *obj, void *key)
void(* dict_delete_func)(void *, void *)
int(* dict_icompare_func)(void *itor1, void *itor2)
bool(* dict_nextn_func)(void *itor, size_t count)
bool(* dict_valid_func)(const void *itor)
size_t(* dict_count_func)(const void *obj)
bool(* dict_first_func)(void *itor)
bool(* dict_next_func)(void *itor)
void *(* dict_key_func)(void *itor)
size_t(* dict_dfree_func)(void *obj, dict_delete_func delete_func)
void **(* dict_datum_func)(void *itor)
bool(* dict_prevn_func)(void *itor, size_t count)
void **(* dict_search_func)(void *obj, const void *key)
bool(* dict_isearch_func)(void *itor, const void *key)
bool(* dict_iremove_func)(void *itor)
bool(* dict_prev_func)(void *itor)
dict_itor *(* dict_inew_func)(void *obj)
bool(* dict_last_func)(void *itor)
bool(* dict_verify_func)(const void *obj)
bool(* dict_visit_func)(const void *, void *, void *)
size_t(* dict_clear_func)(void *obj, dict_delete_func delete_func)
void(* dict_ifree_func)(void *itor)
const itor_vtable * _vtable
const dict_vtable * _vtable
dict_compare_func cmp_func
bool tree_iterator_last(void *Iterator)
size_t tree_free(void *Tree, dict_delete_func delete_func)
void ** tree_iterator_datum(void *Iterator)
bool tree_iterator_next(void *Iterator)
void * tree_node_max(void *Node)
void tree_iterator_invalidate(void *Iterator)
void ** tree_search_gt(void *Tree, const void *key)
int tree_iterator_compare(const void *Iterator1, const void *Iterator2)
void tree_node_rot_left(void *Tree, void *Node)
void * tree_search_node(void *Tree, const void *key)
bool tree_iterator_search_le(void *Iterator, const void *key)
bool tree_iterator_valid(const void *Iterator)
size_t tree_count(const void *Tree)
void ** tree_search_lt(void *Tree, const void *key)
size_t tree_clear(void *Tree, dict_delete_func delete_func)
const void * tree_iterator_key(const void *Iterator)
size_t tree_min_path_length(const void *Tree)
void * tree_node_min(void *Node)
void ** tree_search(void *Tree, const void *key)
bool tree_iterator_nextn(void *Iterator, size_t count)
size_t tree_traverse(void *Tree, dict_visit_func visit, void *user_data)
size_t tree_total_path_length(const void *Tree)
bool tree_iterator_first(void *Iterator)
void tree_iterator_free(void *Iterator)
bool tree_iterator_prevn(void *Iterator, size_t count)
bool tree_iterator_search_lt(void *Iterator, const void *key)
bool tree_iterator_search_ge(void *Iterator, const void *key)
size_t tree_max_path_length(const void *Tree)
bool tree_iterator_search_gt(void *Iterator, const void *key)
void ** tree_search_ge(void *Tree, const void *key)
void tree_node_rot_right(void *Tree, void *Node)
void ** tree_search_le(void *Tree, const void *key)
bool tree_iterator_search(void *Iterator, const void *key)
bool tree_iterator_prev(void *Iterator)
#define TREE_NODE_FIELDS(node_type)
#define TREE_ITERATOR_FIELDS(tree_type, node_type)
#define TREE_FIELDS(node_type)
bool wb_itor_first(wb_itor *itor)
size_t wb_tree_clear(wb_tree *tree, dict_delete_func delete_func)
void wb_itor_free(wb_itor *itor)
void ** wb_tree_search_ge(wb_tree *tree, const void *key)
void ** wb_tree_search_le(wb_tree *tree, const void *key)
size_t wb_tree_count(const wb_tree *tree)
int wb_itor_compare(const wb_itor *i1, const wb_itor *i2)
bool wb_itor_last(wb_itor *itor)
bool wb_itor_search_lt(wb_itor *itor, const void *key)
const void * wb_itor_key(const wb_itor *itor)
bool wb_itor_remove(wb_itor *itor)
bool wb_itor_search_gt(wb_itor *itor, const void *key)
void ** wb_tree_search_lt(wb_tree *tree, const void *key)
size_t wb_tree_traverse(wb_tree *tree, dict_visit_func visit, void *user_data)
wb_tree * wb_tree_new(dict_compare_func cmp_func)
dict_insert_result wb_tree_insert(wb_tree *tree, void *key)
dict * wb_dict_new(dict_compare_func cmp_func)
bool wb_itor_prevn(wb_itor *itor, size_t count)
dict_itor * wb_dict_itor_new(wb_tree *tree)
bool wb_itor_search(wb_itor *itor, const void *key)
bool wb_tree_verify(const wb_tree *tree)
void ** wb_itor_datum(wb_itor *itor)
bool wb_itor_search_ge(wb_itor *itor, const void *key)
bool wb_itor_nextn(wb_itor *itor, size_t count)
bool wb_itor_search_le(wb_itor *itor, const void *key)
void wb_itor_invalidate(wb_itor *itor)
size_t wb_tree_free(wb_tree *tree, dict_delete_func delete_func)
bool wb_itor_valid(const wb_itor *itor)
bool wb_itor_prev(wb_itor *itor)
bool wb_tree_select(wb_tree *tree, size_t n, const void **key, void **datum)
size_t wb_tree_min_path_length(const wb_tree *tree)
dict_remove_result wb_tree_remove(wb_tree *tree, const void *key)
bool wb_itor_next(wb_itor *itor)
void ** wb_tree_search(wb_tree *tree, const void *key)
void ** wb_tree_search_gt(wb_tree *tree, const void *key)
wb_itor * wb_itor_new(wb_tree *tree)
size_t wb_tree_max_path_length(const wb_tree *tree)
size_t wb_tree_total_path_length(const wb_tree *tree)