src/work/marci/graph_wrapper.h
changeset 236 ea3de9530ee8
parent 235 aa50acc936dc
child 237 7fb8b67d2c5e
     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  //   {