23#ifndef __WINE_WINE_RBTREE_H
24#define __WINE_WINE_RBTREE_H
26#define RB_ENTRY_VALUE(element, type, field) \
27 ((type *)((char *)(element) - offsetof(type, field)))
47#define RB_FLAG_RED 0x1
60 else if (
e->parent->left ==
e)
66 if (
e->right)
e->right->parent =
e;
78 else if (
e->parent->left ==
e)
79 e->parent->left =
left;
81 e->parent->right =
left;
83 e->left =
left->right;
84 if (
e->left)
e->left->parent =
e;
86 left->parent =
e->parent;
99 if (!iter)
return NULL;
100 while (iter->
left) iter = iter->
left;
106 if (!iter)
return NULL;
127 if (!iter)
return NULL;
130 while (iter->
left) iter = iter->
left;
131 if (!iter->
right)
return iter;
144#define RB_FOR_EACH(cursor, tree) \
145 for ((cursor) = rb_head((tree)->root); (cursor); (cursor) = rb_next(cursor))
148#define RB_FOR_EACH_ENTRY(elem, tree, type, field) \
149 for ((elem) = RB_ENTRY_VALUE(rb_head((tree)->root), type, field); \
150 (elem) != RB_ENTRY_VALUE(0, type, field); \
151 (elem) = RB_ENTRY_VALUE(rb_next(&elem->field), type, field))
154#define RB_FOR_EACH_DESTRUCTOR(cursor, cursor2, tree) \
155 for ((cursor) = rb_postorder_head((tree)->root); \
156 (cursor) && (((cursor2) = rb_postorder_next(cursor)) || 1); \
157 (cursor) = (cursor2))
160#define RB_FOR_EACH_ENTRY_DESTRUCTOR(elem, elem2, tree, type, field) \
161 for ((elem) = RB_ENTRY_VALUE(rb_postorder_head((tree)->root), type, field); \
162 (elem) != RB_ENTRY_VALUE(0, type, field) \
163 && (((elem2) = RB_ENTRY_VALUE(rb_postorder_next(&(elem)->field), type, field)) || 1); \
215 else if (
c < 0) iter = &
parent->left;
216 else iter = &
parent->right;
227 if (
entry->parent ==
entry->parent->parent->left)
241 entry->parent->flags &= ~RB_FLAG_RED;
260 entry->parent->flags &= ~RB_FLAG_RED;
286 else if (iter == iter->
parent->left)
302 iter->
parent->left = iter;
304 iter->
parent->right = iter;
307 if (iter->
left) iter->
left->parent = iter;
320 w->flags &= ~RB_FLAG_RED;
329 w->left->flags &= ~RB_FLAG_RED;
335 parent->flags &= ~RB_FLAG_RED;
337 w->right->flags &= ~RB_FLAG_RED;
348 w->flags &= ~RB_FLAG_RED;
357 w->right->flags &= ~RB_FLAG_RED;
363 parent->flags &= ~RB_FLAG_RED;
365 w->left->flags &= ~RB_FLAG_RED;
389 if (!(
src->parent =
dst->parent))
391 else if (
dst->parent->left ==
dst)
396 if ((
src->left =
dst->left))
398 if ((
src->right =
dst->right))
404#define wine_rb_entry rb_entry
405#define wine_rb_tree rb_tree
406#define wine_rb_init rb_init
407#define wine_rb_for_each_entry rb_for_each_entry
408#define wine_rb_destroy rb_destroy
409#define wine_rb_get rb_get
410#define wine_rb_put rb_put
411#define wine_rb_remove rb_remove
412#define wine_rb_remove_key rb_remove_key
413#define wine_rb_replace rb_replace
414#define WINE_RB_ENTRY_VALUE RB_ENTRY_VALUE
415#define WINE_RB_FOR_EACH_ENTRY RB_FOR_EACH_ENTRY
416#define WINE_RB_FOR_EACH_ENTRY_DESTRUCTOR RB_FOR_EACH_ENTRY_DESTRUCTOR
418#define wine_rb_clear rb_destroy
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
struct rb_node * rb_next(struct rb_node *)
struct rb_node * rb_prev(struct rb_node *)
GLubyte GLubyte GLubyte GLubyte w
static IPrintDialogCallback callback
static unsigned __int64 next
int(* rb_compare_func_t)(const void *key, const struct rb_entry *entry)
static struct rb_entry * rb_postorder_next(struct rb_entry *iter)
#define RB_FOR_EACH(cursor, tree)
static void rb_postorder(struct rb_tree *tree, rb_traverse_func_t *callback, void *context)
static void rb_destroy(struct rb_tree *tree, rb_traverse_func_t *callback, void *context)
static void rb_rotate_right(struct rb_tree *tree, struct rb_entry *e)
static void rb_for_each_entry(struct rb_tree *tree, rb_traverse_func_t *callback, void *context)
static void rb_rotate_left(struct rb_tree *tree, struct rb_entry *e)
static struct rb_entry * rb_head(struct rb_entry *iter)
static struct rb_entry * rb_tail(struct rb_entry *iter)
static int rb_put(struct rb_tree *tree, const void *key, struct rb_entry *entry)
static struct rb_entry * rb_get(const struct rb_tree *tree, const void *key)
static void rb_flip_color(struct rb_entry *entry)
#define RB_FOR_EACH_DESTRUCTOR(cursor, cursor2, tree)
void() rb_traverse_func_t(struct rb_entry *entry, void *context)
static void rb_remove_key(struct rb_tree *tree, const void *key)
static void rb_remove(struct rb_tree *tree, struct rb_entry *entry)
static struct rb_entry * rb_postorder_head(struct rb_entry *iter)
static void rb_init(struct rb_tree *tree, rb_compare_func_t compare)
static void rb_replace(struct rb_tree *tree, struct rb_entry *dst, struct rb_entry *src)
rb_compare_func_t compare