1.1 --- a/src/work/marci/graph_wrapper.h Sun Mar 07 19:33:34 2004 +0000
1.2 +++ b/src/work/marci/graph_wrapper.h Mon Mar 08 12:29:07 2004 +0000
1.3 @@ -62,16 +62,16 @@
1.4 template<typename T> class NodeMap : public Graph::NodeMap<T> {
1.5 public:
1.6 NodeMap(const TrivGraphWrapper<Graph>& _G) :
1.7 - Graph::NodeMap<T>(*(_G.G)) { }
1.8 + Graph::NodeMap<T>(_G.getGraph()) { }
1.9 NodeMap(const TrivGraphWrapper<Graph>& _G, T a) :
1.10 - Graph::NodeMap<T>(*(_G.G), a) { }
1.11 + Graph::NodeMap<T>(_G.getGraph(), a) { }
1.12 };
1.13 template<typename T> class EdgeMap : public Graph::EdgeMap<T> {
1.14 public:
1.15 EdgeMap(const TrivGraphWrapper<Graph>& _G) :
1.16 - Graph::EdgeMap<T>(*(_G.G)) { }
1.17 + Graph::EdgeMap<T>(_G.getGraph()) { }
1.18 EdgeMap(const TrivGraphWrapper<Graph>& _G, T a) :
1.19 - Graph::EdgeMap<T>(*(_G.G), a) { }
1.20 + Graph::EdgeMap<T>(_G.getGraph(), a) { }
1.21 };
1.22
1.23 void setGraph(Graph& _graph) { graph = &_graph; }
1.24 @@ -140,16 +140,16 @@
1.25 template<typename T> class NodeMap : public Graph::NodeMap<T> {
1.26 public:
1.27 NodeMap(const RevGraphWrapper<Graph>& _G) :
1.28 - Graph::NodeMap<T>(*(_G.G)) { }
1.29 + Graph::NodeMap<T>(_G.getGraph()) { }
1.30 NodeMap(const RevGraphWrapper<Graph>& _G, T a) :
1.31 - Graph::NodeMap<T>(*(_G.G), a) { }
1.32 + Graph::NodeMap<T>(_G.getGraph(), a) { }
1.33 };
1.34 template<typename T> class EdgeMap : public Graph::EdgeMap<T> {
1.35 public:
1.36 EdgeMap(const RevGraphWrapper<Graph>& _G) :
1.37 - Graph::EdgeMap<T>(*(_G.G)) { }
1.38 + Graph::EdgeMap<T>(_G.getGraph()) { }
1.39 EdgeMap(const RevGraphWrapper<Graph>& _G, T a) :
1.40 - Graph::EdgeMap<T>(*(_G.G), a) { }
1.41 + Graph::EdgeMap<T>(_G.getGraph(), a) { }
1.42 };
1.43
1.44 void setGraph(Graph& _graph) { graph = &_graph; }
1.45 @@ -160,6 +160,150 @@
1.46 };
1.47
1.48
1.49 + template<typename Graph>
1.50 + class UndirGraphWrapper {
1.51 + Graph* graph;
1.52 +
1.53 + public:
1.54 + typedef Graph BaseGraph;
1.55 +
1.56 + typedef typename Graph::NodeIt NodeIt;
1.57 + typedef typename Graph::EachNodeIt EachNodeIt;
1.58 +
1.59 + //typedef typename Graph::EdgeIt EdgeIt;
1.60 + //typedef typename Graph::OutEdgeIt OutEdgeIt;
1.61 + //typedef typename Graph::InEdgeIt InEdgeIt;
1.62 + //typedef typename Graph::SymEdgeIt SymEdgeIt;
1.63 + //typedef typename Graph::EachEdgeIt EachEdgeIt;
1.64 +
1.65 + //private:
1.66 + typedef typename Graph::EdgeIt GraphEdgeIt;
1.67 + typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
1.68 + typedef typename Graph::InEdgeIt GraphInEdgeIt;
1.69 + //public:
1.70 +
1.71 + class EdgeIt {
1.72 + friend class UndirGraphWrapper<Graph>;
1.73 + bool out_or_in; //true iff out
1.74 + GraphOutEdgeIt out;
1.75 + GraphInEdgeIt in;
1.76 + public:
1.77 + EdgeIt() : out_or_in(true), out(), in() { }
1.78 + operator GraphEdgeIt() const {
1.79 + if (out_or_in) return(out); else return(in);
1.80 + }
1.81 + };
1.82 +
1.83 + class OutEdgeIt : public EdgeIt {
1.84 + friend class UndirGraphWrapper<Graph>;
1.85 + //bool out_or_in; //true iff out
1.86 + //GraphOutEdgeIt out;
1.87 + //GraphInEdgeIt in;
1.88 + public:
1.89 + OutEdgeIt() : EdgeIt() { }
1.90 + OutEdgeIt(const UndirGraphWrapper& _G, const NodeIt& n) : EdgeIt() {
1.91 + _G.graph->getFirst(out, n);
1.92 + if (!(_G.graph->valid(out))) {
1.93 + out_or_in=false;
1.94 + _G.graph->getFirst(in, n);
1.95 + }
1.96 + }
1.97 + };
1.98 +
1.99 + OutEdgeIt& getFirst(OutEdgeIt& e, const NodeIt& n) const {
1.100 + e.out_or_in=true;
1.101 + graph->getFirst(e.out, n);
1.102 + if (!(graph->valid(e.out))) {
1.103 + e.out_or_in=false;
1.104 + graph->getFirst(e.in, n);
1.105 + }
1.106 + return e;
1.107 + }
1.108 +
1.109 + OutEdgeIt& next(OutEdgeIt& e) const {
1.110 + if (e.out_or_in) {
1.111 + NodeIt n=graph->tail(e.out);
1.112 + graph->next(e.out);
1.113 + if (!graph->valid(e.out)) {
1.114 + e.out_or_in=false;
1.115 + graph->getFirst(e.in, n);
1.116 + }
1.117 + } else {
1.118 + graph->next(e.in);
1.119 + }
1.120 + return e;
1.121 + }
1.122 +
1.123 + NodeIt aNode(const OutEdgeIt& e) const {
1.124 + if (e.out_or_in) return graph->tail(e); else return graph->head(e); }
1.125 + NodeIt bNode(const OutEdgeIt& e) const {
1.126 + if (e.out_or_in) return graph->head(e); else return graph->tail(e); }
1.127 +
1.128 + typedef OutEdgeIt InEdgeIt;
1.129 +
1.130 + template<typename I> I& getFirst(I& i) const { return graph->getFirst(i); }
1.131 +// template<typename I, typename P> I& getFirst(I& i, const P& p) const {
1.132 +// return graph->getFirst(i, p); }
1.133 +
1.134 + template<typename I> I getNext(const I& i) const {
1.135 + return graph->getNext(i); }
1.136 + template<typename I> I& next(I &i) const { return graph->next(i); }
1.137 +
1.138 + template< typename It > It first() const {
1.139 + It e; getFirst(e); return e; }
1.140 +
1.141 + template< typename It > It first(const NodeIt& v) const {
1.142 + It e; getFirst(e, v); return e; }
1.143 +
1.144 + NodeIt head(const EdgeIt& e) const { return graph->head(e); }
1.145 + NodeIt tail(const EdgeIt& e) const { return graph->tail(e); }
1.146 +
1.147 + template<typename I> bool valid(const I& i) const
1.148 + { return graph->valid(i); }
1.149 +
1.150 + //template<typename I> void setInvalid(const I &i);
1.151 + //{ return graph->setInvalid(i); }
1.152 +
1.153 + int nodeNum() const { return graph->nodeNum(); }
1.154 + int edgeNum() const { return graph->edgeNum(); }
1.155 +
1.156 +// template<typename I> NodeIt aNode(const I& e) const {
1.157 +// return graph->aNode(e); }
1.158 +// template<typename I> NodeIt bNode(const I& e) const {
1.159 +// return graph->bNode(e); }
1.160 +
1.161 + NodeIt addNode() const { return graph->addNode(); }
1.162 + EdgeIt addEdge(const NodeIt& tail, const NodeIt& head) const {
1.163 + return graph->addEdge(tail, head); }
1.164 +
1.165 + template<typename I> void erase(const I& i) const { graph->erase(i); }
1.166 +
1.167 + void clear() const { graph->clear(); }
1.168 +
1.169 + template<typename T> class NodeMap : public Graph::NodeMap<T> {
1.170 + public:
1.171 + NodeMap(const UndirGraphWrapper<Graph>& _G) :
1.172 + Graph::NodeMap<T>(_G.getGraph()) { }
1.173 + NodeMap(const UndirGraphWrapper<Graph>& _G, T a) :
1.174 + Graph::NodeMap<T>(_G.getGraph(), a) { }
1.175 + };
1.176 + template<typename T> class EdgeMap : public Graph::EdgeMap<T> {
1.177 + public:
1.178 + EdgeMap(const UndirGraphWrapper<Graph>& _G) :
1.179 + Graph::EdgeMap<T>(_G.getGraph()) { }
1.180 + EdgeMap(const UndirGraphWrapper<Graph>& _G, T a) :
1.181 + Graph::EdgeMap<T>(_G.getGraph(), a) { }
1.182 + };
1.183 +
1.184 + void setGraph(Graph& _graph) { graph = &_graph; }
1.185 + Graph& getGraph() const { return (*graph); }
1.186 +
1.187 + //TrivGraphWrapper() : graph(0) { }
1.188 + UndirGraphWrapper(Graph& _graph) : graph(&_graph) { }
1.189 + };
1.190 +
1.191 +
1.192 +
1.193 // template<typename Graph>
1.194 // class SymGraphWrapper
1.195 // {
1.196 @@ -247,6 +391,8 @@
1.197 G(&_G), flow(&_flow), capacity(&_capacity) { }
1.198 // ResGraphWrapper(const ResGraphWrapper& res_graph_wrapper) :
1.199 // G(res_graph_wrapper.G), flow(res_graph_wrapper.flow), capacity(res_graph_wrapper.capacity) { }
1.200 + void setGraph(Graph& _graph) { graph = &_graph; }
1.201 + Graph& getGraph() const { return (*graph); }
1.202 class EdgeIt;
1.203 class OutEdgeIt;
1.204 friend class EdgeIt;
1.205 @@ -499,9 +645,9 @@
1.206 template<typename T> class NodeMap : public Graph::NodeMap<T> {
1.207 public:
1.208 NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G)
1.209 - : Graph::NodeMap<T>(*(_G.G)) { }
1.210 + : Graph::NodeMap<T>(_G.getGraph()) { }
1.211 NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G,
1.212 - T a) : Graph::NodeMap<T>(*(_G.G), a) { }
1.213 + T a) : Graph::NodeMap<T>(_G.getGraph(), a) { }
1.214 };
1.215
1.216 // template <typename T>
1.217 @@ -518,8 +664,8 @@
1.218 class EdgeMap {
1.219 typename Graph::EdgeMap<T> forward_map, backward_map;
1.220 public:
1.221 - EdgeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) : forward_map(*(_G.G)), backward_map(*(_G.G)) { }
1.222 - EdgeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) : forward_map(*(_G.G), a), backward_map(*(_G.G), a) { }
1.223 + EdgeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) : forward_map(_G.getGraph()), backward_map(_G.getGraph()) { }
1.224 + EdgeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) : forward_map(_G.getGraph(), a), backward_map(_G.getGraph(), a) { }
1.225 void set(EdgeIt e, T a) {
1.226 if (e.out_or_in)
1.227 forward_map.set(e.out, a);