cs_rbtree.h 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. /**
  2. * cs_rbtree.h
  3. * Copyright (c) 2007-2018 ls
  4. **/
  5. #ifndef _CS_RBTREE_H_INCLUDED_
  6. #define _CS_RBTREE_H_INCLUDED_
  7. #ifdef __cplusplus
  8. extern "C" {
  9. #endif
  10. typedef struct cs_rbtree_node_s {
  11. void *key;
  12. void *data;
  13. unsigned char color; /* if color=0 then the node is black */
  14. struct cs_rbtree_node_s *left, *right, *parent;
  15. } cs_rbtree_node_t;
  16. typedef struct cs_rbtree_s {
  17. cs_rbtree_node_t *root, *nil;
  18. int (*cmp)(void *d, void *s);
  19. } cs_rbtree_t;
  20. #define CS_TREE_RB_RED(n) ((n)->color = 1)
  21. #define CS_TREE_RB_BLACK(n) ((n)->color = 0)
  22. #define CS_TREE_RB_ISRED(n) ((n)->color)
  23. #define CS_TREE_RB_ISBLACK(n) (!CS_TREE_RB_ISRED(n))
  24. #define CS_TREE_RB_CPYCOLOR(d,s) ((d)->color = (s)->color)
  25. #define CS_TREE_RB_ISNIL(n) (!CS_TREE_RB_ISRED(n))
  26. #define CS_TREE_RB_LT(t, a, b) ((t)->cmp((a), (b)) < 0) // ((a) < (b))
  27. #define CS_TREE_RB_GT(t, a, b) ((t)->cmp((a), (b)) > 0) // ((a) > (b))
  28. #define CS_TREE_RB_EQ(t, a, b) ((t)->cmp((a), (b)) == 0) // ((a) == (b))
  29. CS_API void cs_rbtree_init(
  30. cs_rbtree_t *t, cs_rbtree_node_t *nil, int (*cmp)(void *, void *));
  31. CS_API cs_rbtree_node_t *cs_rbtree_add(cs_rbtree_t *t, cs_rbtree_node_t *n);
  32. CS_API void cs_rbtree_del(cs_rbtree_t *t, cs_rbtree_node_t *n);
  33. CS_API cs_rbtree_node_t *cs_rbtree_query(cs_rbtree_t *t, void *k);
  34. CS_API cs_rbtree_node_t *cs_rbtree_min(cs_rbtree_t *t);
  35. CS_API cs_rbtree_node_t *cs_rbtree_max(cs_rbtree_t *t);
  36. CS_API void cs_rbtree_order(
  37. cs_rbtree_t *t,
  38. void (*cs_rbtree_callback)(cs_rbtree_node_t *));
  39. #ifdef __cplusplus
  40. }
  41. #endif /* C++ */
  42. #endif