X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/58b46d711c48cf9fd84097b9ee3ebfeb181ba4bc..f8ccf96fc8f0185acb6d66f56245b92cd57bc865:/src/xbt/graph.c diff --git a/src/xbt/graph.c b/src/xbt/graph.c index 025c5a56e7..1237288d7c 100644 --- a/src/xbt/graph.c +++ b/src/xbt/graph.c @@ -20,7 +20,7 @@ -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(graph, xbt, "Graph"); +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_graph, xbt, "Graph"); @@ -119,14 +119,17 @@ void xbt_graph_edge_set_data(xbt_edge_t edge, void *data) } /** @brief Destructor - * @param l: poor victim + * @param g: poor victim + * @param node_free_function: function to use to free data associated to each node + * @param edge_free_function: function to use to free data associated to each edge + * @param graph_free_function: function to use to free data associated to g * * Free the graph structure. */ void xbt_graph_free_graph(xbt_graph_t g, - void node_free_function(void *ptr), - void edge_free_function(void *ptr), - void graph_free_function(void *ptr)) + void_f_pvoid_t node_free_function, + void_f_pvoid_t edge_free_function, + void_f_pvoid_t graph_free_function) { int cursor = 0; xbt_node_t node = NULL; @@ -137,12 +140,12 @@ void xbt_graph_free_graph(xbt_graph_t g, xbt_dynar_free(&(node->out)); xbt_dynar_free(&(node->in)); if (node_free_function) - node_free_function(node->data); + (*node_free_function)(node->data); } xbt_dynar_foreach(g->edges, cursor, edge) { if (edge_free_function) - edge_free_function(edge->data); + (*edge_free_function)(edge->data); } xbt_dynar_foreach(g->nodes, cursor, node) @@ -152,7 +155,8 @@ void xbt_graph_free_graph(xbt_graph_t g, xbt_dynar_foreach(g->edges, cursor, edge) free(edge); xbt_dynar_free(&(g->edges)); - + if(graph_free_function) + (*graph_free_function)(g->data); free(g); return; @@ -161,8 +165,8 @@ void xbt_graph_free_graph(xbt_graph_t g, /** @brief remove the given node from the given graph */ void xbt_graph_free_node(xbt_graph_t g, xbt_node_t n, - void_f_pvoid_t * node_free_function, - void_f_pvoid_t * edge_free_function) + void_f_pvoid_t node_free_function, + void_f_pvoid_t edge_free_function) { unsigned long nbr; int i; @@ -173,16 +177,16 @@ void xbt_graph_free_node(xbt_graph_t g, xbt_node_t n, nbr = xbt_dynar_length(g->edges); cursor = 0; for (i = 0; i < nbr; i++) { - xbt_dynar_cursor_get(g->edges, &cursor, &edge); + xbt_dynar_get_cpy(g->edges, cursor, &edge); if ((edge->dst == n) || (edge->src == n)) { xbt_graph_free_edge(g, edge, edge_free_function); } else - xbt_dynar_cursor_step(g->edges, &cursor); + cursor ++; } if ((node_free_function) && (n->data)) - node_free_function(n->data); + (*node_free_function)(n->data); cursor = 0; xbt_dynar_foreach(g->nodes, cursor, node) @@ -199,14 +203,14 @@ void xbt_graph_free_node(xbt_graph_t g, xbt_node_t n, /** @brief remove the given edge from the given graph */ void xbt_graph_free_edge(xbt_graph_t g, xbt_edge_t e, - void free_function(void *ptr)) + void_f_pvoid_t free_function) { int idx; int cursor = 0; xbt_edge_t edge = NULL; if ((free_function) && (e->data)) - free_function(e->data); + (*free_function)(e->data); xbt_dynar_foreach(g->edges, cursor, edge) { if (edge == e) { @@ -595,10 +599,10 @@ static void __parse_edge(void) /** @brief Import a graph from a file following the GraphXML format */ xbt_graph_t xbt_graph_read(const char *filename, - void *(node_label_and_data) (xbt_node_t, + void *(*node_label_and_data) (xbt_node_t, const char *, const char *), - void *(edge_label_and_data) (xbt_edge_t, + void *(*edge_label_and_data) (xbt_edge_t, const char *, const char *)) {