source:lemon-0.x/src/lemon/iterable_graph_extender.h@947:93e9c45703ea

Last change on this file since 947:93e9c45703ea was 946:c94ef40a22ce, checked in by Mihaly Barasz, 16 years ago

The graph_factory branch (@ 1321) has been merged to trunk.

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