1 /* Licensed under LGPLv2+ - see LICENSE file for details */
8 #include <ccan/aga/aga.h>
10 struct agar_edge_info {
12 aga_icost_t icost; /* integer edge cost */
18 typedef int (*agar_edge_info_fn)(const struct agar_graph *gr,
21 struct agar_edge_info *ei);
22 typedef const void *(*agar_first_edge_fn)(const struct agar_graph *gr,
24 typedef const void *(*agar_next_edge_fn)(const struct agar_graph *gr,
29 agar_edge_info_fn edge_info;
30 agar_first_edge_fn first_edge;
31 agar_next_edge_fn next_edge;
34 void agar_init_graph(struct agar_graph *gr,
35 agar_first_edge_fn first_edge,
36 agar_next_edge_fn next_edge,
37 agar_edge_info_fn edge_info);
38 int agar_error(struct agar_state *sr);
40 const void *agar_first_edge(const struct agar_graph *g, const void *nr);
41 const void *agar_next_edge(const struct agar_graph *g, const void *nr,
43 int agar_edge_info(const struct agar_graph *g, const void *nr, const void *e,
44 struct agar_edge_info *eir);
46 #define agar_for_each_edge(_e, _gr, _nr) \
47 for ((_e) = agar_first_edge((_gr), (_nr)); (_e); \
48 (_e) = aga_next_edge((_gr), (_nr), (_e)))
50 #define agar_for_each_edge_info(_e, _eir, _err, _gr, _nr) \
51 for ((_e) = agar_first_edge((_gr), (_nr)); \
52 (_e) && ((((_err) = agar_edge_info((_gr), (_nr), (_e), &(_eir)))) == 0); \
53 (_e) = agar_next_edge((_gr), (_nr), (_e))) \
59 struct agar_state *agar_dfs_new(void *ctx, struct agar_graph *gr);
60 bool agar_dfs_explore(struct agar_state *sr, const void *nr,
62 #define agar_dfs(_nr, _sr, _startr) \
63 for ((_nr) = (_startr); agar_dfs_explore((_sr), (_nr), &(_nr)); )
66 * Breadth first search
68 struct agar_state *agar_bfs_new(void *ctx, struct agar_graph *gr);
69 bool agar_bfs_explore(struct agar_state *sr, const void *nr,
71 #define agar_bfs(_nr, _sr, _startr) \
72 for ((_nr) = (_startr); agar_bfs_explore((_sr), (_nr), &(_nr)); )
74 #endif /* CCAN_AGAR_H */