rb.h 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #ifndef __sti_rb_h__included__
  2. #define __sti_rb_h__included__
  3. typedef struct rb_node {
  4. struct rb_node* parent;
  5. char* key;
  6. void* data;
  7. struct rb_node* kids[2];
  8. } rb_node;
  9. typedef struct rb_tree_ {
  10. rb_node* root;
  11. size_t size;
  12. } rb_tree_;
  13. #define RB(t) \
  14. union { \
  15. t** type; \
  16. rb_tree_ tree; \
  17. }
  18. #define RB_init(t) \
  19. do { \
  20. (t)->tree.root = NULL; \
  21. (t)->tree.size = 0; \
  22. } while(0);
  23. #define RB_insert(t, k, v) rb_insert_(&(t)->tree, k, (void*)(intptr_t)(1 ? v : **((t)->type)))
  24. void rb_insert_(rb_tree_* tree, char* key, void* val);
  25. #define RB_delete(t, k, vp) rb_delete_(&(t)->tree, k, (void**)(1 ? vp : *((t)->type)))
  26. int rb_delete_(rb_tree_* tree, char* key, void** data);
  27. #define RB_find(t, k, f) (1 ? rb_find_(&(t)->tree, k, f) : (t)->type)
  28. void* rb_find_(rb_tree_* tree, char* key, int* found);
  29. #define RB_trunc(t) rb_trunc_(&(t)->tree)
  30. void rb_trunc_(rb_tree_* t);
  31. typedef long (*rb_traverse_fn)(char* key, void* value, void* user_data);
  32. #define RB_traverse(t, f, u) rb_traverse_(&(t)->tree, f, u)
  33. long rb_traverse_(rb_tree_* tree, rb_traverse_fn fn, void* user_data);
  34. #define RB_r_traverse_(t, f, u) rb_r_traverse_(&(t)->tree, f, u)
  35. long rb_r_traverse_(rb_tree_* tree, rb_traverse_fn fn, void* user_data);
  36. // debugging
  37. #ifdef DEBUG_RED_BLACK_TREE
  38. void html_header(char* file_path); // also opens the file
  39. void html_print_node(rb_node* n, int h);
  40. void html_spacer();
  41. void html_footer(); // also closes the file
  42. int get_max_height(rb_node* n);
  43. FILE* dbg;
  44. #endif // DEBUG_RED_BLACK_TREE
  45. #endif // __sti_rb_h__included__