src/lemon/iterable_graph_extender.h
author klao
Wed, 27 Oct 2004 22:38:50 +0000
changeset 946 c94ef40a22ce
child 962 1a770e9f80b2
permissions -rw-r--r--
The graph_factory branch (@ 1321) has been merged to trunk.
klao@946
     1
// -*- c++ -*-
klao@946
     2
#ifndef LEMON_ITERABLE_GRAPH_EXTENDER_H
klao@946
     3
#define LEMON_ITERABLE_GRAPH_EXTENDER_H
klao@946
     4
klao@946
     5
#include <lemon/invalid.h>
klao@946
     6
klao@946
     7
namespace lemon {
klao@946
     8
  
klao@946
     9
  template <typename _Base>
klao@946
    10
  class IterableGraphExtender : public _Base {
klao@946
    11
klao@946
    12
    typedef _Base Parent;
klao@946
    13
    typedef IterableGraphExtender<_Base> Graph;
klao@946
    14
klao@946
    15
  public:
klao@946
    16
klao@946
    17
    typedef typename Parent::Node Node;
klao@946
    18
    typedef typename Parent::Edge Edge;
klao@946
    19
klao@946
    20
klao@946
    21
    class NodeIt : public Node { 
klao@946
    22
      const Graph* graph;
klao@946
    23
    public:
klao@946
    24
klao@946
    25
      NodeIt() {}
klao@946
    26
klao@946
    27
      NodeIt(Invalid i) : Node(i) { }
klao@946
    28
klao@946
    29
      explicit NodeIt(const Graph& _graph) : Node(), graph(&_graph) {
klao@946
    30
	_graph.first(*static_cast<Node*>(this));
klao@946
    31
      }
klao@946
    32
klao@946
    33
      NodeIt(const Graph& _graph, const Node& node) 
klao@946
    34
	: Node(node), graph(&_graph) {}
klao@946
    35
klao@946
    36
      NodeIt& operator++() { 
klao@946
    37
	graph->next(*this);
klao@946
    38
	return *this; 
klao@946
    39
      }
klao@946
    40
klao@946
    41
    };
klao@946
    42
klao@946
    43
klao@946
    44
    class EdgeIt : public Edge { 
klao@946
    45
      const Graph* graph;
klao@946
    46
    public:
klao@946
    47
klao@946
    48
      EdgeIt() { }
klao@946
    49
klao@946
    50
      EdgeIt(Invalid i) : Edge(i) { }
klao@946
    51
klao@946
    52
      explicit EdgeIt(const Graph& _graph) : Edge(), graph(&_graph) {
klao@946
    53
	_graph.first(*static_cast<Edge*>(this));
klao@946
    54
      }
klao@946
    55
klao@946
    56
      EdgeIt(const Graph& _graph, const Edge& e) : 
klao@946
    57
	Edge(e), graph(&_graph) { }
klao@946
    58
klao@946
    59
      EdgeIt& operator++() { 
klao@946
    60
	graph->next(*this);
klao@946
    61
	return *this; 
klao@946
    62
      }
klao@946
    63
klao@946
    64
    };
klao@946
    65
klao@946
    66
klao@946
    67
    class OutEdgeIt : public Edge { 
klao@946
    68
      const Graph* graph;
klao@946
    69
    public:
klao@946
    70
klao@946
    71
      OutEdgeIt() { }
klao@946
    72
klao@946
    73
      OutEdgeIt(Invalid i) : Edge(i) { }
klao@946
    74
klao@946
    75
      OutEdgeIt(const Graph& _graph, const Node& node) 
klao@946
    76
	: Edge(), graph(&_graph) {
klao@946
    77
	_graph.firstOut(*this, node);
klao@946
    78
      }
klao@946
    79
klao@946
    80
      OutEdgeIt(const Graph& _graph, const Edge& edge) 
klao@946
    81
	: Edge(edge), graph(&_graph) {}
klao@946
    82
klao@946
    83
      OutEdgeIt& operator++() { 
klao@946
    84
	graph->nextOut(*this);
klao@946
    85
	return *this; 
klao@946
    86
      }
klao@946
    87
klao@946
    88
    };
klao@946
    89
klao@946
    90
klao@946
    91
    class InEdgeIt : public Edge { 
klao@946
    92
      const Graph* graph;
klao@946
    93
    public:
klao@946
    94
klao@946
    95
      InEdgeIt() { }
klao@946
    96
klao@946
    97
      InEdgeIt(Invalid i) : Edge(i) { }
klao@946
    98
klao@946
    99
      InEdgeIt(const Graph& _graph, const Node& node) 
klao@946
   100
	: Edge(), graph(&_graph) {
klao@946
   101
	_graph.firstIn(*this, node);
klao@946
   102
      }
klao@946
   103
klao@946
   104
      InEdgeIt(const Graph& _graph, const Edge& edge) : 
klao@946
   105
	Edge(edge), graph(&_graph) {}
klao@946
   106
klao@946
   107
      InEdgeIt& operator++() { 
klao@946
   108
	graph->nextIn(*this);
klao@946
   109
	return *this; 
klao@946
   110
      }
klao@946
   111
klao@946
   112
    };
klao@946
   113
klao@946
   114
    using Parent::first;
klao@946
   115
klao@946
   116
  private:
klao@946
   117
klao@946
   118
    /// \todo When (and if) we change the iterators concept to use operator*,
klao@946
   119
    /// then the following shadowed methods will become superfluous.
klao@946
   120
    /// But for now these are important safety measures.
klao@946
   121
klao@946
   122
    void first(NodeIt &) const;
klao@946
   123
    void first(EdgeIt &) const;
klao@946
   124
    void first(OutEdgeIt &) const;
klao@946
   125
    void first(InEdgeIt &) const;
klao@946
   126
klao@946
   127
  };
klao@946
   128
  
klao@946
   129
}
klao@946
   130
klao@946
   131
#endif // LEMON_GRAPH_EXTENDER_H