X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fagar%2Fagar.c;fp=ccan%2Fagar%2Fagar.c;h=e930d7aa6c7eeabde50110474502b087b78f05ae;hb=1e742b68d026a258ccf99338f05daf8b694978a3;hp=2be9dafedfade6a8fbec23d640c76dd77d6fed46;hpb=f9274cce2171d919d72fe9ec186320f85174b7e5;p=ccan diff --git a/ccan/agar/agar.c b/ccan/agar/agar.c index 2be9dafe..e930d7aa 100644 --- a/ccan/agar/agar.c +++ b/ccan/agar/agar.c @@ -234,3 +234,60 @@ bool agar_bfs_explore(struct agar_state *sr, const void *nr, *nextr = n_to_nr(sr, next); return true; } + +/* + * Dijkstra's algorithm + */ + +struct agar_state *agar_dijkstra_new(void *ctx, struct agar_graph *gr, + const void *nr) +{ + struct agar_state *sr = agar_new(ctx, gr); + + if (aga_dijkstra_start(&sr->g, nr_to_n(sr, nr)) < 0) { + tal_free(sr); + return NULL; + } + + return sr; +} + +bool agar_dijkstra_step(struct agar_state *sr, const void **nextr) +{ + struct aga_node *next = aga_dijkstra_step(&sr->g); + + if (!next) + return false; + + *nextr = n_to_nr(sr, next); + return true; +} + +bool agar_dijkstra_path(struct agar_state *sr, const void *destr, + aga_icost_t *total_cost, + const void **prevr, const void **prevedge) +{ + struct aga_node *dest = nr_to_n(sr, destr); + struct aga_node *prev; + + if (!aga_dijkstra_path(&sr->g, dest, total_cost, &prev, prevedge)) + return false; + + /* + * When destr is the same as the source node, there obviously + * isn't a previous node or edge. In that case aga, sets them + * to NULL. But for agar, NULL could be a valid node + * references (particularly if using ptrint). So we don't + * have much choice here but to leave *prevr as undefined when + * destr is the source node. */ + if (prevr && prev) + *prevr = n_to_nr(sr, prev); + + return true; +} + +void agar_dijkstra_all_paths(struct agar_state *sr) +{ + aga_dijkstra_all_paths(&sr->g); +} +