00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #include <algorithm>
00041 #include <list>
00042
00043 #include <qgarlib/GenEdge.H>
00044 #include <qgarlib/GenNode.H>
00045
00046
00047
00048 namespace qgar
00049 {
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 template <class TNODE, class TEDGE>
00060 GenUGraph<TNODE,TEDGE>::GenUGraph()
00061 {
00062
00063 }
00064
00065
00066
00067
00068 template <class TNODE, class TEDGE>
00069 GenUGraph<TNODE,TEDGE>::GenUGraph(GenNode<TNODE,TEDGE>* const aPNode)
00070 {
00071 _nodes.push_back(aPNode);
00072 }
00073
00074
00075
00076
00077 template <class TNODE, class TEDGE>
00078 GenUGraph<TNODE,TEDGE>::GenUGraph(GenEdge<TNODE,TEDGE>* const aPEdge)
00079 {
00080 _edges.push_back(aPEdge);
00081 }
00082
00083
00084
00085
00086
00087
00088
00089 template <class TNODE, class TEDGE>
00090 GenUGraph<TNODE,TEDGE>::~GenUGraph()
00091 {
00092
00093 for (typename std::list< GenNode<TNODE,TEDGE>* >::iterator itN = _nodes.begin();
00094 itN != _nodes.end();
00095 ++itN)
00096 {
00097 delete *itN;
00098 }
00099
00100
00101 for (typename std::list< GenEdge<TNODE,TEDGE>* >::iterator itE = _edges.begin();
00102 itE != _edges.end();
00103 ++itE)
00104 {
00105 delete *itE;
00106 }
00107 }
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117 template <class TNODE, class TEDGE>
00118 bool
00119 GenUGraph<TNODE,TEDGE>::empty() const
00120 {
00121 return _nodes.empty() && _edges.empty();
00122 }
00123
00124
00125
00126
00127 template <class TNODE, class TEDGE>
00128 int
00129 GenUGraph<TNODE,TEDGE>::sizeNodes() const
00130 {
00131 return (int) _nodes.size();
00132 }
00133
00134
00135
00136
00137 template <class TNODE, class TEDGE>
00138 int
00139 GenUGraph<TNODE,TEDGE>::sizeEdges() const
00140 {
00141 return (int) _edges.size();
00142 }
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153 template <class TNODE, class TEDGE>
00154 inline GenNode<TNODE,TEDGE>*
00155 GenUGraph<TNODE,TEDGE>::pEntryNode() const
00156 {
00157 if (_nodes.empty())
00158 {
00159 return 0;
00160 }
00161 else
00162 {
00163 return _nodes.front();
00164 }
00165 }
00166
00167
00168
00169
00170 template <class TNODE, class TEDGE>
00171 inline std::list< GenNode<TNODE,TEDGE>* >&
00172 GenUGraph<TNODE,TEDGE>::getNodes()
00173 {
00174 return _nodes;
00175 }
00176
00177
00178
00179
00180 template <class TNODE, class TEDGE>
00181 inline const std::list< GenNode<TNODE,TEDGE>* >&
00182 GenUGraph<TNODE,TEDGE>::accessNodes() const
00183 {
00184 return _nodes;
00185 }
00186
00187
00188
00189 template <class TNODE, class TEDGE>
00190 inline std::list< GenNode<TNODE,TEDGE>* >
00191 GenUGraph<TNODE,TEDGE>::nodes() const
00192 {
00193 return _nodes;
00194 }
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205 template <class TNODE, class TEDGE>
00206 inline GenEdge<TNODE,TEDGE>*
00207 GenUGraph<TNODE,TEDGE>::pEntryEdge() const
00208 {
00209 if (_edges.empty())
00210 {
00211 return 0;
00212 }
00213 else
00214 {
00215 return _edges.front();
00216 }
00217 }
00218
00219
00220
00221
00222 template <class TNODE, class TEDGE>
00223 inline std::list< GenEdge<TNODE,TEDGE>* >&
00224 GenUGraph<TNODE,TEDGE>::getEdges()
00225 {
00226 return _edges;
00227 }
00228
00229
00230
00231
00232 template <class TNODE, class TEDGE>
00233 inline const std::list< GenEdge<TNODE,TEDGE>* >&
00234 GenUGraph<TNODE,TEDGE>::accessEdges() const
00235 {
00236 return _edges;
00237 }
00238
00239
00240
00241 template <class TNODE, class TEDGE>
00242 inline std::list< GenEdge<TNODE,TEDGE>* >
00243 GenUGraph<TNODE,TEDGE>::edges() const
00244 {
00245 return _edges;
00246 }
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256 template <class TNODE, class TEDGE>
00257 inline GenNode<TNODE,TEDGE>*
00258 GenUGraph<TNODE,TEDGE>::addNode(const TNODE& aData, short int aFlag)
00259 {
00260 return addNode(new GenNode<TNODE,TEDGE>(aData, aFlag));
00261 }
00262
00263
00264
00265
00266 template <class TNODE, class TEDGE>
00267 inline GenNode<TNODE,TEDGE>*
00268 GenUGraph<TNODE,TEDGE>::addNode(GenEdge<TNODE,TEDGE>* const aPEdge,
00269 const TNODE& aData,
00270 short int aFlag)
00271 {
00272 return addNode(new GenNode<TNODE,TEDGE>(aData, aFlag), aPEdge);
00273 }
00274
00275
00276
00277
00278 template <class TNODE, class TEDGE>
00279 inline GenNode<TNODE,TEDGE>*
00280 GenUGraph<TNODE,TEDGE>::addNode(GenEdge<TNODE,TEDGE>* const aPEdge1,
00281 GenEdge<TNODE,TEDGE>* const aPEdge2,
00282 const TNODE& aData,
00283 short int aFlag)
00284 {
00285 return addNode(new GenNode<TNODE,TEDGE>(aData, aFlag), aPEdge1, aPEdge2);
00286 }
00287
00288
00289
00290
00291 template <class TNODE, class TEDGE>
00292 inline GenNode<TNODE,TEDGE>*
00293 GenUGraph<TNODE,TEDGE>::addNodeAtSource(GenEdge<TNODE,TEDGE>* const aPEdge,
00294 const TNODE& aData,
00295 short int aFlag)
00296 {
00297 return addNodeAtSource(new GenNode<TNODE,TEDGE>(aData, aFlag), aPEdge);
00298 }
00299
00300
00301
00302
00303 template <class TNODE, class TEDGE>
00304 inline GenNode<TNODE,TEDGE>*
00305 GenUGraph<TNODE,TEDGE>::addNodeAtTarget(GenEdge<TNODE,TEDGE>* const aPEdge,
00306 const TNODE& aData,
00307 short int aFlag)
00308 {
00309 return addNodeAtTarget(new GenNode<TNODE,TEDGE>(aData, aFlag), aPEdge);
00310 }
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320 template <class TNODE, class TEDGE>
00321 inline GenNode<TNODE,TEDGE>*
00322 GenUGraph<TNODE,TEDGE>::addNode(GenNode<TNODE,TEDGE>* const aPNode)
00323 {
00324
00325 _nodes.push_back(aPNode);
00326
00327 return aPNode;
00328 }
00329
00330
00331
00332 template <class TNODE, class TEDGE>
00333 GenNode<TNODE,TEDGE>*
00334 GenUGraph<TNODE,TEDGE>::addNode(GenNode<TNODE,TEDGE>* const aPNode,
00335 GenEdge<TNODE,TEDGE>* const aPEdge)
00336 {
00337
00338 aPNode->addEdge(aPEdge);
00339
00340
00341
00342 aPEdge->setPNode(aPNode);
00343
00344
00345 return addNode(aPNode);
00346 }
00347
00348
00349
00350
00351 template <class TNODE, class TEDGE>
00352 GenNode<TNODE,TEDGE>*
00353 GenUGraph<TNODE,TEDGE>::addNode(GenNode<TNODE,TEDGE>* const aPNode,
00354 GenEdge<TNODE,TEDGE>* const aPEdge1,
00355 GenEdge<TNODE,TEDGE>* const aPEdge2)
00356 {
00357
00358 aPNode->addEdge(aPEdge1);
00359 aPNode->addEdge(aPEdge2);
00360
00361
00362
00363 aPEdge1->setPNode(aPNode);
00364 aPEdge2->setPNode(aPNode);
00365
00366
00367 return addNode(aPNode);
00368 }
00369
00370
00371
00372
00373 template <class TNODE, class TEDGE>
00374 GenNode<TNODE,TEDGE>*
00375 GenUGraph<TNODE,TEDGE>::addNodeAtSource(GenNode<TNODE,TEDGE>* const aPNode,
00376 GenEdge<TNODE,TEDGE>* const aPEdge)
00377 {
00378
00379
00380 aPNode->addEdge(aPEdge);
00381
00382
00383 aPEdge->setPSource(aPNode);
00384
00385
00386 return addNode(aPNode);
00387 }
00388
00389
00390
00391
00392 template <class TNODE, class TEDGE>
00393 GenNode<TNODE,TEDGE>*
00394 GenUGraph<TNODE,TEDGE>::addNodeAtTarget(GenNode<TNODE,TEDGE>* const aPNode,
00395 GenEdge<TNODE,TEDGE>* const aPEdge)
00396 {
00397
00398
00399 aPNode->addEdge(aPEdge);
00400
00401
00402 aPEdge->setPTarget(aPNode);
00403
00404
00405 return addNode(aPNode);
00406 }
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416 template <class TNODE, class TEDGE>
00417 inline GenEdge<TNODE,TEDGE>*
00418 GenUGraph<TNODE,TEDGE>::addEdge(const TEDGE& aData,
00419 short int aFlag)
00420 {
00421 return addEdge(new GenEdge<TNODE,TEDGE>(aData, aFlag));
00422 }
00423
00424
00425
00426
00427 template <class TNODE, class TEDGE>
00428 inline GenEdge<TNODE,TEDGE>*
00429 GenUGraph<TNODE,TEDGE>::addEdge(GenNode<TNODE,TEDGE>* const aPNode,
00430 const TEDGE& aData,
00431 short int aFlag)
00432 {
00433 return addEdge(new GenEdge<TNODE,TEDGE>(aData, aFlag), aPNode);
00434 }
00435
00436
00437
00438
00439 template <class TNODE, class TEDGE>
00440 inline GenEdge<TNODE,TEDGE>*
00441 GenUGraph<TNODE,TEDGE>::addEdge(GenNode<TNODE,TEDGE>* const aPSource,
00442 GenNode<TNODE,TEDGE>* const aPTarget,
00443 const TEDGE& aData,
00444 short int aFlag)
00445 {
00446 return addEdge(new GenEdge<TNODE,TEDGE>(aData, aFlag), aPSource, aPTarget);
00447 }
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457 template <class TNODE, class TEDGE>
00458 inline GenEdge<TNODE,TEDGE>*
00459 GenUGraph<TNODE,TEDGE>::addEdge(GenEdge<TNODE,TEDGE>* const aPEdge)
00460 {
00461
00462 _edges.push_back(aPEdge);
00463
00464 return aPEdge;
00465 }
00466
00467
00468
00469
00470
00471 template <class TNODE, class TEDGE>
00472 GenEdge<TNODE,TEDGE>*
00473 GenUGraph<TNODE,TEDGE>::addEdge(GenEdge<TNODE,TEDGE>* const aPEdge,
00474 GenNode<TNODE,TEDGE>* const aPNode)
00475 {
00476
00477 aPNode->addEdge(aPEdge);
00478
00479
00480
00481 aPEdge->setPNode(aPNode);
00482
00483
00484 return addEdge(aPEdge);
00485 }
00486
00487
00488
00489
00490
00491 template <class TNODE, class TEDGE>
00492 GenEdge<TNODE,TEDGE>*
00493 GenUGraph<TNODE,TEDGE>::addEdge(GenEdge<TNODE,TEDGE>* const aPEdge,
00494 GenNode<TNODE,TEDGE>* const aPNode1,
00495 GenNode<TNODE,TEDGE>* const aPNode2)
00496 {
00497
00498 aPNode1->addEdge(aPEdge);
00499 aPNode2->addEdge(aPEdge);
00500
00501
00502
00503 aPEdge->setPSource(aPNode1);
00504 aPEdge->setPTarget(aPNode2);
00505
00506
00507 return addEdge(aPEdge);
00508 }
00509
00510
00511
00512
00513
00514 template <class TNODE, class TEDGE>
00515 GenEdge<TNODE,TEDGE>*
00516 GenUGraph<TNODE,TEDGE>::addEdgeBySource(GenEdge<TNODE,TEDGE>* const aPEdge,
00517 GenNode<TNODE,TEDGE>* const aPNode)
00518 {
00519
00520 aPNode->addEdge(aPEdge);
00521
00522
00523 aPEdge->setPSource(aPNode);
00524
00525
00526 return addEdge(aPEdge);
00527 }
00528
00529
00530
00531
00532
00533 template <class TNODE, class TEDGE>
00534 GenEdge<TNODE,TEDGE>*
00535 GenUGraph<TNODE,TEDGE>::addEdgeByTarget(GenEdge<TNODE,TEDGE>* const aPEdge,
00536 GenNode<TNODE,TEDGE>* const aPNode)
00537 {
00538
00539 aPNode->addEdge(aPEdge);
00540
00541
00542 aPEdge->setPTarget(aPNode);
00543
00544
00545 return addEdge(aPEdge);
00546 }
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557 template <class TNODE, class TEDGE>
00558 inline GenNode<TNODE,TEDGE>*
00559 GenUGraph<TNODE,TEDGE>::remove(GenNode<TNODE,TEDGE>* const aPNode)
00560 {
00561 return remove(std::find(_nodes.begin(), _nodes.end(), aPNode));
00562 }
00563
00564
00565
00566
00567
00568 template <class TNODE, class TEDGE>
00569 GenNode<TNODE,TEDGE>*
00570 GenUGraph<TNODE,TEDGE>::remove(typename std::list< GenNode<TNODE,TEDGE>* >::iterator aPos)
00571 {
00572 if (aPos == _nodes.end())
00573 {
00574 return 0;
00575 }
00576 else
00577 {
00578
00579 GenNode<TNODE,TEDGE>* pn = *aPos;
00580
00581
00582
00583 std::list< GenEdge<TNODE,TEDGE>* > el = (*pn).edges();
00584
00585
00586
00587 for (typename std::list<GenEdge<TNODE,TEDGE>*>::const_iterator itE = el.begin();
00588 itE != el.end();
00589 ++itE)
00590 {
00591
00592
00593 delete(remove(*itE));
00594 }
00595
00596
00597 _nodes.erase(aPos);
00598
00599 return pn;
00600 }
00601 }
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612 template <class TNODE, class TEDGE>
00613 inline GenEdge<TNODE,TEDGE>*
00614 GenUGraph<TNODE,TEDGE>::remove(GenEdge<TNODE,TEDGE>* const aPEdge)
00615 {
00616 return remove(std::find(_edges.begin(), _edges.end(), aPEdge));
00617 }
00618
00619
00620
00621
00622
00623 template <class TNODE, class TEDGE>
00624 GenEdge<TNODE,TEDGE>*
00625 GenUGraph<TNODE,TEDGE>::remove(typename std::list<GenEdge<TNODE,TEDGE>*>::iterator aPos)
00626 {
00627 if (aPos == _edges.end())
00628 {
00629 return 0;
00630 }
00631 else
00632 {
00633
00634 GenEdge<TNODE,TEDGE>* pe = *aPos;
00635
00636
00637 _edges.erase(aPos);
00638
00639
00640 (pe->pSource())->removeEdge(pe);
00641 return (pe->pTarget())->removeEdge(pe);
00642 }
00643 }
00644
00645
00646
00647
00648
00649 }