X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ad5a61715d2113a2b341b6e867e65588dd4faf68..b17648a31cb015991f7e035c222c2872a0eb0424:/src/xbt/graph.c diff --git a/src/xbt/graph.c b/src/xbt/graph.c index 22a91260fc..f740315985 100644 --- a/src/xbt/graph.c +++ b/src/xbt/graph.c @@ -1 +1,143 @@ +#include "xbt/sysdep.h" +#include "xbt/log.h" +#include "xbt/graph.h" #include "graph_private.h" + +/* XBT_LOG_NEW_DEFAULT_SUBCATEGORY(graph,xbt,"GRAPH"); */ + +/** Constructor + * \return a new graph + */ +xbt_graph_t xbt_graph_new_graph(const char *name, unsigned short int directed, + void *data) +{ + xbt_graph_t graph=NULL; + graph=xbt_new0(struct xbt_graph,1); + graph->directed=directed; + graph->data=data; + graph->nodes= xbt_dynar_new(sizeof(xbt_node_t), free); + graph->edges= xbt_dynar_new(sizeof(xbt_edge_t), free); + + return graph; +} + +xbt_node_t xbt_graph_new_node(xbt_graph_t g,const char *name, void *data) +{ + xbt_node_t node=NULL; + node=xbt_new0(struct xbt_node,1); + node->data=data; + node->in=xbt_dynar_new(sizeof(xbt_node_t), free); + node->out=xbt_dynar_new(sizeof(xbt_node_t), free); + xbt_dynar_push(g->nodes,node); + + return node; +} + + +xbt_edge_t xbt_graph_new_edge(xbt_graph_t g,const char *name, + xbt_node_t src, xbt_node_t dst, void *data) +{ + xbt_edge_t edge=NULL; + + edge=xbt_new0(struct xbt_edge,1); + xbt_dynar_push(src->out,edge); + xbt_dynar_push(dst->in,edge); + 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; +} + + +/** 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)) +{ + int cursor; + xbt_node_t node=NULL; + xbt_edge_t edge=NULL; + + xbt_dynar_foreach(g->nodes,cursor,node) + xbt_graph_remove_node(g,node,node_free_function); + + /* if xbt_dynar_size(g->edges)>0 SCREAM! */ + + xbt_dynar_foreach(g->edges,cursor,edge) + xbt_graph_remove_edge(g,edge,edge_free_function); + + xbt_dynar_free(&(g->nodes)); + xbt_dynar_free(&(g->edges)); + +/* void xbt_dynar_free(g->edges); */ + + + return; +} + +void xbt_graph_remove_node(xbt_graph_t g, xbt_node_t n, void free_function(void * ptr)) +{ + int cursor; + xbt_node_t node=NULL; + + if ((free_function)&&(n->data)) + free_function(n->data); + xbt_dynar_free_container(&(n->in)); + xbt_dynar_free_container(&(n->out)); + xbt_dynar_foreach(g->nodes,cursor,node) + { + if (node==n) + xbt_dynar_cursor_rm(g->nodes,&cursor); + + } + return; + +} +void xbt_graph_remove_edge(xbt_graph_t g, xbt_edge_t e, void free_function(void * ptr)) +{ + int cursor=0; + xbt_edge_t edge=NULL; + xbt_node_t node=NULL; + xbt_node_t temp=NULL; + + if ((free_function)&&(e->data)) + free_function(e->data); + xbt_dynar_foreach(g->nodes,cursor,node) + { + if (node==e->src) + xbt_dynar_pop(node->out,temp); + if (g->directed) + xbt_dynar_pop(node->in,temp); + + } + node=NULL; + cursor=0; + xbt_dynar_foreach(g->nodes,cursor,node) + { + if (node==e->dst) + xbt_dynar_pop(node->in,temp); + if (g->directed) + xbt_dynar_pop(node->out,temp); + + } + cursor=0; + xbt_dynar_foreach(g->edges,cursor,edge) + if (edge==e) + { + xbt_dynar_cursor_rm(g->edges,&cursor); + break; + } + +}