00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "eg_dgraph.h"
00021
00022
00023 int EGdGraphResetNodeId (EGdGraph_t * G)
00024 {
00025
00026 EGlistNode_t *cur_node;
00027 unsigned int cur_id = 0;
00028
00029
00030 G->node_id_max = G->nodes->size;
00031
00032
00033 for (cur_node = G->nodes->begin; cur_node; cur_node = cur_node->next)
00034 {
00035 ((EGdGraphNode_t *) cur_node->this)->id = cur_id++;
00036 }
00037 return 0;
00038 }
00039
00040
00041 int EGdGraphResetEdgeId (EGdGraph_t * G)
00042 {
00043
00044 EGlistNode_t *cur_node,
00045 *cur_edge;
00046 unsigned int cur_id = 0;
00047
00048
00049 G->edge_id_max = G->nedges;
00050
00051
00052 for (cur_node = G->nodes->begin; cur_node; cur_node = cur_node->next)
00053 {
00054 for (cur_edge = ((EGdGraphNode_t *) cur_node->this)->out_edges->begin;
00055 cur_edge; cur_edge = cur_edge->next)
00056 {
00057 ((EGdGraphEdge_t *) cur_edge->this)->id = cur_id++;
00058 }
00059 }
00060 return 0;
00061 }
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 int EGdGraphAttachNode (EGdGraph_t * G,
00072 EGdGraphNode_t * n)
00073 {
00074
00075 EGlistNode_t *e_it;
00076 EGdGraphEdge_t *e;
00077
00078 EGlistAttach (G->nodes, n->cn);
00079
00080
00081 for (e_it = n->in_edges->begin; e_it; e_it = e_it->next)
00082 {
00083 e = (EGdGraphEdge_t *) (e_it->this);
00084
00085
00086 if (e->tail != n)
00087 {
00088 EGlistAttach (e->tail->out_edges, e->tail_cn);
00089 G->nedges++;
00090 }
00091
00092 else
00093 G->nedges++;
00094 }
00095
00096 for (e_it = n->out_edges->begin; e_it; e_it = e_it->next)
00097 {
00098 e = (EGdGraphEdge_t *) (e_it->this);
00099
00100
00101 if (e->head != n)
00102 {
00103 EGlistAttach (e->head->in_edges, e->head_cn);
00104 G->nedges++;
00105 }
00106 }
00107
00108 return 0;
00109
00110 }
00111
00112
00113
00114
00115
00116
00117 int EGdGraphAttachEdge (EGdGraph_t * G,
00118 EGdGraphEdge_t * e)
00119 {
00120
00121 int rval;
00122
00123 G->nedges += 1;
00124
00125 rval = EGlistAttach (e->head->in_edges, e->head_cn);
00126 CHECKRVAL (rval);
00127 rval = EGlistAttach (e->tail->out_edges, e->tail_cn);
00128 CHECKRVAL (rval);
00129
00130 return 0;
00131
00132 }
00133
00134
00135
00136
00137
00138
00139
00140 int EGdGraphUnattachNode (EGdGraph_t * G,
00141 EGdGraphNode_t * n)
00142 {
00143
00144 int rval;
00145
00146 EGdGraphEdge_t *e;
00147 EGlistNode_t *e_it;
00148
00149 rval = EGlistUnattach (G->nodes, n->cn);
00150
00151 for (e_it = n->out_edges->begin; e_it; e_it = e_it->next)
00152 {
00153 e = (EGdGraphEdge_t *) (e_it->this);
00154 if (e->head != n)
00155 {
00156 EGlistUnattach (e->head->in_edges, e->head_cn);
00157 G->nedges -= 1;
00158 }
00159 else
00160 G->nedges -= 1;
00161 }
00162
00163 for (e_it = n->in_edges->begin; e_it; e_it = e_it->next)
00164 {
00165 e = (EGdGraphEdge_t *) (e_it->this);
00166 if (e->tail != n)
00167 {
00168 EGlistUnattach (e->tail->out_edges, e->tail_cn);
00169 G->nedges -= 1;
00170 }
00171 }
00172
00173 return 0;
00174
00175 }
00176
00177
00178
00179
00180
00181
00182 int EGdGraphUnattachEdge (EGdGraph_t * G,
00183 EGdGraphEdge_t * e)
00184 {
00185
00186 EGlistUnattach (e->head->in_edges, e->head_cn);
00187 EGlistUnattach (e->tail->out_edges, e->tail_cn);
00188
00189 G->nedges -= 1;
00190
00191 return 0;
00192
00193 }
00194
00195
00196
00197
00198
00199
00200 EGdGraph_t *EGnewDGraph (EGmemPool_t * mem)
00201 {
00202
00203 EGdGraph_t *G;
00204
00205 G = (EGdGraph_t *) EGmemPoolMalloc (mem, sizeof (EGdGraph_t));
00206 memset (G, 0, sizeof (EGdGraph_t));
00207
00208 G->nodes = EGnewList (mem);
00209 G->mem = mem;
00210 G->node_id_max = 0;
00211 G->edge_id_max = 0;
00212 G->id = UINT_MAX;
00213
00214 return G;
00215
00216 }
00217
00218
00219
00220
00221
00222
00223 EGdGraphNode_t *EGnewDGraphNode (EGmemPool_t * mem)
00224 {
00225
00226 EGdGraphNode_t *n;
00227 n = (EGdGraphNode_t *) EGmemPoolMalloc (mem, sizeof (EGdGraphNode_t));
00228
00229 n->cn = 0;
00230 n->data = 0;
00231 n->in_edges = EGnewList (mem);
00232 n->out_edges = EGnewList (mem);
00233 n->id = UINT_MAX;
00234
00235 return (n);
00236
00237 }
00238
00239
00240
00241
00242
00243
00244 EGdGraphEdge_t *EGnewDGraphEdge (EGmemPool_t * mem)
00245 {
00246
00247 EGdGraphEdge_t *e;
00248
00249 e = (EGdGraphEdge_t *) EGmemPoolMalloc (mem, sizeof (EGdGraphEdge_t));
00250 memset (e, 0, sizeof (EGdGraphEdge_t));
00251
00252 e->id = UINT_MAX;
00253
00254 return (e);
00255
00256 }
00257
00258 void EGfreeDGraphEdge (void *v,
00259 EGmemPool_t * mem)
00260 {
00261 EGmemPoolFree (v, sizeof (EGdGraphEdge_t), mem);
00262 return;
00263 }
00264
00265 void EGfreeDGraphNode (void *v)
00266 {
00267 EGmemPool_t *mem;
00268 EGdGraphNode_t *n;
00269
00270 n = (EGdGraphNode_t *) (v);
00271 mem = n->in_edges->mempool;
00272
00273 EGlistClearMP (n->out_edges, EGfreeDGraphEdge, mem);
00274 EGlistClearMP (n->in_edges, EGfreeDGraphEdge, mem);
00275
00276 EGfreeList (n->in_edges);
00277 EGfreeList (n->out_edges);
00278
00279 EGmemPoolFree (v, sizeof (EGdGraphNode_t), mem);
00280
00281 return;
00282 }
00283
00284 void EGfreeDGraph (void *v)
00285 {
00286 EGmemPool_t *mem;
00287 EGdGraph_t *G;
00288
00289 G = (EGdGraph_t *) (v);
00290 mem = G->mem;
00291
00292 EGlistClear (G->nodes, EGfreeDGraphNode);
00293 EGfreeList (G->nodes);
00294
00295 EGmemPoolFree (v, sizeof (EGdGraph_t), mem);
00296
00297 return;
00298 }
00299
00300 void EGdGraphClear (EGdGraph_t * G,
00301 EGfree_f userFreeEdgeData,
00302 EGfree_f userFreeNodeData,
00303 EGfree_f userFreeGraphData)
00304 {
00305 EGlistNode_t *n_it;
00306 EGdGraphNode_t *n;
00307
00308 if (userFreeGraphData && G->data)
00309 userFreeGraphData (G->data);
00310
00311 G->data = 0;
00312
00313 while ((n_it = G->nodes->begin) != 0)
00314 {
00315 n = (EGdGraphNode_t *) (n_it->this);
00316 EGdGraphEraseNode (G, n, userFreeEdgeData, userFreeNodeData);
00317 }
00318
00319 G->node_id_max = 0;
00320 G->edge_id_max = 0;
00321
00322 return;
00323
00324 }
00325
00326 void EGdGraphClearMP (EGdGraph_t * G,
00327 EGfreeMP_f userFreeEdgeDataMP,
00328 EGfreeMP_f userFreeNodeDataMP,
00329 EGfreeMP_f userFreeGraphDataMP,
00330 EGmemPool_t * edge_data_mem,
00331 EGmemPool_t * node_data_mem,
00332 EGmemPool_t * graph_data_mem)
00333 {
00334
00335 EGlistNode_t *n_it;
00336 EGdGraphNode_t *n;
00337
00338 if (userFreeGraphDataMP && G->data)
00339 userFreeGraphDataMP (G->data, graph_data_mem);
00340
00341 G->data = 0;
00342
00343 while ((n_it = G->nodes->begin) != 0)
00344 {
00345 n = (EGdGraphNode_t *) (n_it->this);
00346 EGdGraphEraseNodeMP (G, n, userFreeEdgeDataMP, userFreeNodeDataMP,
00347 node_data_mem, edge_data_mem);
00348 }
00349
00350 G->node_id_max = 0;
00351 G->edge_id_max = 0;
00352
00353 return;
00354
00355 }
00356
00357 void EGdGraphEraseEdge (EGdGraph_t * G,
00358 EGdGraphEdge_t * e,
00359 EGfree_f userFreeEdgeData,
00360 EGmemPool_t * mem)
00361 {
00362
00363 EGlist_t *out_list,
00364 *in_list;
00365 EGlistNode_t *e_hc,
00366 *e_tc;
00367
00368 e_tc = e->tail_cn;
00369 e_hc = e->head_cn;
00370
00371 if (userFreeEdgeData && e->data)
00372 userFreeEdgeData ((void *) (e->data));
00373
00374 out_list = e->tail->out_edges;
00375 in_list = e->head->in_edges;
00376
00377 EGlistEraseMP (out_list, e_tc, EGfreeDGraphEdge, mem);
00378 EGlistErase (in_list, e_hc, nullFree);
00379
00380 G->nedges--;
00381
00382 return;
00383
00384 }
00385
00386 void EGdGraphEraseEdgeMP (EGdGraph_t * G,
00387 EGdGraphEdge_t * e,
00388 EGfreeMP_f userFreeEdgeDataMP,
00389 EGmemPool_t * edge_data_mem,
00390 EGmemPool_t * mem)
00391 {
00392
00393 EGlist_t *in_list,
00394 *out_list;
00395 EGlistNode_t *e_hc,
00396 *e_tc;
00397
00398 e_tc = e->tail_cn;
00399 e_hc = e->head_cn;
00400
00401 if (userFreeEdgeDataMP && e->data)
00402 userFreeEdgeDataMP ((void *) (e->data), edge_data_mem);
00403
00404 out_list = e->tail->out_edges;
00405 in_list = e->head->in_edges;
00406
00407 EGlistEraseMP (out_list, e_tc, EGfreeDGraphEdge, mem);
00408 EGlistErase (in_list, e_hc, nullFree);
00409
00410 G->nedges--;
00411
00412 return;
00413
00414 }
00415
00416 void EGdGraphEraseNode (EGdGraph_t * G,
00417 EGdGraphNode_t * n,
00418 EGfree_f userFreeEdgeData,
00419 EGfree_f userFreeNodeData)
00420 {
00421
00422 EGlistNode_t *n_it,
00423 *e_it;
00424 EGdGraphEdge_t *e;
00425
00426 n_it = n->cn;
00427
00428 if (userFreeNodeData && n->data)
00429 userFreeNodeData ((void *) (n->data));
00430
00431 while ((e_it = n->in_edges->begin) != 0)
00432 {
00433 e = (EGdGraphEdge_t *) (e_it->this);
00434 EGdGraphEraseEdge (G, e, userFreeEdgeData, n->in_edges->mempool);
00435 }
00436
00437 while ((e_it = n->out_edges->begin) != 0)
00438 {
00439 e = (EGdGraphEdge_t *) (e_it->this);
00440 EGdGraphEraseEdge (G, e, userFreeEdgeData, n->out_edges->mempool);
00441 }
00442
00443 EGlistErase (G->nodes, n_it, EGfreeDGraphNode);
00444
00445 return;
00446
00447 }
00448
00449 void EGdGraphEraseNodeMP (EGdGraph_t * G,
00450 EGdGraphNode_t * n,
00451 EGfreeMP_f userFreeEdgeDataMP,
00452 EGfreeMP_f userFreeNodeDataMP,
00453 EGmemPool_t * node_data_mem,
00454 EGmemPool_t * edge_data_mem)
00455 {
00456
00457 EGlistNode_t *n_it,
00458 *e_it;
00459 EGdGraphEdge_t *e;
00460
00461 n_it = n->cn;
00462
00463 if (userFreeNodeDataMP && n->data)
00464 userFreeNodeDataMP ((void *) (n->data), node_data_mem);
00465
00466 while ((e_it = n->in_edges->begin) != 0)
00467 {
00468 e = (EGdGraphEdge_t *) (e_it->this);
00469 EGdGraphEraseEdgeMP (G, e, userFreeEdgeDataMP, edge_data_mem,
00470 n->in_edges->mempool);
00471 }
00472
00473 while ((e_it = n->out_edges->begin) != 0)
00474 {
00475 e = (EGdGraphEdge_t *) (e_it->this);
00476 EGdGraphEraseEdgeMP (G, e, userFreeEdgeDataMP, edge_data_mem,
00477 n->out_edges->mempool);
00478 }
00479
00480 EGlistErase (G->nodes, n_it, EGfreeDGraphNode);
00481
00482 return;
00483
00484 }
00485
00486 EGdGraphNode_t *EGdGraphAddNode (EGdGraph_t * G,
00487 void *data)
00488 {
00489 EGdGraphNode_t *n;
00490
00491 n = EGnewDGraphNode (G->mem);
00492 n->data = data;
00493 n->id = G->node_id_max++;
00494
00495 EGlistPushBack (G->nodes, n);
00496 n->cn = G->nodes->end;
00497
00498 return n;
00499 }
00500
00501 EGdGraphEdge_t *EGdGraphAddEdge (EGdGraph_t * G,
00502 void *data,
00503 EGdGraphNode_t * head,
00504 EGdGraphNode_t * tail)
00505 {
00506 EGdGraphEdge_t *e;
00507
00508 e = EGnewDGraphEdge (G->mem);
00509
00510 e->data = data;
00511 e->head = head;
00512 e->tail = tail;
00513
00514 e->id = G->edge_id_max++;
00515
00516 EGlistPushBack (e->head->in_edges, e);
00517 e->head_cn = e->head->in_edges->end;
00518
00519 EGlistPushBack (e->tail->out_edges, e);
00520 e->tail_cn = e->tail->out_edges->end;
00521
00522 G->nedges += 1;
00523
00524 return e;
00525 }
00526
00527 int EGdGraphDisplay (EGdGraph_t * G,
00528 EGdisplay_f userDisplayDGraphData,
00529 EGdisplay_f userDisplayNodeData,
00530 EGdisplay_f userDisplayEdgeData,
00531 FILE * file)
00532 {
00533
00534
00535 EGlistNode_t *It1,
00536 *It2;
00537 EGdGraphNode_t *v;
00538 EGdGraphEdge_t *e;
00539
00540
00541
00542 fprintf (file, "\nGraph :%p Graph_id :%u\n nnodes :%u nedges :%u "
00543 "max_edge_id :%u max_node_id :%u",
00544 (void *) G, G->id, G->nodes->size, G->nedges, G->edge_id_max,
00545 G->node_id_max);
00546 #if __EG_DGRAPH_CHECK__
00547 fprintf (file, " (%p){nodes=%p data=%p mem=%p id=%u nedges=%u node_id_max="
00548 "%u edge_id_max=%u} ", (void *) G, (void *) G->nodes,
00549 (void *) G->data, (void *) G->mem, G->id, G->nedges, G->node_id_max,
00550 G->edge_id_max);
00551 #endif
00552 if (userDisplayDGraphData)
00553 {
00554 fprintf (file, "[");
00555 userDisplayDGraphData (G->data, file);
00556 fprintf (file, "]\n");
00557 }
00558 else
00559 fprintf (file, "\n");
00560
00561 for (It1 = G->nodes->begin; It1; It1 = It1->next)
00562 {
00563 v = (EGdGraphNode_t *) It1->this;
00564 fprintf (file, "Node %u: ", v->id);
00565 #if __EG_DGRAPH_CHECK__
00566 fprintf (file, "(%p){out_edges=%p in_edges=%p cn=%p data=%p id=%u} ",
00567 (void *) v, (void *) v->out_edges, (void *) v->in_edges,
00568 (void *) v->cn, (void *) v->data, v->id);
00569 #endif
00570 if (userDisplayNodeData)
00571 {
00572 fprintf (file, "[");
00573 userDisplayNodeData (v->data, file);
00574 fprintf (file, "]\n");
00575 }
00576 else
00577 fprintf (file, "\n");
00578 for (It2 = v->out_edges->begin; It2; It2 = It2->next)
00579 {
00580 e = (EGdGraphEdge_t *) It2->this;
00581 fprintf (file, "%u: (%u,%u) ", e->id, e->tail->id, e->head->id);
00582 #if __EG_DGRAPH_CHECK__
00583 fprintf (file, "(%p){head=%p tail=%p head_cn=%p tail_cn=%p data=%p "
00584 "id=%u}\n", (void *) e, (void *) e->head, (void *) e->tail,
00585 (void *) e->head_cn, (void *) e->tail_cn, (void *) e->data,
00586 e->id);
00587 #endif
00588 if (userDisplayEdgeData)
00589 {
00590 fprintf (file, "[");
00591 userDisplayEdgeData (e->data, file);
00592 fprintf (file, "] ");
00593 }
00594 }
00595 fprintf (file, "\n");
00596 for (It2 = v->in_edges->begin; It2; It2 = It2->next)
00597 {
00598 e = (EGdGraphEdge_t *) It2->this;
00599 fprintf (file, "%u: (%u,%u) ", e->id, e->tail->id, e->head->id);
00600 #if __EG_DGRAPH_CHECK__
00601 fprintf (file, "(%p){head=%p tail=%p head_cn=%p tail_cn=%p data=%p "
00602 "id=%u}\n", (void *) e, (void *) e->head, (void *) e->tail,
00603 (void *) e->head_cn, (void *) e->tail_cn, (void *) e->data,
00604 e->id);
00605 #endif
00606 if (userDisplayEdgeData)
00607 {
00608 fprintf (file, "[");
00609 userDisplayEdgeData (e->data, file);
00610 fprintf (file, "] ");
00611 }
00612 }
00613 fprintf (file, "\n");
00614 }
00615
00616
00617 return 0;
00618 }