lemon/graph_adaptor.h
changeset 2031 080d51024ac5
parent 1999 2ff283124dfc
child 2034 b71f8ff62046
     1.1 --- a/lemon/graph_adaptor.h	Mon Apr 03 09:24:38 2006 +0000
     1.2 +++ b/lemon/graph_adaptor.h	Mon Apr 03 09:45:23 2006 +0000
     1.3 @@ -19,13 +19,13 @@
     1.4  #ifndef LEMON_GRAPH_ADAPTOR_H
     1.5  #define LEMON_GRAPH_ADAPTOR_H
     1.6  
     1.7 -///\ingroup graph_adaptors
     1.8 -///\file
     1.9 -///\brief Several graph adaptors.
    1.10 +/// \ingroup graph_adaptors
    1.11 +/// \file
    1.12 +/// \brief Several graph adaptors.
    1.13  ///
    1.14 -///This file contains several useful graph adaptor functions.
    1.15 +/// This file contains several useful graph adaptor functions.
    1.16  ///
    1.17 -///\author Marton Makai
    1.18 +/// \author Marton Makai and Balazs Dezso
    1.19  
    1.20  #include <lemon/bits/invalid.h>
    1.21  #include <lemon/maps.h>
    1.22 @@ -61,6 +61,7 @@
    1.23    class GraphAdaptorBase {
    1.24    public:
    1.25      typedef _Graph Graph;
    1.26 +    typedef GraphAdaptorBase Adaptor;
    1.27      typedef Graph ParentGraph;
    1.28  
    1.29    protected:
    1.30 @@ -115,6 +116,14 @@
    1.31      int id(const Node& v) const { return graph->id(v); }
    1.32      int id(const Edge& e) const { return graph->id(e); }
    1.33  
    1.34 +    Node fromNodeId(int id) const {
    1.35 +      return graph->fromNodeId(id);
    1.36 +    }
    1.37 +
    1.38 +    Edge fromEdgeId(int id) const {
    1.39 +      return graph->fromEdgeId(id);
    1.40 +    }
    1.41 +
    1.42      int maxNodeId() const {
    1.43        return graph->maxNodeId();
    1.44      }
    1.45 @@ -136,23 +145,51 @@
    1.46      } 
    1.47      
    1.48      template <typename _Value>
    1.49 -    class NodeMap : public _Graph::template NodeMap<_Value> {
    1.50 +    class NodeMap : public Graph::template NodeMap<_Value> {
    1.51      public:
    1.52 -      typedef typename _Graph::template NodeMap<_Value> Parent;
    1.53 -      explicit NodeMap(const GraphAdaptorBase<_Graph>& ga) 
    1.54 -	: Parent(*ga.graph) { }
    1.55 -      NodeMap(const GraphAdaptorBase<_Graph>& ga, const _Value& value)
    1.56 +
    1.57 +      typedef typename Graph::template NodeMap<_Value> Parent;
    1.58 +
    1.59 +      explicit NodeMap(const Adaptor& ga) 
    1.60 +	: Parent(*ga.graph) {}
    1.61 +
    1.62 +      NodeMap(const Adaptor& ga, const _Value& value)
    1.63  	: Parent(*ga.graph, value) { }
    1.64 +
    1.65 +      NodeMap& operator=(const NodeMap& cmap) {
    1.66 +        return operator=<NodeMap>(cmap);
    1.67 +      }
    1.68 +
    1.69 +      template <typename CMap>
    1.70 +      NodeMap& operator=(const CMap& cmap) {
    1.71 +        Parent::operator=(cmap);
    1.72 +        return *this;
    1.73 +      }
    1.74 +      
    1.75      };
    1.76  
    1.77      template <typename _Value>
    1.78 -    class EdgeMap : public _Graph::template EdgeMap<_Value> {
    1.79 +    class EdgeMap : public Graph::template EdgeMap<_Value> {
    1.80      public:
    1.81 -      typedef typename _Graph::template EdgeMap<_Value> Parent;
    1.82 -      explicit EdgeMap(const GraphAdaptorBase<_Graph>& ga) 
    1.83 -	: Parent(*ga.graph) { }
    1.84 -      EdgeMap(const GraphAdaptorBase<_Graph>& ga, const _Value& value)
    1.85 -	: Parent(*ga.graph, value) { }
    1.86 +      
    1.87 +      typedef typename Graph::template EdgeMap<_Value> Parent;
    1.88 +      
    1.89 +      explicit EdgeMap(const Adaptor& ga) 
    1.90 +	: Parent(*ga.graph) {}
    1.91 +
    1.92 +      EdgeMap(const Adaptor& ga, const _Value& value)
    1.93 +	: Parent(*ga.graph, value) {}
    1.94 +
    1.95 +      EdgeMap& operator=(const EdgeMap& cmap) {
    1.96 +        return operator=<EdgeMap>(cmap);
    1.97 +      }
    1.98 +
    1.99 +      template <typename CMap>
   1.100 +      EdgeMap& operator=(const CMap& cmap) {
   1.101 +        Parent::operator=(cmap);
   1.102 +        return *this;
   1.103 +      }
   1.104 +
   1.105      };
   1.106  
   1.107    };
   1.108 @@ -255,6 +292,7 @@
   1.109    class SubGraphAdaptorBase : public GraphAdaptorBase<_Graph> {
   1.110    public:
   1.111      typedef _Graph Graph;
   1.112 +    typedef SubGraphAdaptorBase Adaptor;
   1.113      typedef GraphAdaptorBase<_Graph> Parent;
   1.114    protected:
   1.115      NodeFilterMap* node_filter_map;
   1.116 @@ -377,6 +415,59 @@
   1.117        }
   1.118        return edge;
   1.119      }
   1.120 +
   1.121 +    template <typename _Value>
   1.122 +    class NodeMap 
   1.123 +      : public SubMapExtender<Adaptor, 
   1.124 +                              typename Parent::template NodeMap<_Value> > 
   1.125 +    {
   1.126 +    public:
   1.127 +      typedef Adaptor Graph;
   1.128 +      typedef SubMapExtender<Adaptor, typename Parent::
   1.129 +                             template NodeMap<_Value> > Parent;
   1.130 +    
   1.131 +      NodeMap(const Graph& graph) 
   1.132 +	: Parent(graph) {}
   1.133 +      NodeMap(const Graph& graph, const _Value& value) 
   1.134 +	: Parent(graph, value) {}
   1.135 +    
   1.136 +      NodeMap& operator=(const NodeMap& cmap) {
   1.137 +	return operator=<NodeMap>(cmap);
   1.138 +      }
   1.139 +    
   1.140 +      template <typename CMap>
   1.141 +      NodeMap& operator=(const CMap& cmap) {
   1.142 +        Parent::operator=(cmap);
   1.143 +	return *this;
   1.144 +      }
   1.145 +    };
   1.146 +
   1.147 +    template <typename _Value>
   1.148 +    class EdgeMap 
   1.149 +      : public SubMapExtender<Adaptor, 
   1.150 +                              typename Parent::template EdgeMap<_Value> > 
   1.151 +    {
   1.152 +    public:
   1.153 +      typedef Adaptor Graph;
   1.154 +      typedef SubMapExtender<Adaptor, typename Parent::
   1.155 +                             template EdgeMap<_Value> > Parent;
   1.156 +    
   1.157 +      EdgeMap(const Graph& graph) 
   1.158 +	: Parent(graph) {}
   1.159 +      EdgeMap(const Graph& graph, const _Value& value) 
   1.160 +	: Parent(graph, value) {}
   1.161 +    
   1.162 +      EdgeMap& operator=(const EdgeMap& cmap) {
   1.163 +	return operator=<EdgeMap>(cmap);
   1.164 +      }
   1.165 +    
   1.166 +      template <typename CMap>
   1.167 +      EdgeMap& operator=(const CMap& cmap) {
   1.168 +        Parent::operator=(cmap);
   1.169 +	return *this;
   1.170 +      }
   1.171 +    };
   1.172 +
   1.173    };
   1.174  
   1.175    template <typename _Graph, typename NodeFilterMap, typename EdgeFilterMap>
   1.176 @@ -384,6 +475,7 @@
   1.177      : public GraphAdaptorBase<_Graph> {
   1.178    public:
   1.179      typedef _Graph Graph;
   1.180 +    typedef SubGraphAdaptorBase Adaptor;
   1.181      typedef GraphAdaptorBase<_Graph> Parent;
   1.182    protected:
   1.183      NodeFilterMap* node_filter_map;
   1.184 @@ -496,6 +588,59 @@
   1.185        }
   1.186        return edge;
   1.187      }
   1.188 +
   1.189 +    template <typename _Value>
   1.190 +    class NodeMap 
   1.191 +      : public SubMapExtender<Adaptor, 
   1.192 +                              typename Parent::template NodeMap<_Value> > 
   1.193 +    {
   1.194 +    public:
   1.195 +      typedef Adaptor Graph;
   1.196 +      typedef SubMapExtender<Adaptor, typename Parent::
   1.197 +                             template NodeMap<_Value> > Parent;
   1.198 +    
   1.199 +      NodeMap(const Graph& graph) 
   1.200 +	: Parent(graph) {}
   1.201 +      NodeMap(const Graph& graph, const _Value& value) 
   1.202 +	: Parent(graph, value) {}
   1.203 +    
   1.204 +      NodeMap& operator=(const NodeMap& cmap) {
   1.205 +	return operator=<NodeMap>(cmap);
   1.206 +      }
   1.207 +    
   1.208 +      template <typename CMap>
   1.209 +      NodeMap& operator=(const CMap& cmap) {
   1.210 +        Parent::operator=(cmap);
   1.211 +	return *this;
   1.212 +      }
   1.213 +    };
   1.214 +
   1.215 +    template <typename _Value>
   1.216 +    class EdgeMap 
   1.217 +      : public SubMapExtender<Adaptor, 
   1.218 +                              typename Parent::template EdgeMap<_Value> > 
   1.219 +    {
   1.220 +    public:
   1.221 +      typedef Adaptor Graph;
   1.222 +      typedef SubMapExtender<Adaptor, typename Parent::
   1.223 +                             template EdgeMap<_Value> > Parent;
   1.224 +    
   1.225 +      EdgeMap(const Graph& graph) 
   1.226 +	: Parent(graph) {}
   1.227 +      EdgeMap(const Graph& graph, const _Value& value) 
   1.228 +	: Parent(graph, value) {}
   1.229 +    
   1.230 +      EdgeMap& operator=(const EdgeMap& cmap) {
   1.231 +	return operator=<EdgeMap>(cmap);
   1.232 +      }
   1.233 +    
   1.234 +      template <typename CMap>
   1.235 +      EdgeMap& operator=(const CMap& cmap) {
   1.236 +        Parent::operator=(cmap);
   1.237 +	return *this;
   1.238 +      }
   1.239 +    };
   1.240 +
   1.241    };
   1.242  
   1.243    /// \brief A graph adaptor for hiding nodes and edges from a graph.
   1.244 @@ -566,17 +711,21 @@
   1.245      SubGraphAdaptorBase<_Graph, NodeFilterMap, EdgeFilterMap, checked> > {
   1.246    public:
   1.247      typedef _Graph Graph;
   1.248 -    typedef GraphAdaptorExtender<
   1.249 -      SubGraphAdaptorBase<_Graph, NodeFilterMap, EdgeFilterMap> > Parent;
   1.250 +    typedef GraphAdaptorExtender< SubGraphAdaptorBase<_Graph, NodeFilterMap, 
   1.251 +                                                      EdgeFilterMap, checked> >
   1.252 +    Parent;
   1.253 +
   1.254    protected:
   1.255      SubGraphAdaptor() { }
   1.256    public:
   1.257 +
   1.258      SubGraphAdaptor(_Graph& _graph, NodeFilterMap& _node_filter_map, 
   1.259  		    EdgeFilterMap& _edge_filter_map) { 
   1.260        setGraph(_graph);
   1.261        setNodeFilterMap(_node_filter_map);
   1.262        setEdgeFilterMap(_edge_filter_map);
   1.263      }
   1.264 +
   1.265    };
   1.266  
   1.267    /// \brief Just gives back a sub graph adaptor
   1.268 @@ -635,8 +784,11 @@
   1.269      public SubGraphAdaptor<Graph, NodeFilterMap, 
   1.270  			   ConstMap<typename Graph::Edge,bool>, checked> {
   1.271    public:
   1.272 +
   1.273      typedef SubGraphAdaptor<Graph, NodeFilterMap, 
   1.274 -			    ConstMap<typename Graph::Edge,bool> > Parent;
   1.275 +			    ConstMap<typename Graph::Edge,bool>, checked > 
   1.276 +    Parent;
   1.277 +
   1.278    protected:
   1.279      ConstMap<typename Graph::Edge, bool> const_true_map;
   1.280  
   1.281 @@ -645,12 +797,14 @@
   1.282      }
   1.283  
   1.284    public:
   1.285 +
   1.286      NodeSubGraphAdaptor(Graph& _graph, NodeFilterMap& _node_filter_map) : 
   1.287        Parent(), const_true_map(true) { 
   1.288        Parent::setGraph(_graph);
   1.289        Parent::setNodeFilterMap(_node_filter_map);
   1.290        Parent::setEdgeFilterMap(const_true_map);
   1.291      }
   1.292 +
   1.293    };
   1.294  
   1.295  
   1.296 @@ -820,12 +974,14 @@
   1.297      }
   1.298  
   1.299    public:
   1.300 +
   1.301      EdgeSubGraphAdaptor(Graph& _graph, EdgeFilterMap& _edge_filter_map) : 
   1.302        Parent(), const_true_map(true) { 
   1.303        Parent::setGraph(_graph);
   1.304        Parent::setNodeFilterMap(const_true_map);
   1.305        Parent::setEdgeFilterMap(_edge_filter_map);
   1.306      }
   1.307 +
   1.308    };
   1.309  
   1.310    /// \brief Just gives back an edge sub graph adaptor
   1.311 @@ -848,6 +1004,7 @@
   1.312      public UGraphBaseExtender<GraphAdaptorBase<_Graph> > {
   1.313    public:
   1.314      typedef _Graph Graph;
   1.315 +    typedef UndirGraphAdaptorBase Adaptor;
   1.316      typedef UGraphBaseExtender<GraphAdaptorBase<_Graph> > Parent;
   1.317  
   1.318    protected:
   1.319 @@ -859,9 +1016,10 @@
   1.320      typedef typename Parent::UEdge UEdge;
   1.321      typedef typename Parent::Edge Edge;
   1.322  
   1.323 +  private:
   1.324      
   1.325      template <typename _Value>
   1.326 -    class EdgeMap {
   1.327 +    class EdgeMapBase {
   1.328      private:
   1.329        
   1.330        typedef typename _Graph::template EdgeMap<_Value> MapImpl;
   1.331 @@ -873,11 +1031,11 @@
   1.332        typedef _Value Value;
   1.333        typedef Edge Key;
   1.334        
   1.335 -      EdgeMap(const UndirGraphAdaptorBase<_Graph>& _g) :
   1.336 -	forward_map(*(_g.graph)), backward_map(*(_g.graph)) {}
   1.337 +      EdgeMapBase(const Adaptor& adaptor) :
   1.338 +	forward_map(*adaptor.graph), backward_map(*adaptor.graph) {}
   1.339  
   1.340 -      EdgeMap(const UndirGraphAdaptorBase<_Graph>& _g, const Value& a) 
   1.341 -        : forward_map(*(_g.graph), a), backward_map(*(_g.graph), a) {}
   1.342 +      EdgeMapBase(const Adaptor& adaptor, const Value& v) 
   1.343 +        : forward_map(*adaptor.graph, v), backward_map(*adaptor.graph, v) {}
   1.344        
   1.345        void set(const Edge& e, const Value& a) { 
   1.346  	if (Parent::direction(e)) {
   1.347 @@ -908,19 +1066,55 @@
   1.348        MapImpl forward_map, backward_map; 
   1.349  
   1.350      };
   1.351 +
   1.352 +  public:
   1.353 +
   1.354 +    template <typename _Value>
   1.355 +    class EdgeMap 
   1.356 +      : public SubMapExtender<Adaptor, EdgeMapBase<_Value> > 
   1.357 +    {
   1.358 +    public:
   1.359 +      typedef Adaptor Graph;
   1.360 +      typedef SubMapExtender<Adaptor, EdgeMapBase<_Value> > Parent;
   1.361 +    
   1.362 +      EdgeMap(const Graph& graph) 
   1.363 +	: Parent(graph) {}
   1.364 +      EdgeMap(const Graph& graph, const _Value& value) 
   1.365 +	: Parent(graph, value) {}
   1.366 +    
   1.367 +      EdgeMap& operator=(const EdgeMap& cmap) {
   1.368 +	return operator=<EdgeMap>(cmap);
   1.369 +      }
   1.370 +    
   1.371 +      template <typename CMap>
   1.372 +      EdgeMap& operator=(const CMap& cmap) {
   1.373 +        Parent::operator=(cmap);
   1.374 +	return *this;
   1.375 +      }
   1.376 +    };
   1.377          
   1.378      template <typename _Value>
   1.379 -    class UEdgeMap : public _Graph::template EdgeMap<_Value> {
   1.380 +    class UEdgeMap : public Graph::template EdgeMap<_Value> {
   1.381      public:
   1.382 +      
   1.383 +      typedef typename Graph::template EdgeMap<_Value> Parent;
   1.384 +      
   1.385 +      explicit UEdgeMap(const Adaptor& ga) 
   1.386 +	: Parent(*ga.graph) {}
   1.387  
   1.388 -      typedef typename _Graph::template EdgeMap<_Value> Parent; 
   1.389 +      UEdgeMap(const Adaptor& ga, const _Value& value)
   1.390 +	: Parent(*ga.graph, value) {}
   1.391  
   1.392 -      UEdgeMap(const UndirGraphAdaptorBase<_Graph>& g) 
   1.393 -        : Parent(*(g.graph)) {}
   1.394 +      UEdgeMap& operator=(const UEdgeMap& cmap) {
   1.395 +        return operator=<UEdgeMap>(cmap);
   1.396 +      }
   1.397  
   1.398 -      UEdgeMap(const UndirGraphAdaptorBase<_Graph>& g, const _Value& a) 
   1.399 -        : Parent(*(g.graph), a) {}
   1.400 -      
   1.401 +      template <typename CMap>
   1.402 +      UEdgeMap& operator=(const CMap& cmap) {
   1.403 +        Parent::operator=(cmap);
   1.404 +        return *this;
   1.405 +      }
   1.406 +
   1.407      };
   1.408        
   1.409    };
   1.410 @@ -933,6 +1127,7 @@
   1.411    public:
   1.412  
   1.413      typedef _Graph Graph;
   1.414 +    typedef UndirGraphAdaptorBase Adaptor;
   1.415      typedef UGraphBaseExtender<GraphAdaptorBase<_Graph> > Parent;
   1.416  
   1.417    protected:
   1.418 @@ -1033,11 +1228,10 @@
   1.419      mutable EdgeNotifier edge_notifier;
   1.420      NotifierProxy edge_notifier_proxy;
   1.421  
   1.422 -  public:
   1.423 -    
   1.424 +  private:
   1.425      
   1.426      template <typename _Value>
   1.427 -    class EdgeMap {
   1.428 +    class EdgeMapBase {
   1.429      private:
   1.430        
   1.431        typedef typename _Graph::template EdgeMap<_Value> MapImpl;
   1.432 @@ -1049,11 +1243,11 @@
   1.433        typedef _Value Value;
   1.434        typedef Edge Key;
   1.435        
   1.436 -      EdgeMap(const UndirGraphAdaptorBase<_Graph>& _g) :
   1.437 -	forward_map(*(_g.graph)), backward_map(*(_g.graph)) {}
   1.438 +      EdgeMapBase(const Adaptor& adaptor) :
   1.439 +	forward_map(*adaptor.graph), backward_map(*adaptor.graph) {}
   1.440  
   1.441 -      EdgeMap(const UndirGraphAdaptorBase<_Graph>& _g, const Value& a) 
   1.442 -        : forward_map(*(_g.graph), a), backward_map(*(_g.graph), a) {}
   1.443 +      EdgeMapBase(const Adaptor& adaptor, const Value& v) 
   1.444 +        : forward_map(*adaptor.graph, v), backward_map(*adaptor.graph, v) {}
   1.445        
   1.446        void set(const Edge& e, const Value& a) { 
   1.447  	if (Parent::direction(e)) {
   1.448 @@ -1063,8 +1257,7 @@
   1.449          } 
   1.450        }
   1.451  
   1.452 -      typename MapTraits<MapImpl>::ConstReturnValue 
   1.453 -      operator[](const Edge& e) const { 
   1.454 +      typename MapTraits<MapImpl>::ConstReturnValue operator[](Edge e) const { 
   1.455  	if (Parent::direction(e)) {
   1.456  	  return forward_map[e]; 
   1.457  	} else { 
   1.458 @@ -1072,8 +1265,7 @@
   1.459          }
   1.460        }
   1.461  
   1.462 -      typename MapTraits<MapImpl>::ReturnValue 
   1.463 -      operator[](const Edge& e) { 
   1.464 +      typename MapTraits<MapImpl>::ReturnValue operator[](Edge e) { 
   1.465  	if (Parent::direction(e)) {
   1.466  	  return forward_map[e]; 
   1.467  	} else { 
   1.468 @@ -1086,19 +1278,55 @@
   1.469        MapImpl forward_map, backward_map; 
   1.470  
   1.471      };
   1.472 +
   1.473 +  public:
   1.474 +
   1.475 +    template <typename _Value>
   1.476 +    class EdgeMap 
   1.477 +      : public SubMapExtender<Adaptor, EdgeMapBase<_Value> > 
   1.478 +    {
   1.479 +    public:
   1.480 +      typedef Adaptor Graph;
   1.481 +      typedef SubMapExtender<Adaptor, EdgeMapBase<_Value> > Parent;
   1.482 +    
   1.483 +      EdgeMap(const Graph& graph) 
   1.484 +	: Parent(graph) {}
   1.485 +      EdgeMap(const Graph& graph, const _Value& value) 
   1.486 +	: Parent(graph, value) {}
   1.487 +    
   1.488 +      EdgeMap& operator=(const EdgeMap& cmap) {
   1.489 +	return operator=<EdgeMap>(cmap);
   1.490 +      }
   1.491 +    
   1.492 +      template <typename CMap>
   1.493 +      EdgeMap& operator=(const CMap& cmap) {
   1.494 +        Parent::operator=(cmap);
   1.495 +	return *this;
   1.496 +      }
   1.497 +    };
   1.498          
   1.499      template <typename _Value>
   1.500 -    class UEdgeMap : public _Graph::template EdgeMap<_Value> {
   1.501 +    class UEdgeMap : public Graph::template EdgeMap<_Value> {
   1.502      public:
   1.503 +      
   1.504 +      typedef typename Graph::template EdgeMap<_Value> Parent;
   1.505 +      
   1.506 +      explicit UEdgeMap(const Adaptor& ga) 
   1.507 +	: Parent(*ga.graph) {}
   1.508  
   1.509 -      typedef typename _Graph::template EdgeMap<_Value> Parent; 
   1.510 +      UEdgeMap(const Adaptor& ga, const _Value& value)
   1.511 +	: Parent(*ga.graph, value) {}
   1.512  
   1.513 -      UEdgeMap(const UndirGraphAdaptorBase<_Graph>& g) 
   1.514 -        : Parent(*(g.graph)) {}
   1.515 +      UEdgeMap& operator=(const UEdgeMap& cmap) {
   1.516 +        return operator=<UEdgeMap>(cmap);
   1.517 +      }
   1.518  
   1.519 -      UEdgeMap(const UndirGraphAdaptorBase<_Graph>& g, const _Value& a) 
   1.520 -        : Parent(*(g.graph), a) {}
   1.521 -      
   1.522 +      template <typename CMap>
   1.523 +      UEdgeMap& operator=(const CMap& cmap) {
   1.524 +        Parent::operator=(cmap);
   1.525 +        return *this;
   1.526 +      }
   1.527 +
   1.528      };
   1.529        
   1.530    };