1.1 --- a/src/lemon/graph_wrapper.h Mon Nov 08 15:24:53 2004 +0000
1.2 +++ b/src/lemon/graph_wrapper.h Mon Nov 08 16:33:53 2004 +0000
1.3 @@ -108,104 +108,54 @@
1.4 /// differences should be implemented.
1.5 ///
1.6 ///\author Marton Makai
1.7 - template<typename Graph>
1.8 - class GraphWrapper {
1.9 + template<typename _Graph>
1.10 + class GraphWrapperBase {
1.11 + public:
1.12 + typedef _Graph Graph;
1.13 + /// \todo Is it needed?
1.14 + typedef Graph BaseGraph;
1.15 + typedef Graph ParentGraph;
1.16 +
1.17 protected:
1.18 Graph* graph;
1.19 - GraphWrapper() : graph(0) { }
1.20 + GraphWrapperBase() : graph(0) { }
1.21 void setGraph(Graph& _graph) { graph=&_graph; }
1.22
1.23 public:
1.24 - typedef Graph BaseGraph;
1.25 - typedef Graph ParentGraph;
1.26 -
1.27 - GraphWrapper(Graph& _graph) : graph(&_graph) { }
1.28 - GraphWrapper(const GraphWrapper<Graph>& gw) : graph(gw.graph) { }
1.29 + GraphWrapperBase(Graph& _graph) : graph(&_graph) { }
1.30 + GraphWrapperBase(const GraphWrapperBase<_Graph>& gw) : graph(gw.graph) { }
1.31
1.32 typedef typename Graph::Node Node;
1.33 - class NodeIt : public Node {
1.34 - const GraphWrapper<Graph>* gw;
1.35 - friend class GraphWrapper<Graph>;
1.36 - public:
1.37 - NodeIt() { }
1.38 - NodeIt(Invalid i) : Node(i) { }
1.39 - NodeIt(const GraphWrapper<Graph>& _gw) :
1.40 - Node(typename Graph::NodeIt(*(_gw.graph))), gw(&_gw) { }
1.41 - NodeIt(const GraphWrapper<Graph>& _gw, const Node& n) :
1.42 - Node(n), gw(&_gw) { }
1.43 - NodeIt& operator++() {
1.44 - *(static_cast<Node*>(this))=
1.45 - ++(typename Graph::NodeIt(*(gw->graph), *this));
1.46 - return *this;
1.47 - }
1.48 - };
1.49 typedef typename Graph::Edge Edge;
1.50 - class OutEdgeIt : public Edge {
1.51 - const GraphWrapper<Graph>* gw;
1.52 - friend class GraphWrapper<Graph>;
1.53 - public:
1.54 - OutEdgeIt() { }
1.55 - OutEdgeIt(Invalid i) : Edge(i) { }
1.56 - OutEdgeIt(const GraphWrapper<Graph>& _gw, const Node& n) :
1.57 - Edge(typename Graph::OutEdgeIt(*(_gw.graph), n)), gw(&_gw) { }
1.58 - OutEdgeIt(const GraphWrapper<Graph>& _gw, const Edge& e) :
1.59 - Edge(e), gw(&_gw) { }
1.60 - OutEdgeIt& operator++() {
1.61 - *(static_cast<Edge*>(this))=
1.62 - ++(typename Graph::OutEdgeIt(*(gw->graph), *this));
1.63 - return *this;
1.64 - }
1.65 - };
1.66 - class InEdgeIt : public Edge {
1.67 - const GraphWrapper<Graph>* gw;
1.68 - friend class GraphWrapper<Graph>;
1.69 - public:
1.70 - InEdgeIt() { }
1.71 - InEdgeIt(Invalid i) : Edge(i) { }
1.72 - InEdgeIt(const GraphWrapper<Graph>& _gw, const Node& n) :
1.73 - Edge(typename Graph::InEdgeIt(*(_gw.graph), n)), gw(&_gw) { }
1.74 - InEdgeIt(const GraphWrapper<Graph>& _gw, const Edge& e) :
1.75 - Edge(e), gw(&_gw) { }
1.76 - InEdgeIt& operator++() {
1.77 - *(static_cast<Edge*>(this))=
1.78 - ++(typename Graph::InEdgeIt(*(gw->graph), *this));
1.79 - return *this;
1.80 - }
1.81 - };
1.82 - class EdgeIt : public Edge {
1.83 - const GraphWrapper<Graph>* gw;
1.84 - friend class GraphWrapper<Graph>;
1.85 - public:
1.86 - EdgeIt() { }
1.87 - EdgeIt(Invalid i) : Edge(i) { }
1.88 - EdgeIt(const GraphWrapper<Graph>& _gw) :
1.89 - Edge(typename Graph::EdgeIt(*(_gw.graph))), gw(&_gw) { }
1.90 - EdgeIt(const GraphWrapper<Graph>& _gw, const Edge& e) :
1.91 - Edge(e), gw(&_gw) { }
1.92 - EdgeIt& operator++() {
1.93 - *(static_cast<Edge*>(this))=
1.94 - ++(typename Graph::EdgeIt(*(gw->graph), *this));
1.95 - return *this;
1.96 - }
1.97 - };
1.98
1.99 - NodeIt& first(NodeIt& i) const {
1.100 - i=NodeIt(*this); return i;
1.101 - }
1.102 - OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
1.103 - i=OutEdgeIt(*this, p); return i;
1.104 - }
1.105 - InEdgeIt& first(InEdgeIt& i, const Node& p) const {
1.106 - i=InEdgeIt(*this, p); return i;
1.107 - }
1.108 - EdgeIt& first(EdgeIt& i) const {
1.109 - i=EdgeIt(*this); return i;
1.110 - }
1.111 + void first(Node& i) const { graph->first(i); }
1.112 + void first(Edge& i) const { graph->first(i); }
1.113 + void firstIn(Edge& i, const Node& n) const { graph->firstIn(i, n); }
1.114 + void firstOut(Edge& i, const Node& n ) const { graph->firstOut(i, n); }
1.115 +// NodeIt& first(NodeIt& i) const {
1.116 +// i=NodeIt(*this); return i;
1.117 +// }
1.118 +// OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
1.119 +// i=OutEdgeIt(*this, p); return i;
1.120 +// }
1.121 +// InEdgeIt& first(InEdgeIt& i, const Node& p) const {
1.122 +// i=InEdgeIt(*this, p); return i;
1.123 +// }
1.124 +// EdgeIt& first(EdgeIt& i) const {
1.125 +// i=EdgeIt(*this); return i;
1.126 +// }
1.127
1.128 - Node tail(const Edge& e) const {
1.129 - return Node(graph->tail(static_cast<typename Graph::Edge>(e))); }
1.130 - Node head(const Edge& e) const {
1.131 - return Node(graph->head(static_cast<typename Graph::Edge>(e))); }
1.132 + void next(Node& i) const { graph->next(i); }
1.133 + void next(Edge& i) const { graph->next(i); }
1.134 + void nextIn(Edge& i) const { graph->nextIn(i); }
1.135 + void nextOut(Edge& i) const { graph->nextOut(i); }
1.136 +
1.137 + Node tail(const Edge& e) const { return graph->tail(e); }
1.138 + Node head(const Edge& e) const { return graph->head(e); }
1.139 +// Node tail(const Edge& e) const {
1.140 +// return Node(graph->tail(static_cast<typename Graph::Edge>(e))); }
1.141 +// Node head(const Edge& e) const {
1.142 +// return Node(graph->head(static_cast<typename Graph::Edge>(e))); }
1.143
1.144 int nodeNum() const { return graph->nodeNum(); }
1.145 int edgeNum() const { return graph->edgeNum(); }
1.146 @@ -227,14 +177,38 @@
1.147
1.148 Edge opposite(const Edge& e) const { return Edge(graph->opposite(e)); }
1.149
1.150 + template <typename _Value>
1.151 + class NodeMap : public _Graph::template NodeMap<_Value> {
1.152 + public:
1.153 + typedef typename _Graph::template NodeMap<_Value> Parent;
1.154 + NodeMap(const GraphWrapperBase<_Graph>& gw) : Parent(*gw.graph) { }
1.155 + NodeMap(const GraphWrapperBase<_Graph>& gw, const _Value& value)
1.156 + : Parent(*gw.graph, value) { }
1.157 + };
1.158
1.159 - IMPORT_NODE_MAP(Graph, *(gw.graph), GraphWrapper, gw);
1.160 - IMPORT_EDGE_MAP(Graph, *(gw.graph), GraphWrapper, gw);
1.161 -
1.162 + template <typename _Value>
1.163 + class EdgeMap : public _Graph::template EdgeMap<_Value> {
1.164 + public:
1.165 + typedef typename _Graph::template EdgeMap<_Value> Parent;
1.166 + EdgeMap(const GraphWrapperBase<_Graph>& gw) : Parent(*gw.graph) { }
1.167 + EdgeMap(const GraphWrapperBase<_Graph>& gw, const _Value& value)
1.168 + : Parent(*gw.graph, value) { }
1.169 + };
1.170
1.171 };
1.172
1.173 + template <typename _Graph>
1.174 + class GraphWrapper :
1.175 + public IterableGraphExtender<GraphWrapperBase<_Graph> > {
1.176 + public:
1.177 + typedef _Graph Graph;
1.178 + typedef IterableGraphExtender<GraphWrapperBase<_Graph> > Parent;
1.179 + protected:
1.180 + GraphWrapper() : Parent() { }
1.181
1.182 + public:
1.183 + GraphWrapper(Graph& _graph) { setGraph(_graph); }
1.184 + };
1.185
1.186 /// A graph wrapper which reverses the orientation of the edges.
1.187
1.188 @@ -1103,16 +1077,16 @@
1.189 }
1.190 };
1.191
1.192 - using GraphWrapper<Graph>::first;
1.193 - OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
1.194 - i=OutEdgeIt(*this, p); return i;
1.195 - }
1.196 - InEdgeIt& first(InEdgeIt& i, const Node& p) const {
1.197 - i=InEdgeIt(*this, p); return i;
1.198 - }
1.199 - EdgeIt& first(EdgeIt& i) const {
1.200 - i=EdgeIt(*this); return i;
1.201 - }
1.202 +// using GraphWrapper<Graph>::first;
1.203 +// OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
1.204 +// i=OutEdgeIt(*this, p); return i;
1.205 +// }
1.206 +// InEdgeIt& first(InEdgeIt& i, const Node& p) const {
1.207 +// i=InEdgeIt(*this, p); return i;
1.208 +// }
1.209 +// EdgeIt& first(EdgeIt& i) const {
1.210 +// i=EdgeIt(*this); return i;
1.211 +// }
1.212
1.213
1.214 Node tail(Edge e) const {
1.215 @@ -1434,10 +1408,10 @@
1.216 }
1.217 };
1.218
1.219 - using GraphWrapper<Graph>::first;
1.220 - OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
1.221 - i=OutEdgeIt(*this, p); return i;
1.222 - }
1.223 +// using GraphWrapper<Graph>::first;
1.224 +// OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
1.225 +// i=OutEdgeIt(*this, p); return i;
1.226 +// }
1.227 void erase(const Edge& e) const {
1.228 Node n=tail(e);
1.229 typename Graph::OutEdgeIt f(*Parent::graph, n);