graph.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #include <stdlib.h>
  2. #include "map.h"
  3. #include "graph.h"
  4. static void
  5. node_dispose_set(void *data, void *extra)
  6. {
  7. Graph_node *node = data;
  8. Disposer *vrtx_dspr = extra;
  9. if (vrtx_dspr)
  10. vrtx_dspr->dispose(node->vertex, vrtx_dspr->extra);
  11. set_dispose(&node->edges, NULL);
  12. free(data);
  13. }
  14. static void
  15. node_dispose_map(void *data, void *extra)
  16. {
  17. Graph_node *node = data;
  18. Disposer *vrtx_dspr = extra;
  19. if (vrtx_dspr)
  20. vrtx_dspr->dispose(node->vertex, vrtx_dspr->extra);
  21. map_dispose(&node->edges);
  22. free(data);
  23. }
  24. Nit_error
  25. graph_init(Graph *graph, Disposer *vrtx_dspr, int map)
  26. {
  27. graph->nd_dspr.dispose = map ? node_dispose_map : node_dispose_set;
  28. graph->nd_dspr.extra = vrtx_dspr;
  29. return set_init(&graph->nodes, &graph->nd_dspr, 0);
  30. }
  31. void
  32. graph_dispose(Graph *graph)
  33. {
  34. set_dispose(&graph->nodes, NULL);
  35. }
  36. Graph_node *
  37. graph_node(Graph *graph, void *vertex)
  38. {
  39. Graph_node *node = malloc(sizeof(*node));
  40. if (!node)
  41. return NULL;
  42. if (set_init(&node->edges, NULL, 0))
  43. goto err_node;
  44. node->vertex = vertex;
  45. /* add ptr */
  46. if (set_add(&graph->nodes, sizeof(node), node))
  47. goto err_set;
  48. return node;
  49. err_set:
  50. set_dispose(&node->edges, NULL);
  51. err_node:
  52. free(node);
  53. return NULL;
  54. }
  55. void *
  56. graph_denode(Graph *graph, Graph_node *node, int ret_ver)
  57. {
  58. void *vertex = node->vertex;
  59. set_remove(&graph->nodes, sizeof(node), (void **) &node);
  60. graph->nd_dspr.dispose(node, ret_ver ? graph->nd_dspr.extra : NULL);
  61. return ret_ver ? vertex : NULL;
  62. }
  63. Nit_error
  64. graph_join(Graph_node *from, Graph_node *to,
  65. uint32_t key_len, const void *key)
  66. {
  67. if (key)
  68. return map_add(&from->edges, key_len, key, to);
  69. return set_add(&from->edges, sizeof(to), &to);
  70. }
  71. void
  72. graph_disjoin(Graph_node *from, Graph_node *to,
  73. uint32_t key_len, const void *key)
  74. {
  75. void *val;
  76. if (key) {
  77. map_remove(&from->edges, key_len, key, &val);
  78. } else {
  79. set_remove(&from->edges, sizeof(to), (void **) &to);
  80. }
  81. }
  82. Graph_node *
  83. graph_get(Graph_node *node, uint32_t key_len, const void *key)
  84. {
  85. void *val;
  86. if (!map_get(&node->edges, key_len, key, &val))
  87. return NULL;
  88. return val;
  89. }
  90. int
  91. graph_linked(Graph_node *from, Graph_node *to, Set_key *map_key)
  92. {
  93. int bin;
  94. Set_entry *entry;
  95. if (!map_key)
  96. return set_contains(&from->edges, sizeof(to), &to);
  97. map_foreach (&from->edges, bin, entry)
  98. if (map_val(entry->dat, entry->key_len) == to) {
  99. map_key->dat = entry->dat;
  100. map_key->key_len = entry->key_len;
  101. return 1;
  102. }
  103. return 0;
  104. }