From f9274cce2171d919d72fe9ec186320f85174b7e5 Mon Sep 17 00:00:00 2001 From: David Gibson Date: Fri, 6 Nov 2015 12:23:53 +1100 Subject: [PATCH] aga,agar: Add edge costs This allows the edge_info callback to supply a cost or length for an edge. For now we only support 'long' valued costs. If the callback doesn't supply a cost, it's considered cost 1. Signed-off-by: David Gibson --- ccan/aga/aga.c | 1 + ccan/aga/aga.h | 8 ++++++++ ccan/agar/agar.c | 4 ++++ ccan/agar/agar.h | 1 + 4 files changed, 14 insertions(+) diff --git a/ccan/aga/aga.c b/ccan/aga/aga.c index c721b144..a6e0539d 100644 --- a/ccan/aga/aga.c +++ b/ccan/aga/aga.c @@ -93,6 +93,7 @@ int aga_edge_info(const struct aga_graph *g, const struct aga_node *n, int rc; ei->to = NULL; + ei->icost = 1; rc = g->edge_info(g, n, e, ei); assert(rc <= 0); return rc; diff --git a/ccan/aga/aga.h b/ccan/aga/aga.h index 86751503..a8a888be 100644 --- a/ccan/aga/aga.h +++ b/ccan/aga/aga.h @@ -72,6 +72,10 @@ * reference to that node by the edge callback for *any* node and * index MUST use the same pointer. * + * - The ei->icost field MAY be set by the edge_info callback to + * indicate the edge's cost / length represented as an integer (of + * type aga_icost_t), Otherwise the cost defaults to 1. + * * Concurrency * =========== * @@ -127,9 +131,13 @@ typedef const void *(*aga_next_edge_fn)(const struct aga_graph *g, const struct aga_node *n, const void *e); +typedef long aga_icost_t; + struct aga_edge_info { struct aga_node *to; + aga_icost_t icost; /* integer edge cost */ }; + typedef int (*aga_edge_info_fn)(const struct aga_graph *g, const struct aga_node *n, const void *e, struct aga_edge_info *ei); diff --git a/ccan/agar/agar.c b/ccan/agar/agar.c index b2809abd..2be9dafe 100644 --- a/ccan/agar/agar.c +++ b/ccan/agar/agar.c @@ -79,6 +79,7 @@ static int convert_edge_info(const struct aga_graph *g, int rc; eir.to = NULL; + eir.icost = ei->icost; /* Inherit the default from aga */ rc = sr->gr->edge_info(sr->gr, nr, e, &eir); @@ -87,6 +88,8 @@ static int convert_edge_info(const struct aga_graph *g, else ei->to = NULL; + ei->icost = eir.icost; + return rc; } @@ -164,6 +167,7 @@ int agar_edge_info(const struct agar_graph *gr, const void *nr, const void *e, int rc; eir->to = NULL; + eir->icost = 1; rc = gr->edge_info(gr, nr, e, eir); assert(rc <= 0); return rc; diff --git a/ccan/agar/agar.h b/ccan/agar/agar.h index 495ef7c3..d63615ad 100644 --- a/ccan/agar/agar.h +++ b/ccan/agar/agar.h @@ -9,6 +9,7 @@ struct agar_edge_info { const void *to; + aga_icost_t icost; /* integer edge cost */ }; struct agar_graph; -- 2.39.2