-XBT_LOG_NEW_DEFAULT_SUBCATEGORY(graph, xbt, "Graph");
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_graph, xbt, "Graph");
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;
{
xbt_edge_t edge = NULL;
-
edge = xbt_new0(struct xbt_edge, 1);
xbt_dynar_push(src->out, &edge);
if (g->directed)
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) {
+ DEBUG3("%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) {
+ DEBUG3("%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;
}
+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
*
* 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)
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))
/** @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) {