Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add new convenient functions.
authoralegrand <alegrand@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Fri, 26 May 2006 15:40:39 +0000 (15:40 +0000)
committeralegrand <alegrand@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Fri, 26 May 2006 15:40:39 +0000 (15:40 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@2295 48e7efb5-ca39-0410-a469-dd3cf9ba447f

include/xbt/graph.h
src/xbt/graph.c

index dff9e8e..658402c 100644 (file)
@@ -18,9 +18,9 @@ SG_BEGIN_DECL()
    * @{
    */
 
    * @{
    */
 
-typedef struct xbt_node *xbt_node_t;
+typedef struct xbt_node  *xbt_node_t;
 typedef struct xbt_edge  *xbt_edge_t;
 typedef struct xbt_edge  *xbt_edge_t;
-typedef struct xbt_graph  *xbt_graph_t;
+typedef struct xbt_graph *xbt_graph_t;
 
 /* API */
 xbt_graph_t xbt_graph_new_graph(unsigned short int directed, void *data);
 
 /* API */
 xbt_graph_t xbt_graph_new_graph(unsigned short int directed, void *data);
@@ -30,6 +30,9 @@ xbt_edge_t xbt_graph_new_edge(xbt_graph_t g, xbt_node_t src, xbt_node_t dst,
 void *xbt_graph_node_get_data(xbt_node_t node);
 void  xbt_graph_node_set_data(xbt_node_t node, void *data);
 void *xbt_graph_edge_get_data(xbt_edge_t edge);
 void *xbt_graph_node_get_data(xbt_node_t node);
 void  xbt_graph_node_set_data(xbt_node_t node, void *data);
 void *xbt_graph_edge_get_data(xbt_edge_t edge);
+void  xbt_graph_edge_set_data(xbt_edge_t edge, void *data);
+
+xbt_edge_t xbt_graph_get_edge(xbt_graph_t g, xbt_node_t src, xbt_node_t dst);
 
 void xbt_graph_edge_set_length(xbt_edge_t e, double length);
 double xbt_graph_edge_get_length(xbt_edge_t e);
 
 void xbt_graph_edge_set_length(xbt_edge_t e, double length);
 double xbt_graph_edge_get_length(xbt_edge_t e);
index d26a8fb..184da8f 100644 (file)
@@ -45,7 +45,10 @@ xbt_node_t xbt_graph_new_node(xbt_graph_t g, void *data)
   xbt_node_t node = NULL;
   node = xbt_new0(struct xbt_node, 1);
   node->data = data;
   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;
   node->out = xbt_dynar_new(sizeof(xbt_edge_t), NULL);
   node->position_x = -1.0;
   node->position_y = -1.0;
@@ -61,7 +64,6 @@ xbt_edge_t xbt_graph_new_edge(xbt_graph_t g,
 {
   xbt_edge_t edge = NULL;
 
 {
   xbt_edge_t edge = NULL;
 
-
   edge = xbt_new0(struct xbt_edge, 1);
   xbt_dynar_push(src->out, &edge);
   if (g->directed)
   edge = xbt_new0(struct xbt_edge, 1);
   xbt_dynar_push(src->out, &edge);
   if (g->directed)
@@ -72,17 +74,30 @@ xbt_edge_t xbt_graph_new_edge(xbt_graph_t g,
   edge->data = data;
   edge->src = src;
   edge->dst = dst;
   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_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) {
+    INFO3("%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) {
+      INFO3("%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_get_data(xbt_node_t node)
 {
   return node->data;
@@ -93,12 +108,16 @@ void xbt_graph_node_set_data(xbt_node_t node, void *data)
   node->data = data;
 }
 
   node->data = data;
 }
 
-
 void *xbt_graph_edge_get_data(xbt_edge_t edge)
 {
   return edge->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
  *
 /** @brief Destructor
  *  @param l: poor victim
  *