From 159ec4477f94c16e7da9894ff1cf87925f532b70 Mon Sep 17 00:00:00 2001 From: alegrand Date: Fri, 26 May 2006 15:40:39 +0000 Subject: [PATCH] Add new convenient functions. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@2295 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- include/xbt/graph.h | 7 +++++-- src/xbt/graph.c | 35 +++++++++++++++++++++++++++-------- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/include/xbt/graph.h b/include/xbt/graph.h index dff9e8e9a9..658402c9df 100644 --- a/include/xbt/graph.h +++ b/include/xbt/graph.h @@ -18,9 +18,9 @@ SG_BEGIN_DECL() * @{ */ -typedef struct xbt_node *xbt_node_t; +typedef struct xbt_node *xbt_node_t; typedef struct xbt_edge *xbt_edge_t; -typedef struct xbt_graph *xbt_graph_t; +typedef struct xbt_graph *xbt_graph_t; /* API */ xbt_graph_t xbt_graph_new_graph(unsigned short int directed, void *data); @@ -30,6 +30,9 @@ xbt_edge_t xbt_graph_new_edge(xbt_graph_t g, xbt_node_t src, xbt_node_t dst, void *xbt_graph_node_get_data(xbt_node_t node); void xbt_graph_node_set_data(xbt_node_t node, void *data); void *xbt_graph_edge_get_data(xbt_edge_t edge); +void xbt_graph_edge_set_data(xbt_edge_t edge, void *data); + +xbt_edge_t xbt_graph_get_edge(xbt_graph_t g, xbt_node_t src, xbt_node_t dst); void xbt_graph_edge_set_length(xbt_edge_t e, double length); double xbt_graph_edge_get_length(xbt_edge_t e); diff --git a/src/xbt/graph.c b/src/xbt/graph.c index d26a8fb1fc..184da8f8f9 100644 --- a/src/xbt/graph.c +++ b/src/xbt/graph.c @@ -45,7 +45,10 @@ xbt_node_t xbt_graph_new_node(xbt_graph_t g, void *data) xbt_node_t node = NULL; node = xbt_new0(struct xbt_node, 1); node->data = data; - node->in = xbt_dynar_new(sizeof(xbt_edge_t), NULL); + if (g->directed) + /* only the "out" field is used */ + node->in = xbt_dynar_new(sizeof(xbt_edge_t), NULL); + node->out = xbt_dynar_new(sizeof(xbt_edge_t), NULL); node->position_x = -1.0; node->position_y = -1.0; @@ -61,7 +64,6 @@ xbt_edge_t xbt_graph_new_edge(xbt_graph_t g, { xbt_edge_t edge = NULL; - edge = xbt_new0(struct xbt_edge, 1); xbt_dynar_push(src->out, &edge); if (g->directed) @@ -72,17 +74,30 @@ xbt_edge_t xbt_graph_new_edge(xbt_graph_t g, edge->data = data; edge->src = src; edge->dst = dst; - if (!g->directed) { - xbt_dynar_push(src->in, &edge); - xbt_dynar_push(dst->out, &edge); - } - xbt_dynar_push(g->edges, &edge); return edge; } +xbt_edge_t xbt_graph_get_edge(xbt_graph_t g, xbt_node_t src, xbt_node_t dst) +{ + xbt_edge_t edge; + int cursor; + + xbt_dynar_foreach(src->out, cursor, edge) { + INFO3("%p = %p--%p",edge,edge->src,edge->dst); + if((edge->src==src) && (edge->dst==dst)) return edge; + } + if(!g->directed) { + xbt_dynar_foreach(src->out, cursor, edge) { + INFO3("%p = %p--%p",edge,edge->src,edge->dst); + if((edge->dst==src) && (edge->src==dst)) return edge; + } + } + return NULL; +} + void *xbt_graph_node_get_data(xbt_node_t node) { return node->data; @@ -93,12 +108,16 @@ void xbt_graph_node_set_data(xbt_node_t node, void *data) node->data = data; } - void *xbt_graph_edge_get_data(xbt_edge_t edge) { return edge->data; } +void xbt_graph_edge_set_data(xbt_edge_t edge, void *data) +{ + edge->data = data; +} + /** @brief Destructor * @param l: poor victim * -- 2.20.1