Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

radix.h 2.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #ifndef RADIX_H
  2. #define RADIX_H
  3. #include "config.h"
  4. #include "mem_pool.h"
  5. #define RADIX_NO_VALUE (uintptr_t)-1
  6. typedef struct radix_node_s radix_node_t;
  7. struct radix_node_s {
  8. radix_node_t *right;
  9. radix_node_t *left;
  10. radix_node_t *parent;
  11. uintptr_t value;
  12. guint32 key;
  13. };
  14. typedef struct {
  15. radix_node_t *root;
  16. size_t size;
  17. memory_pool_t *pool;
  18. } radix_tree_t;
  19. typedef gboolean (*radix_tree_traverse_func)(guint32 key, guint32 mask, uintptr_t value, void *user_data);
  20. /**
  21. * Create new radix tree
  22. */
  23. radix_tree_t *radix_tree_create (void);
  24. /**
  25. * Insert value to radix tree
  26. * returns: 1 if value already exists
  27. * 0 if operation was successfull
  28. * -1 if there was some error
  29. */
  30. gint radix32tree_insert (radix_tree_t *tree, guint32 key, guint32 mask, uintptr_t value);
  31. /**
  32. * Add value to radix tree or insert it if value does not exists
  33. * returns: value if value already exists and was added
  34. * 0 if value was inserted
  35. * -1 if there was some error
  36. */
  37. uintptr_t radix32tree_add (radix_tree_t *tree, guint32 key, guint32 mask, uintptr_t value);
  38. /**
  39. * Replace value in radix tree or insert it if value does not exists
  40. * returns: 1 if value already exists and was replaced
  41. * 0 if value was inserted
  42. * -1 if there was some error
  43. */
  44. gint radix32tree_replace (radix_tree_t *tree, guint32 key, guint32 mask, uintptr_t value);
  45. /**
  46. * Delete value from radix tree
  47. * returns: 1 if value does not exist
  48. * 0 if value was deleted
  49. * -1 if there was some error
  50. */
  51. gint radix32tree_delete (radix_tree_t *tree, guint32 key, guint32 mask);
  52. /**
  53. * Find value in radix tree
  54. * returns: value if value was found
  55. * RADIX_NO_VALUE if value was not found
  56. */
  57. uintptr_t radix32tree_find (radix_tree_t *tree, guint32 key);
  58. /**
  59. * Traverse via the whole tree calling specified callback
  60. */
  61. void radix32tree_traverse (radix_tree_t *tree, radix_tree_traverse_func func, void *user_data);
  62. /**
  63. * Frees radix tree
  64. */
  65. void radix_tree_free (radix_tree_t *tree);
  66. #endif