From: dimitrov Date: Tue, 14 Mar 2006 16:51:28 +0000 (+0000) Subject: constructors and destructors for graph structures X-Git-Tag: v3.3~3417 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/b17648a31cb015991f7e035c222c2872a0eb0424?hp=2d8ec4ac68dc5d9c195625940a22a4842997fbb9 constructors and destructors for graph structures git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@1941 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- 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; + } + +} diff --git a/src/xbt/graph_private.h b/src/xbt/graph_private.h index 614cf3c935..991147503e 100644 --- a/src/xbt/graph_private.h +++ b/src/xbt/graph_private.h @@ -3,26 +3,27 @@ #include "xbt/dynar.h" /* Node structure */ -typedef struct xbt_node *xbt_node_t; -typedef struct xbt_node { +/* typedef struct xbt_node *xbt_node_t; */ +typedef struct xbt_node +{ xbt_dynar_t out; xbt_dynar_t in; - xbt_node_t *route; void *data; } s_xbt_node_t; /* edge structure */ -typedef struct xbt_edge *xbt_edge_t; -typedef struct xbt_edge { +/* typedef struct xbt_edge *xbt_edge_t; */ +typedef struct xbt_edge +{ xbt_node_t src; xbt_node_t dst; void *data; } s_xbt_edge_t; /* Graph structure */ -typedef struct xbt_graph *xbt_graph_t; -typedef struct xbt_graph { - char *name; +/* typedef struct xbt_graph *xbt_graph_t; */ +typedef struct xbt_graph +{ xbt_dynar_t nodes; xbt_dynar_t edges; unsigned short int directed;