Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
constructors and destructors for graph structures
authordimitrov <dimitrov@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Tue, 14 Mar 2006 16:51:28 +0000 (16:51 +0000)
committerdimitrov <dimitrov@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Tue, 14 Mar 2006 16:51:28 +0000 (16:51 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@1941 48e7efb5-ca39-0410-a469-dd3cf9ba447f

src/xbt/graph.c
src/xbt/graph_private.h

index 22a9126..f740315 100644 (file)
@@ -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;
+       }
+   
+}
index 614cf3c..9911475 100644 (file)
@@ -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;