[ccan] [PATCH 1/5] aga,agar: Add edge costs
David Gibson
david at gibson.dropbear.id.au
Thu Nov 12 22:42:44 AEDT 2015
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 <david at gibson.dropbear.id.au>
---
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 c721b14..a6e0539 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 8675150..a8a888b 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 b2809ab..2be9daf 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 495ef7c..d63615a 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.5.0
More information about the ccan
mailing list