-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(graph, xbt, "Graph");
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_graph, xbt, "Graph");
}
/** @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;
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)
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;
/** @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;
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)
/** @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) {
/** @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 *))
{