X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ccan%2Fagar%2Fagar.c;h=0baab325b58e678ba108e3fa2a09257ca92b6d86;hb=696c9b68f6334835f13037a83dd5a11c1c8129c7;hp=0ee34e9ab94c63cd7c765870c43dd85531a44115;hpb=fd96a212810bff1574b047c9079e3e050feb8a28;p=ccan diff --git a/ccan/agar/agar.c b/ccan/agar/agar.c index 0ee34e9a..0baab325 100644 --- a/ccan/agar/agar.c +++ b/ccan/agar/agar.c @@ -59,7 +59,7 @@ static struct aga_node *nr_to_n(struct agar_state *sr, const void *nr) assert(rc); } - return nn ? &nn->n : NULL; + return &nn->n; } static const void *n_to_nr(struct agar_state *sr, const struct aga_node *n) @@ -291,3 +291,48 @@ void agar_dijkstra_complete(struct agar_state *sr) aga_dijkstra_complete(&sr->g); } + +/* + * Bellman-Ford algorithm + */ + +struct agar_state *agar_bellman_ford_new(void *ctx, struct agar_graph *gr, + const void *nr) +{ + struct agar_state *sr = agar_new(ctx, gr); + + if (aga_bellman_ford_start(&sr->g, nr_to_n(sr, nr)) < 0) { + tal_free(sr); + return NULL; + } + + return sr; +} + +bool agar_bellman_ford_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_bellman_ford_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_bellman_ford_complete(struct agar_state *sr) +{ + aga_bellman_ford_complete(&sr->g); +}