rbtree.h 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #ifndef _LINUX_RBTREE_H
  2. #define _LINUX_RBTREE_H
  3. #if defined (__GNUC__)
  4. #elif defined (MSVC)
  5. #define __inline__ __inline
  6. #define inline __inline
  7. #else
  8. #endif
  9. struct rb_node {
  10. struct rb_node *rb_left; /* left element */
  11. struct rb_node *rb_right; /* right element */
  12. struct rb_node *rb_parent; /* parent element */
  13. int rb_color; /* node color */
  14. };
  15. struct rb_root {
  16. struct rb_node *rb_node; /* root of the tree */
  17. };
  18. #ifndef NULL
  19. #define NULL ((void *)0)
  20. #endif
  21. #if defined (__GNUC__)
  22. #define RB_ROOT ((struct rb_root){NULL})
  23. #elif defined (MSVC)
  24. #define RB_ROOT {NULL}//{struct rb_root _x = {NULL};}
  25. #else
  26. #endif
  27. #define rb_entry(p, container, field) \
  28. ((container *) ((char *)p - ((char *)&(((container *)0)->field))))
  29. #define RB_BLACK 0
  30. #define RB_RED 1
  31. extern void rb_insert_color(struct rb_node *, struct rb_root *);
  32. extern void rb_erase(struct rb_node *, struct rb_root *);
  33. /* Find logical next and previous nodes in a tree */
  34. extern struct rb_node *rb_next(struct rb_node *);
  35. extern struct rb_node *rb_prev(struct rb_node *);
  36. extern struct rb_node *rb_first(struct rb_root *);
  37. /* Fast replacement of a single node without remove/rebalance/add/rebalance */
  38. extern void rb_replace_node(struct rb_node *victim, struct rb_node *new,
  39. struct rb_root *root);
  40. static inline void rb_link_node(struct rb_node * node, struct rb_node * parent,
  41. struct rb_node ** rb_link)
  42. {
  43. node->rb_parent = parent;
  44. node->rb_color = RB_RED;
  45. node->rb_left = node->rb_right = NULL;
  46. *rb_link = node;
  47. }
  48. #endif /* _LINUX_RBTREE_H */