1.1 --- a/src/work/marci/graph_wrapper.h Mon Mar 22 17:05:08 2004 +0000
1.2 +++ b/src/work/marci/graph_wrapper.h Mon Mar 22 17:27:20 2004 +0000
1.3 @@ -336,16 +336,176 @@
1.4 };
1.5
1.6
1.7 - template<typename Graph>
1.8 +
1.9 +// template<typename Graph>
1.10 +// class UndirGraphWrapper {
1.11 +// protected:
1.12 +// Graph* graph;
1.13 +
1.14 +// public:
1.15 +// typedef Graph BaseGraph;
1.16 +
1.17 +// typedef typename Graph::Node Node;
1.18 +// typedef typename Graph::NodeIt NodeIt;
1.19 +
1.20 +// //typedef typename Graph::Edge Edge;
1.21 +// //typedef typename Graph::OutEdgeIt OutEdgeIt;
1.22 +// //typedef typename Graph::InEdgeIt InEdgeIt;
1.23 +// //typedef typename Graph::SymEdgeIt SymEdgeIt;
1.24 +// //typedef typename Graph::EdgeIt EdgeIt;
1.25 +
1.26 +// //private:
1.27 +// typedef typename Graph::Edge GraphEdge;
1.28 +// typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
1.29 +// typedef typename Graph::InEdgeIt GraphInEdgeIt;
1.30 +// //public:
1.31 +
1.32 +// //UndirGraphWrapper() : graph(0) { }
1.33 +// UndirGraphWrapper(Graph& _graph) : graph(&_graph) { }
1.34 +
1.35 +// void setGraph(Graph& _graph) { graph = &_graph; }
1.36 +// Graph& getGraph() const { return (*graph); }
1.37 +
1.38 +// class Edge {
1.39 +// friend class UndirGraphWrapper<Graph>;
1.40 +// bool out_or_in; //true iff out
1.41 +// GraphOutEdgeIt out;
1.42 +// GraphInEdgeIt in;
1.43 +// public:
1.44 +// Edge() : out_or_in(), out(), in() { }
1.45 +// Edge(const Invalid& i) : out_or_in(false), out(), in(i) { }
1.46 +// operator GraphEdge() const {
1.47 +// if (out_or_in) return(out); else return(in);
1.48 +// }
1.49 +// friend bool operator==(const Edge& u, const Edge& v) {
1.50 +// if (v.out_or_in)
1.51 +// return (u.out_or_in && u.out==v.out);
1.52 +// else
1.53 +// return (!u.out_or_in && u.in==v.in);
1.54 +// }
1.55 +// friend bool operator!=(const Edge& u, const Edge& v) {
1.56 +// if (v.out_or_in)
1.57 +// return (!u.out_or_in || u.out!=v.out);
1.58 +// else
1.59 +// return (u.out_or_in || u.in!=v.in);
1.60 +// }
1.61 +// };
1.62 +
1.63 +// class OutEdgeIt : public Edge {
1.64 +// friend class UndirGraphWrapper<Graph>;
1.65 +// public:
1.66 +// OutEdgeIt() : Edge() { }
1.67 +// OutEdgeIt(const Invalid& i) : Edge(i) { }
1.68 +// OutEdgeIt(const UndirGraphWrapper& _G, const Node& n) : Edge() {
1.69 +// out_or_in=true;
1.70 +// _G.graph->first(out, n);
1.71 +// if (!(_G.graph->valid(out))) {
1.72 +// out_or_in=false;
1.73 +// _G.graph->first(in, n);
1.74 +// }
1.75 +// }
1.76 +// };
1.77 +
1.78 +// OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {
1.79 +// e.out_or_in=true;
1.80 +// graph->first(e.out, n);
1.81 +// if (!(graph->valid(e.out))) {
1.82 +// e.out_or_in=false;
1.83 +// graph->first(e.in, n);
1.84 +// }
1.85 +// return e;
1.86 +// }
1.87 +
1.88 +// OutEdgeIt& next(OutEdgeIt& e) const {
1.89 +// if (e.out_or_in) {
1.90 +// Node n=graph->tail(e.out);
1.91 +// graph->next(e.out);
1.92 +// if (!graph->valid(e.out)) {
1.93 +// e.out_or_in=false;
1.94 +// graph->first(e.in, n);
1.95 +// }
1.96 +// } else {
1.97 +// graph->next(e.in);
1.98 +// }
1.99 +// return e;
1.100 +// }
1.101 +
1.102 +// Node aNode(const OutEdgeIt& e) const {
1.103 +// if (e.out_or_in) return graph->tail(e); else return graph->head(e); }
1.104 +// Node bNode(const OutEdgeIt& e) const {
1.105 +// if (e.out_or_in) return graph->head(e); else return graph->tail(e); }
1.106 +
1.107 +// typedef OutEdgeIt InEdgeIt;
1.108 +
1.109 +// template<typename I> I& first(I& i) const { return graph->first(i); }
1.110 +// // template<typename I, typename P> I& first(I& i, const P& p) const {
1.111 +// // return graph->first(i, p); }
1.112 +
1.113 +// template<typename I> I getNext(const I& i) const {
1.114 +// return graph->getNext(i); }
1.115 +// template<typename I> I& next(I &i) const { return graph->next(i); }
1.116 +
1.117 +// template< typename It > It first() const {
1.118 +// It e; first(e); return e; }
1.119 +
1.120 +// template< typename It > It first(const Node& v) const {
1.121 +// It e; first(e, v); return e; }
1.122 +
1.123 +// Node head(const Edge& e) const { return graph->head(e); }
1.124 +// Node tail(const Edge& e) const { return graph->tail(e); }
1.125 +
1.126 +// template<typename I> bool valid(const I& i) const
1.127 +// { return graph->valid(i); }
1.128 +
1.129 +// //template<typename I> void setInvalid(const I &i);
1.130 +// //{ return graph->setInvalid(i); }
1.131 +
1.132 +// int nodeNum() const { return graph->nodeNum(); }
1.133 +// int edgeNum() const { return graph->edgeNum(); }
1.134 +
1.135 +// // template<typename I> Node aNode(const I& e) const {
1.136 +// // return graph->aNode(e); }
1.137 +// // template<typename I> Node bNode(const I& e) const {
1.138 +// // return graph->bNode(e); }
1.139 +
1.140 +// Node addNode() const { return graph->addNode(); }
1.141 +// // FIXME: ez igy nem jo, mert nem
1.142 +// // Edge addEdge(const Node& tail, const Node& head) const {
1.143 +// // return graph->addEdge(tail, head); }
1.144 +
1.145 +// template<typename I> void erase(const I& i) const { graph->erase(i); }
1.146 +
1.147 +// void clear() const { graph->clear(); }
1.148 +
1.149 +// template<typename T> class NodeMap : public Graph::NodeMap<T> {
1.150 +// public:
1.151 +// NodeMap(const UndirGraphWrapper<Graph>& _G) :
1.152 +// Graph::NodeMap<T>(_G.getGraph()) { }
1.153 +// NodeMap(const UndirGraphWrapper<Graph>& _G, T a) :
1.154 +// Graph::NodeMap<T>(_G.getGraph(), a) { }
1.155 +// };
1.156 +
1.157 +// template<typename T> class EdgeMap : public Graph::EdgeMap<T> {
1.158 +// public:
1.159 +// EdgeMap(const UndirGraphWrapper<Graph>& _G) :
1.160 +// Graph::EdgeMap<T>(_G.getGraph()) { }
1.161 +// EdgeMap(const UndirGraphWrapper<Graph>& _G, T a) :
1.162 +// Graph::EdgeMap<T>(_G.getGraph(), a) { }
1.163 +// };
1.164 +// };
1.165 +
1.166 +
1.167 + template<typename GraphWrapper>
1.168 class UndirGraphWrapper {
1.169 protected:
1.170 - Graph* graph;
1.171 -
1.172 + //Graph* graph;
1.173 + GraphWrapper gw;
1.174 +
1.175 public:
1.176 - typedef Graph BaseGraph;
1.177 + typedef GraphWrapper BaseGraph;
1.178
1.179 - typedef typename Graph::Node Node;
1.180 - typedef typename Graph::NodeIt NodeIt;
1.181 + typedef typename GraphWrapper::Node Node;
1.182 + typedef typename GraphWrapper::NodeIt NodeIt;
1.183
1.184 //typedef typename Graph::Edge Edge;
1.185 //typedef typename Graph::OutEdgeIt OutEdgeIt;
1.186 @@ -354,19 +514,19 @@
1.187 //typedef typename Graph::EdgeIt EdgeIt;
1.188
1.189 //private:
1.190 - typedef typename Graph::Edge GraphEdge;
1.191 - typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
1.192 - typedef typename Graph::InEdgeIt GraphInEdgeIt;
1.193 + typedef typename GraphWrapper::Edge GraphEdge;
1.194 + typedef typename GraphWrapper::OutEdgeIt GraphOutEdgeIt;
1.195 + typedef typename GraphWrapper::InEdgeIt GraphInEdgeIt;
1.196 //public:
1.197
1.198 //UndirGraphWrapper() : graph(0) { }
1.199 - UndirGraphWrapper(Graph& _graph) : graph(&_graph) { }
1.200 + UndirGraphWrapper(GraphWrapper _gw) : gw(_gw) { }
1.201
1.202 - void setGraph(Graph& _graph) { graph = &_graph; }
1.203 - Graph& getGraph() const { return (*graph); }
1.204 + //void setGraph(Graph& _graph) { graph = &_graph; }
1.205 + //Graph& getGraph() const { return (*graph); }
1.206
1.207 class Edge {
1.208 - friend class UndirGraphWrapper<Graph>;
1.209 + friend class UndirGraphWrapper<GraphWrapper>;
1.210 bool out_or_in; //true iff out
1.211 GraphOutEdgeIt out;
1.212 GraphInEdgeIt in;
1.213 @@ -391,58 +551,59 @@
1.214 };
1.215
1.216 class OutEdgeIt : public Edge {
1.217 - friend class UndirGraphWrapper<Graph>;
1.218 + friend class UndirGraphWrapper<GraphWrapper>;
1.219 public:
1.220 OutEdgeIt() : Edge() { }
1.221 OutEdgeIt(const Invalid& i) : Edge(i) { }
1.222 - OutEdgeIt(const UndirGraphWrapper& _G, const Node& n) : Edge() {
1.223 + OutEdgeIt(const UndirGraphWrapper<GraphWrapper>& _G, const Node& n)
1.224 + : Edge() {
1.225 out_or_in=true;
1.226 - _G.graph->first(out, n);
1.227 - if (!(_G.graph->valid(out))) {
1.228 + _G.gw.first(out, n);
1.229 + if (!(_G.gw.valid(out))) {
1.230 out_or_in=false;
1.231 - _G.graph->first(in, n);
1.232 + _G.gw.first(in, n);
1.233 }
1.234 }
1.235 };
1.236
1.237 OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {
1.238 e.out_or_in=true;
1.239 - graph->first(e.out, n);
1.240 - if (!(graph->valid(e.out))) {
1.241 + gw.first(e.out, n);
1.242 + if (!(gw.valid(e.out))) {
1.243 e.out_or_in=false;
1.244 - graph->first(e.in, n);
1.245 + gw.first(e.in, n);
1.246 }
1.247 return e;
1.248 }
1.249
1.250 OutEdgeIt& next(OutEdgeIt& e) const {
1.251 if (e.out_or_in) {
1.252 - Node n=graph->tail(e.out);
1.253 - graph->next(e.out);
1.254 - if (!graph->valid(e.out)) {
1.255 + Node n=gw.tail(e.out);
1.256 + gw.next(e.out);
1.257 + if (!gw.valid(e.out)) {
1.258 e.out_or_in=false;
1.259 - graph->first(e.in, n);
1.260 + gw.first(e.in, n);
1.261 }
1.262 } else {
1.263 - graph->next(e.in);
1.264 + gw.next(e.in);
1.265 }
1.266 return e;
1.267 }
1.268
1.269 Node aNode(const OutEdgeIt& e) const {
1.270 - if (e.out_or_in) return graph->tail(e); else return graph->head(e); }
1.271 + if (e.out_or_in) return gw.tail(e); else return gw.head(e); }
1.272 Node bNode(const OutEdgeIt& e) const {
1.273 - if (e.out_or_in) return graph->head(e); else return graph->tail(e); }
1.274 + if (e.out_or_in) return gw.head(e); else return gw.tail(e); }
1.275
1.276 typedef OutEdgeIt InEdgeIt;
1.277
1.278 - template<typename I> I& first(I& i) const { return graph->first(i); }
1.279 + template<typename I> I& first(I& i) const { return gw.first(i); }
1.280 // template<typename I, typename P> I& first(I& i, const P& p) const {
1.281 // return graph->first(i, p); }
1.282
1.283 template<typename I> I getNext(const I& i) const {
1.284 - return graph->getNext(i); }
1.285 - template<typename I> I& next(I &i) const { return graph->next(i); }
1.286 + return gw.getNext(i); }
1.287 + template<typename I> I& next(I &i) const { return gw.next(i); }
1.288
1.289 template< typename It > It first() const {
1.290 It e; first(e); return e; }
1.291 @@ -450,51 +611,53 @@
1.292 template< typename It > It first(const Node& v) const {
1.293 It e; first(e, v); return e; }
1.294
1.295 - Node head(const Edge& e) const { return graph->head(e); }
1.296 - Node tail(const Edge& e) const { return graph->tail(e); }
1.297 + Node head(const Edge& e) const { return gw.head(e); }
1.298 + Node tail(const Edge& e) const { return gw.tail(e); }
1.299
1.300 template<typename I> bool valid(const I& i) const
1.301 - { return graph->valid(i); }
1.302 + { return gw.valid(i); }
1.303
1.304 //template<typename I> void setInvalid(const I &i);
1.305 //{ return graph->setInvalid(i); }
1.306
1.307 - int nodeNum() const { return graph->nodeNum(); }
1.308 - int edgeNum() const { return graph->edgeNum(); }
1.309 + int nodeNum() const { return gw.nodeNum(); }
1.310 + int edgeNum() const { return gw.edgeNum(); }
1.311
1.312 // template<typename I> Node aNode(const I& e) const {
1.313 // return graph->aNode(e); }
1.314 // template<typename I> Node bNode(const I& e) const {
1.315 // return graph->bNode(e); }
1.316
1.317 - Node addNode() const { return graph->addNode(); }
1.318 + Node addNode() const { return gw.addNode(); }
1.319 // FIXME: ez igy nem jo, mert nem
1.320 // Edge addEdge(const Node& tail, const Node& head) const {
1.321 // return graph->addEdge(tail, head); }
1.322
1.323 - template<typename I> void erase(const I& i) const { graph->erase(i); }
1.324 + template<typename I> void erase(const I& i) const { gw.erase(i); }
1.325
1.326 - void clear() const { graph->clear(); }
1.327 + void clear() const { gw.clear(); }
1.328
1.329 - template<typename T> class NodeMap : public Graph::NodeMap<T> {
1.330 + template<typename T> class NodeMap : public GraphWrapper::NodeMap<T> {
1.331 public:
1.332 - NodeMap(const UndirGraphWrapper<Graph>& _G) :
1.333 - Graph::NodeMap<T>(_G.getGraph()) { }
1.334 - NodeMap(const UndirGraphWrapper<Graph>& _G, T a) :
1.335 - Graph::NodeMap<T>(_G.getGraph(), a) { }
1.336 + NodeMap(const UndirGraphWrapper<GraphWrapper>& _G) :
1.337 + GraphWrapper::NodeMap<T>(_G.gw) { }
1.338 + NodeMap(const UndirGraphWrapper<GraphWrapper>& _G, T a) :
1.339 + GraphWrapper::NodeMap<T>(_G.gw, a) { }
1.340 };
1.341
1.342 - template<typename T> class EdgeMap : public Graph::EdgeMap<T> {
1.343 + template<typename T> class EdgeMap : public GraphWrapper::EdgeMap<T> {
1.344 public:
1.345 - EdgeMap(const UndirGraphWrapper<Graph>& _G) :
1.346 - Graph::EdgeMap<T>(_G.getGraph()) { }
1.347 - EdgeMap(const UndirGraphWrapper<Graph>& _G, T a) :
1.348 - Graph::EdgeMap<T>(_G.getGraph(), a) { }
1.349 + EdgeMap(const UndirGraphWrapper<GraphWrapper>& _G) :
1.350 + GraphWrapper::EdgeMap<T>(_G.gw) { }
1.351 + EdgeMap(const UndirGraphWrapper<GraphWrapper>& _G, T a) :
1.352 + GraphWrapper::EdgeMap<T>(_G.gw, a) { }
1.353 };
1.354 };
1.355
1.356
1.357
1.358 +
1.359 +
1.360 // template<typename Graph>
1.361 // class SymGraphWrapper
1.362 // {