agar.h 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /* Licensed under LGPLv2+ - see LICENSE file for details */
  2. #ifndef CCAN_AGAR_H
  3. #define CCAN_AGAR_H
  4. #include "config.h"
  5. #include <string.h>
  6. #include <stdbool.h>
  7. #include <ccan/aga/aga.h>
  8. struct agar_edge_info {
  9. const void *to;
  10. aga_icost_t icost; /* integer edge cost */
  11. };
  12. struct agar_graph;
  13. struct agar_state;
  14. typedef int (*agar_edge_info_fn)(const struct agar_graph *gr,
  15. const void *nr,
  16. const void *e,
  17. struct agar_edge_info *ei);
  18. typedef const void *(*agar_first_edge_fn)(const struct agar_graph *gr,
  19. const void *nr);
  20. typedef const void *(*agar_next_edge_fn)(const struct agar_graph *gr,
  21. const void *nr,
  22. const void *e);
  23. struct agar_graph {
  24. agar_edge_info_fn edge_info;
  25. agar_first_edge_fn first_edge;
  26. agar_next_edge_fn next_edge;
  27. };
  28. #define AGAR_INIT_GRAPH(fe, ne, ei) \
  29. { (ei), (fe), (ne), }
  30. void agar_init_graph(struct agar_graph *gr,
  31. agar_first_edge_fn first_edge,
  32. agar_next_edge_fn next_edge,
  33. agar_edge_info_fn edge_info);
  34. int agar_error(struct agar_state *sr);
  35. const void *agar_first_edge(const struct agar_graph *g, const void *nr);
  36. const void *agar_next_edge(const struct agar_graph *g, const void *nr,
  37. const void *e);
  38. int agar_edge_info(const struct agar_graph *g, const void *nr, const void *e,
  39. struct agar_edge_info *eir);
  40. #define agar_for_each_edge(_e, _gr, _nr) \
  41. for ((_e) = agar_first_edge((_gr), (_nr)); (_e); \
  42. (_e) = aga_next_edge((_gr), (_nr), (_e)))
  43. #define agar_for_each_edge_info(_e, _eir, _err, _gr, _nr) \
  44. for ((_e) = agar_first_edge((_gr), (_nr)); \
  45. (_e) && ((((_err) = agar_edge_info((_gr), (_nr), (_e), &(_eir)))) == 0); \
  46. (_e) = agar_next_edge((_gr), (_nr), (_e))) \
  47. if ((_eir).to)
  48. /*
  49. * Depth first search
  50. */
  51. struct agar_state *agar_dfs_new(void *ctx, struct agar_graph *gr);
  52. bool agar_dfs_explore(struct agar_state *sr, const void *nr,
  53. const void **nextr);
  54. #define agar_dfs(_nr, _sr, _startr) \
  55. for ((_nr) = (_startr); agar_dfs_explore((_sr), (_nr), &(_nr)); )
  56. /*
  57. * Breadth first search
  58. */
  59. struct agar_state *agar_bfs_new(void *ctx, struct agar_graph *gr);
  60. bool agar_bfs_explore(struct agar_state *sr, const void *nr,
  61. const void **nextr);
  62. #define agar_bfs(_nr, _sr, _startr) \
  63. for ((_nr) = (_startr); agar_bfs_explore((_sr), (_nr), &(_nr)); )
  64. /*
  65. * Dijkstra's algorithm
  66. */
  67. struct agar_state *agar_dijkstra_new(void *ctx, struct agar_graph *gr,
  68. const void *nr);
  69. bool agar_dijkstra_step(struct agar_state *sr, const void **nextr);
  70. bool agar_dijkstra_path(struct agar_state *sr, const void *destr,
  71. aga_icost_t *total_cost,
  72. const void **prevr, const void **prevedge);
  73. void agar_dijkstra_all_paths(struct agar_state *sr);
  74. #endif /* CCAN_AGAR_H */