Changeset 2031:080d51024ac5 in lemon-0.x for lemon/bits/graph_adaptor_extender.h
- Timestamp:
- 04/03/06 11:45:23 (18 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@2670
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/bits/graph_adaptor_extender.h
r1996 r2031 34 34 /// 35 35 /// \brief Extender for the GraphAdaptors 36 template <typename Base>37 class GraphAdaptorExtender : public Base{36 template <typename _Graph> 37 class GraphAdaptorExtender : public _Graph { 38 38 public: 39 39 40 typedef Base Parent; 41 typedef GraphAdaptorExtender Graph; 40 typedef _Graph Parent; 41 typedef _Graph Graph; 42 typedef GraphAdaptorExtender Adaptor; 42 43 43 44 // Base extensions … … 72 73 73 74 class NodeIt : public Node { 74 const Graph* graph;75 const Adaptor* graph; 75 76 public: 76 77 … … 79 80 NodeIt(Invalid i) : Node(i) { } 80 81 81 explicit NodeIt(const Graph& _graph) : graph(&_graph) {82 _graph.first( *static_cast<Node*>(this));83 } 84 85 NodeIt(const Graph& _graph, const Node& node)82 explicit NodeIt(const Adaptor& _graph) : graph(&_graph) { 83 _graph.first(static_cast<Node&>(*this)); 84 } 85 86 NodeIt(const Adaptor& _graph, const Node& node) 86 87 : Node(node), graph(&_graph) {} 87 88 … … 95 96 96 97 class EdgeIt : public Edge { 97 const Graph* graph;98 const Adaptor* graph; 98 99 public: 99 100 … … 102 103 EdgeIt(Invalid i) : Edge(i) { } 103 104 104 explicit EdgeIt(const Graph& _graph) : graph(&_graph) {105 _graph.first( *static_cast<Edge*>(this));106 } 107 108 EdgeIt(const Graph& _graph, const Edge& e) :105 explicit EdgeIt(const Adaptor& _graph) : graph(&_graph) { 106 _graph.first(static_cast<Edge&>(*this)); 107 } 108 109 EdgeIt(const Adaptor& _graph, const Edge& e) : 109 110 Edge(e), graph(&_graph) { } 110 111 … … 118 119 119 120 class OutEdgeIt : public Edge { 120 const Graph* graph;121 const Adaptor* graph; 121 122 public: 122 123 … … 125 126 OutEdgeIt(Invalid i) : Edge(i) { } 126 127 127 OutEdgeIt(const Graph& _graph, const Node& node)128 OutEdgeIt(const Adaptor& _graph, const Node& node) 128 129 : graph(&_graph) { 129 130 _graph.firstOut(*this, node); 130 131 } 131 132 132 OutEdgeIt(const Graph& _graph, const Edge& edge)133 OutEdgeIt(const Adaptor& _graph, const Edge& edge) 133 134 : Edge(edge), graph(&_graph) {} 134 135 … … 142 143 143 144 class InEdgeIt : public Edge { 144 const Graph* graph;145 const Adaptor* graph; 145 146 public: 146 147 … … 149 150 InEdgeIt(Invalid i) : Edge(i) { } 150 151 151 InEdgeIt(const Graph& _graph, const Node& node)152 InEdgeIt(const Adaptor& _graph, const Node& node) 152 153 : graph(&_graph) { 153 154 _graph.firstIn(*this, node); 154 155 } 155 156 156 InEdgeIt(const Graph& _graph, const Edge& edge) :157 InEdgeIt(const Adaptor& _graph, const Edge& edge) : 157 158 Edge(edge), graph(&_graph) {} 158 159 … … 198 199 /// 199 200 /// \brief Extender for the UGraphAdaptors 200 template <typename Base>201 class UGraphAdaptorExtender : public Base{201 template <typename _UGraph> 202 class UGraphAdaptorExtender : public _UGraph { 202 203 public: 203 204 204 typedef Base Parent; 205 typedef UGraphAdaptorExtender Graph; 205 typedef _UGraph Parent; 206 typedef _UGraph UGraph; 207 typedef UGraphAdaptorExtender Adaptor; 206 208 207 209 typedef typename Parent::Node Node; … … 255 257 256 258 class NodeIt : public Node { 257 const Graph* graph;259 const Adaptor* graph; 258 260 public: 259 261 … … 262 264 NodeIt(Invalid i) : Node(i) { } 263 265 264 explicit NodeIt(const Graph& _graph) : graph(&_graph) {265 _graph.first( *static_cast<Node*>(this));266 } 267 268 NodeIt(const Graph& _graph, const Node& node)266 explicit NodeIt(const Adaptor& _graph) : graph(&_graph) { 267 _graph.first(static_cast<Node&>(*this)); 268 } 269 270 NodeIt(const Adaptor& _graph, const Node& node) 269 271 : Node(node), graph(&_graph) {} 270 272 … … 278 280 279 281 class EdgeIt : public Edge { 280 const Graph* graph;282 const Adaptor* graph; 281 283 public: 282 284 … … 285 287 EdgeIt(Invalid i) : Edge(i) { } 286 288 287 explicit EdgeIt(const Graph& _graph) : graph(&_graph) {288 _graph.first( *static_cast<Edge*>(this));289 } 290 291 EdgeIt(const Graph& _graph, const Edge& e) :289 explicit EdgeIt(const Adaptor& _graph) : graph(&_graph) { 290 _graph.first(static_cast<Edge&>(*this)); 291 } 292 293 EdgeIt(const Adaptor& _graph, const Edge& e) : 292 294 Edge(e), graph(&_graph) { } 293 295 … … 301 303 302 304 class OutEdgeIt : public Edge { 303 const Graph* graph;305 const Adaptor* graph; 304 306 public: 305 307 … … 308 310 OutEdgeIt(Invalid i) : Edge(i) { } 309 311 310 OutEdgeIt(const Graph& _graph, const Node& node)312 OutEdgeIt(const Adaptor& _graph, const Node& node) 311 313 : graph(&_graph) { 312 314 _graph.firstOut(*this, node); 313 315 } 314 316 315 OutEdgeIt(const Graph& _graph, const Edge& edge)317 OutEdgeIt(const Adaptor& _graph, const Edge& edge) 316 318 : Edge(edge), graph(&_graph) {} 317 319 … … 325 327 326 328 class InEdgeIt : public Edge { 327 const Graph* graph;329 const Adaptor* graph; 328 330 public: 329 331 … … 332 334 InEdgeIt(Invalid i) : Edge(i) { } 333 335 334 InEdgeIt(const Graph& _graph, const Node& node)336 InEdgeIt(const Adaptor& _graph, const Node& node) 335 337 : graph(&_graph) { 336 338 _graph.firstIn(*this, node); 337 339 } 338 340 339 InEdgeIt(const Graph& _graph, const Edge& edge) :341 InEdgeIt(const Adaptor& _graph, const Edge& edge) : 340 342 Edge(edge), graph(&_graph) {} 341 343 … … 348 350 349 351 class UEdgeIt : public Parent::UEdge { 350 const Graph* graph;352 const Adaptor* graph; 351 353 public: 352 354 … … 355 357 UEdgeIt(Invalid i) : UEdge(i) { } 356 358 357 explicit UEdgeIt(const Graph& _graph) : graph(&_graph) {358 _graph.first( *static_cast<UEdge*>(this));359 } 360 361 UEdgeIt(const Graph& _graph, const UEdge& e) :359 explicit UEdgeIt(const Adaptor& _graph) : graph(&_graph) { 360 _graph.first(static_cast<UEdge&>(*this)); 361 } 362 363 UEdgeIt(const Adaptor& _graph, const UEdge& e) : 362 364 UEdge(e), graph(&_graph) { } 363 365 … … 371 373 class IncEdgeIt : public Parent::UEdge { 372 374 friend class UGraphAdaptorExtender; 373 const Graph* graph;375 const Adaptor* graph; 374 376 bool direction; 375 377 public: … … 379 381 IncEdgeIt(Invalid i) : UEdge(i), direction(false) { } 380 382 381 IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) {383 IncEdgeIt(const Adaptor& _graph, const Node &n) : graph(&_graph) { 382 384 _graph.firstInc(static_cast<UEdge&>(*this), direction, n); 383 385 } 384 386 385 IncEdgeIt(const Graph& _graph, const UEdge &ue, const Node &n)387 IncEdgeIt(const Adaptor& _graph, const UEdge &ue, const Node &n) 386 388 : graph(&_graph), UEdge(ue) { 387 389 direction = (_graph.source(ue) == n); … … 437 439 }; 438 440 441 /// \ingroup graphbits 442 /// 443 /// \brief Extender for the BpUGraphAdaptors 444 template <typename Base> 445 class BpUGraphAdaptorExtender : public Base { 446 public: 447 typedef Base Parent; 448 typedef BpUGraphAdaptorExtender Graph; 449 450 typedef typename Parent::Node Node; 451 typedef typename Parent::BNode BNode; 452 typedef typename Parent::ANode ANode; 453 typedef typename Parent::Edge Edge; 454 typedef typename Parent::UEdge UEdge; 455 456 Node oppositeNode(const UEdge& edge, const Node& node) const { 457 return source(edge) == node ? 458 target(edge) : source(edge); 459 } 460 461 462 int maxId(Node) const { 463 return Parent::maxNodeId(); 464 } 465 int maxId(BNode) const { 466 return Parent::maxBNodeId(); 467 } 468 int maxId(ANode) const { 469 return Parent::maxANodeId(); 470 } 471 int maxId(Edge) const { 472 return Parent::maxEdgeId(); 473 } 474 int maxId(UEdge) const { 475 return Parent::maxUEdgeId(); 476 } 477 478 479 Node fromId(int id, Node) const { 480 return Parent::nodeFromId(id); 481 } 482 ANode fromId(int id, ANode) const { 483 return Parent::fromANodeId(id); 484 } 485 BNode fromId(int id, BNode) const { 486 return Parent::fromBNodeId(id); 487 } 488 Edge fromId(int id, Edge) const { 489 return Parent::edgeFromId(id); 490 } 491 UEdge fromId(int id, UEdge) const { 492 return Parent::uEdgeFromId(id); 493 } 494 495 class NodeIt : public Node { 496 const Graph* graph; 497 public: 498 499 NodeIt() { } 500 501 NodeIt(Invalid i) : Node(INVALID) { } 502 503 explicit NodeIt(const Graph& _graph) : graph(&_graph) { 504 graph->first(static_cast<Node&>(*this)); 505 } 506 507 NodeIt(const Graph& _graph, const Node& node) 508 : Node(node), graph(&_graph) { } 509 510 NodeIt& operator++() { 511 graph->next(*this); 512 return *this; 513 } 514 515 }; 516 517 class ANodeIt : public Node { 518 friend class BpUGraphAdaptorExtender; 519 const Graph* graph; 520 public: 521 522 ANodeIt() { } 523 524 ANodeIt(Invalid i) : Node(INVALID) { } 525 526 explicit ANodeIt(const Graph& _graph) : graph(&_graph) { 527 graph->firstANode(static_cast<Node&>(*this)); 528 } 529 530 ANodeIt(const Graph& _graph, const Node& node) 531 : Node(node), graph(&_graph) {} 532 533 ANodeIt& operator++() { 534 graph->nextANode(*this); 535 return *this; 536 } 537 }; 538 539 class BNodeIt : public Node { 540 friend class BpUGraphAdaptorExtender; 541 const Graph* graph; 542 public: 543 544 BNodeIt() { } 545 546 BNodeIt(Invalid i) : Node(INVALID) { } 547 548 explicit BNodeIt(const Graph& _graph) : graph(&_graph) { 549 graph->firstBNode(static_cast<Node&>(*this)); 550 } 551 552 BNodeIt(const Graph& _graph, const Node& node) 553 : Node(node), graph(&_graph) {} 554 555 BNodeIt& operator++() { 556 graph->nextBNode(*this); 557 return *this; 558 } 559 }; 560 561 class EdgeIt : public Edge { 562 friend class BpUGraphAdaptorExtender; 563 const Graph* graph; 564 public: 565 566 EdgeIt() { } 567 568 EdgeIt(Invalid i) : Edge(INVALID) { } 569 570 explicit EdgeIt(const Graph& _graph) : graph(&_graph) { 571 graph->first(static_cast<Edge&>(*this)); 572 } 573 574 EdgeIt(const Graph& _graph, const Edge& edge) 575 : Edge(edge), graph(&_graph) { } 576 577 EdgeIt& operator++() { 578 graph->next(*this); 579 return *this; 580 } 581 582 }; 583 584 class UEdgeIt : public UEdge { 585 friend class BpUGraphAdaptorExtender; 586 const Graph* graph; 587 public: 588 589 UEdgeIt() { } 590 591 UEdgeIt(Invalid i) : UEdge(INVALID) { } 592 593 explicit UEdgeIt(const Graph& _graph) : graph(&_graph) { 594 graph->first(static_cast<UEdge&>(*this)); 595 } 596 597 UEdgeIt(const Graph& _graph, const UEdge& edge) 598 : UEdge(edge), graph(&_graph) { } 599 600 UEdgeIt& operator++() { 601 graph->next(*this); 602 return *this; 603 } 604 }; 605 606 class OutEdgeIt : public Edge { 607 friend class BpUGraphAdaptorExtender; 608 const Graph* graph; 609 public: 610 611 OutEdgeIt() { } 612 613 OutEdgeIt(Invalid i) : Edge(i) { } 614 615 OutEdgeIt(const Graph& _graph, const Node& node) 616 : graph(&_graph) { 617 graph->firstOut(*this, node); 618 } 619 620 OutEdgeIt(const Graph& _graph, const Edge& edge) 621 : Edge(edge), graph(&_graph) {} 622 623 OutEdgeIt& operator++() { 624 graph->nextOut(*this); 625 return *this; 626 } 627 628 }; 629 630 631 class InEdgeIt : public Edge { 632 friend class BpUGraphAdaptorExtender; 633 const Graph* graph; 634 public: 635 636 InEdgeIt() { } 637 638 InEdgeIt(Invalid i) : Edge(i) { } 639 640 InEdgeIt(const Graph& _graph, const Node& node) 641 : graph(&_graph) { 642 graph->firstIn(*this, node); 643 } 644 645 InEdgeIt(const Graph& _graph, const Edge& edge) : 646 Edge(edge), graph(&_graph) {} 647 648 InEdgeIt& operator++() { 649 graph->nextIn(*this); 650 return *this; 651 } 652 653 }; 654 655 /// \brief Base node of the iterator 656 /// 657 /// Returns the base node (ie. the source in this case) of the iterator 658 Node baseNode(const OutEdgeIt &e) const { 659 return Parent::source((Edge&)e); 660 } 661 /// \brief Running node of the iterator 662 /// 663 /// Returns the running node (ie. the target in this case) of the 664 /// iterator 665 Node runningNode(const OutEdgeIt &e) const { 666 return Parent::target((Edge&)e); 667 } 668 669 /// \brief Base node of the iterator 670 /// 671 /// Returns the base node (ie. the target in this case) of the iterator 672 Node baseNode(const InEdgeIt &e) const { 673 return Parent::target((Edge&)e); 674 } 675 /// \brief Running node of the iterator 676 /// 677 /// Returns the running node (ie. the source in this case) of the 678 /// iterator 679 Node runningNode(const InEdgeIt &e) const { 680 return Parent::source((Edge&)e); 681 } 682 683 class IncEdgeIt : public Parent::UEdge { 684 friend class BpUGraphAdaptorExtender; 685 const Graph* graph; 686 bool direction; 687 public: 688 689 IncEdgeIt() { } 690 691 IncEdgeIt(Invalid i) : UEdge(i), direction(true) { } 692 693 IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) { 694 graph->firstInc(*this, direction, n); 695 } 696 697 IncEdgeIt(const Graph& _graph, const UEdge &ue, const Node &n) 698 : graph(&_graph), UEdge(ue) { 699 direction = (graph->source(ue) == n); 700 } 701 702 IncEdgeIt& operator++() { 703 graph->nextInc(*this, direction); 704 return *this; 705 } 706 }; 707 708 709 /// Base node of the iterator 710 /// 711 /// Returns the base node of the iterator 712 Node baseNode(const IncEdgeIt &e) const { 713 return e.direction ? source(e) : target(e); 714 } 715 716 /// Running node of the iterator 717 /// 718 /// Returns the running node of the iterator 719 Node runningNode(const IncEdgeIt &e) const { 720 return e.direction ? target(e) : source(e); 721 } 722 723 }; 724 439 725 440 726 }
Note: See TracChangeset
for help on using the changeset viewer.