lemon/adaptors.h
changeset 488 9b9ffe7d9b75
parent 464 acfb0f24d178
child 495 dab9e610e37d
equal deleted inserted replaced
12:3a8698450852 13:36cf7a5067aa
    34 
    34 
    35 #include <algorithm>
    35 #include <algorithm>
    36 
    36 
    37 namespace lemon {
    37 namespace lemon {
    38 
    38 
    39   template<typename _Digraph>
    39 #ifdef _MSC_VER
       
    40 #define LEMON_SCOPE_FIX(OUTER, NESTED) OUTER::NESTED
       
    41 #else
       
    42 #define LEMON_SCOPE_FIX(OUTER, NESTED) typename OUTER::template NESTED
       
    43 #endif
       
    44 
       
    45   template<typename DGR>
    40   class DigraphAdaptorBase {
    46   class DigraphAdaptorBase {
    41   public:
    47   public:
    42     typedef _Digraph Digraph;
    48     typedef DGR Digraph;
    43     typedef DigraphAdaptorBase Adaptor;
    49     typedef DigraphAdaptorBase Adaptor;
    44     typedef Digraph ParentDigraph;
       
    45 
    50 
    46   protected:
    51   protected:
    47     Digraph* _digraph;
    52     DGR* _digraph;
    48     DigraphAdaptorBase() : _digraph(0) { }
    53     DigraphAdaptorBase() : _digraph(0) { }
    49     void setDigraph(Digraph& digraph) { _digraph = &digraph; }
    54     void initialize(DGR& digraph) { _digraph = &digraph; }
    50 
    55 
    51   public:
    56   public:
    52     DigraphAdaptorBase(Digraph& digraph) : _digraph(&digraph) { }
    57     DigraphAdaptorBase(DGR& digraph) : _digraph(&digraph) { }
    53 
    58 
    54     typedef typename Digraph::Node Node;
    59     typedef typename DGR::Node Node;
    55     typedef typename Digraph::Arc Arc;
    60     typedef typename DGR::Arc Arc;
    56 
    61 
    57     void first(Node& i) const { _digraph->first(i); }
    62     void first(Node& i) const { _digraph->first(i); }
    58     void first(Arc& i) const { _digraph->first(i); }
    63     void first(Arc& i) const { _digraph->first(i); }
    59     void firstIn(Arc& i, const Node& n) const { _digraph->firstIn(i, n); }
    64     void firstIn(Arc& i, const Node& n) const { _digraph->firstIn(i, n); }
    60     void firstOut(Arc& i, const Node& n ) const { _digraph->firstOut(i, n); }
    65     void firstOut(Arc& i, const Node& n ) const { _digraph->firstOut(i, n); }
    65     void nextOut(Arc& i) const { _digraph->nextOut(i); }
    70     void nextOut(Arc& i) const { _digraph->nextOut(i); }
    66 
    71 
    67     Node source(const Arc& a) const { return _digraph->source(a); }
    72     Node source(const Arc& a) const { return _digraph->source(a); }
    68     Node target(const Arc& a) const { return _digraph->target(a); }
    73     Node target(const Arc& a) const { return _digraph->target(a); }
    69 
    74 
    70     typedef NodeNumTagIndicator<Digraph> NodeNumTag;
    75     typedef NodeNumTagIndicator<DGR> NodeNumTag;
    71     int nodeNum() const { return _digraph->nodeNum(); }
    76     int nodeNum() const { return _digraph->nodeNum(); }
    72 
    77 
    73     typedef ArcNumTagIndicator<Digraph> ArcNumTag;
    78     typedef ArcNumTagIndicator<DGR> ArcNumTag;
    74     int arcNum() const { return _digraph->arcNum(); }
    79     int arcNum() const { return _digraph->arcNum(); }
    75 
    80 
    76     typedef FindArcTagIndicator<Digraph> FindArcTag;
    81     typedef FindArcTagIndicator<DGR> FindArcTag;
    77     Arc findArc(const Node& u, const Node& v, const Arc& prev = INVALID) const {
    82     Arc findArc(const Node& u, const Node& v, const Arc& prev = INVALID) const {
    78       return _digraph->findArc(u, v, prev);
    83       return _digraph->findArc(u, v, prev);
    79     }
    84     }
    80 
    85 
    81     Node addNode() { return _digraph->addNode(); }
    86     Node addNode() { return _digraph->addNode(); }
    93     Arc arcFromId(int ix) const { return _digraph->arcFromId(ix); }
    98     Arc arcFromId(int ix) const { return _digraph->arcFromId(ix); }
    94 
    99 
    95     int maxNodeId() const { return _digraph->maxNodeId(); }
   100     int maxNodeId() const { return _digraph->maxNodeId(); }
    96     int maxArcId() const { return _digraph->maxArcId(); }
   101     int maxArcId() const { return _digraph->maxArcId(); }
    97 
   102 
    98     typedef typename ItemSetTraits<Digraph, Node>::ItemNotifier NodeNotifier;
   103     typedef typename ItemSetTraits<DGR, Node>::ItemNotifier NodeNotifier;
    99     NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
   104     NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
   100 
   105 
   101     typedef typename ItemSetTraits<Digraph, Arc>::ItemNotifier ArcNotifier;
   106     typedef typename ItemSetTraits<DGR, Arc>::ItemNotifier ArcNotifier;
   102     ArcNotifier& notifier(Arc) const { return _digraph->notifier(Arc()); }
   107     ArcNotifier& notifier(Arc) const { return _digraph->notifier(Arc()); }
   103 
   108 
   104     template <typename _Value>
   109     template <typename V>
   105     class NodeMap : public Digraph::template NodeMap<_Value> {
   110     class NodeMap : public DGR::template NodeMap<V> {
   106     public:
   111     public:
   107 
   112 
   108       typedef typename Digraph::template NodeMap<_Value> Parent;
   113       typedef typename DGR::template NodeMap<V> Parent;
   109 
   114 
   110       explicit NodeMap(const Adaptor& adaptor)
   115       explicit NodeMap(const Adaptor& adaptor)
   111         : Parent(*adaptor._digraph) {}
   116         : Parent(*adaptor._digraph) {}
   112 
   117 
   113       NodeMap(const Adaptor& adaptor, const _Value& value)
   118       NodeMap(const Adaptor& adaptor, const V& value)
   114         : Parent(*adaptor._digraph, value) { }
   119         : Parent(*adaptor._digraph, value) { }
   115 
   120 
   116     private:
   121     private:
   117       NodeMap& operator=(const NodeMap& cmap) {
   122       NodeMap& operator=(const NodeMap& cmap) {
   118         return operator=<NodeMap>(cmap);
   123         return operator=<NodeMap>(cmap);
   124         return *this;
   129         return *this;
   125       }
   130       }
   126 
   131 
   127     };
   132     };
   128 
   133 
   129     template <typename _Value>
   134     template <typename V>
   130     class ArcMap : public Digraph::template ArcMap<_Value> {
   135     class ArcMap : public DGR::template ArcMap<V> {
   131     public:
   136     public:
   132 
   137 
   133       typedef typename Digraph::template ArcMap<_Value> Parent;
   138       typedef typename DGR::template ArcMap<V> Parent;
   134 
   139 
   135       explicit ArcMap(const Adaptor& adaptor)
   140       explicit ArcMap(const DigraphAdaptorBase<DGR>& adaptor)
   136         : Parent(*adaptor._digraph) {}
   141         : Parent(*adaptor._digraph) {}
   137 
   142 
   138       ArcMap(const Adaptor& adaptor, const _Value& value)
   143       ArcMap(const DigraphAdaptorBase<DGR>& adaptor, const V& value)
   139         : Parent(*adaptor._digraph, value) {}
   144         : Parent(*adaptor._digraph, value) {}
   140 
   145 
   141     private:
   146     private:
   142       ArcMap& operator=(const ArcMap& cmap) {
   147       ArcMap& operator=(const ArcMap& cmap) {
   143         return operator=<ArcMap>(cmap);
   148         return operator=<ArcMap>(cmap);
   151 
   156 
   152     };
   157     };
   153 
   158 
   154   };
   159   };
   155 
   160 
   156   template<typename _Graph>
   161   template<typename GR>
   157   class GraphAdaptorBase {
   162   class GraphAdaptorBase {
   158   public:
   163   public:
   159     typedef _Graph Graph;
   164     typedef GR Graph;
   160     typedef Graph ParentGraph;
       
   161 
   165 
   162   protected:
   166   protected:
   163     Graph* _graph;
   167     GR* _graph;
   164 
   168 
   165     GraphAdaptorBase() : _graph(0) {}
   169     GraphAdaptorBase() : _graph(0) {}
   166 
   170 
   167     void setGraph(Graph& graph) { _graph = &graph; }
   171     void initialize(GR& graph) { _graph = &graph; }
   168 
   172 
   169   public:
   173   public:
   170     GraphAdaptorBase(Graph& graph) : _graph(&graph) {}
   174     GraphAdaptorBase(GR& graph) : _graph(&graph) {}
   171 
   175 
   172     typedef typename Graph::Node Node;
   176     typedef typename GR::Node Node;
   173     typedef typename Graph::Arc Arc;
   177     typedef typename GR::Arc Arc;
   174     typedef typename Graph::Edge Edge;
   178     typedef typename GR::Edge Edge;
   175 
   179 
   176     void first(Node& i) const { _graph->first(i); }
   180     void first(Node& i) const { _graph->first(i); }
   177     void first(Arc& i) const { _graph->first(i); }
   181     void first(Arc& i) const { _graph->first(i); }
   178     void first(Edge& i) const { _graph->first(i); }
   182     void first(Edge& i) const { _graph->first(i); }
   179     void firstIn(Arc& i, const Node& n) const { _graph->firstIn(i, n); }
   183     void firstIn(Arc& i, const Node& n) const { _graph->firstIn(i, n); }
   237 
   241 
   238     int maxNodeId() const { return _graph->maxNodeId(); }
   242     int maxNodeId() const { return _graph->maxNodeId(); }
   239     int maxArcId() const { return _graph->maxArcId(); }
   243     int maxArcId() const { return _graph->maxArcId(); }
   240     int maxEdgeId() const { return _graph->maxEdgeId(); }
   244     int maxEdgeId() const { return _graph->maxEdgeId(); }
   241 
   245 
   242     typedef typename ItemSetTraits<Graph, Node>::ItemNotifier NodeNotifier;
   246     typedef typename ItemSetTraits<GR, Node>::ItemNotifier NodeNotifier;
   243     NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); }
   247     NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); }
   244 
   248 
   245     typedef typename ItemSetTraits<Graph, Arc>::ItemNotifier ArcNotifier;
   249     typedef typename ItemSetTraits<GR, Arc>::ItemNotifier ArcNotifier;
   246     ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); }
   250     ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); }
   247 
   251 
   248     typedef typename ItemSetTraits<Graph, Edge>::ItemNotifier EdgeNotifier;
   252     typedef typename ItemSetTraits<GR, Edge>::ItemNotifier EdgeNotifier;
   249     EdgeNotifier& notifier(Edge) const { return _graph->notifier(Edge()); }
   253     EdgeNotifier& notifier(Edge) const { return _graph->notifier(Edge()); }
   250 
   254 
   251     template <typename _Value>
   255     template <typename V>
   252     class NodeMap : public Graph::template NodeMap<_Value> {
   256     class NodeMap : public GR::template NodeMap<V> {
   253     public:
   257     public:
   254       typedef typename Graph::template NodeMap<_Value> Parent;
   258       typedef typename GR::template NodeMap<V> Parent;
   255       explicit NodeMap(const GraphAdaptorBase<Graph>& adapter)
   259       explicit NodeMap(const GraphAdaptorBase<GR>& adapter)
   256         : Parent(*adapter._graph) {}
   260         : Parent(*adapter._graph) {}
   257       NodeMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value)
   261       NodeMap(const GraphAdaptorBase<GR>& adapter, const V& value)
   258         : Parent(*adapter._graph, value) {}
   262         : Parent(*adapter._graph, value) {}
   259 
   263 
   260     private:
   264     private:
   261       NodeMap& operator=(const NodeMap& cmap) {
   265       NodeMap& operator=(const NodeMap& cmap) {
   262         return operator=<NodeMap>(cmap);
   266         return operator=<NodeMap>(cmap);
   268         return *this;
   272         return *this;
   269       }
   273       }
   270 
   274 
   271     };
   275     };
   272 
   276 
   273     template <typename _Value>
   277     template <typename V>
   274     class ArcMap : public Graph::template ArcMap<_Value> {
   278     class ArcMap : public GR::template ArcMap<V> {
   275     public:
   279     public:
   276       typedef typename Graph::template ArcMap<_Value> Parent;
   280       typedef typename GR::template ArcMap<V> Parent;
   277       explicit ArcMap(const GraphAdaptorBase<Graph>& adapter)
   281       explicit ArcMap(const GraphAdaptorBase<GR>& adapter)
   278         : Parent(*adapter._graph) {}
   282         : Parent(*adapter._graph) {}
   279       ArcMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value)
   283       ArcMap(const GraphAdaptorBase<GR>& adapter, const V& value)
   280         : Parent(*adapter._graph, value) {}
   284         : Parent(*adapter._graph, value) {}
   281 
   285 
   282     private:
   286     private:
   283       ArcMap& operator=(const ArcMap& cmap) {
   287       ArcMap& operator=(const ArcMap& cmap) {
   284         return operator=<ArcMap>(cmap);
   288         return operator=<ArcMap>(cmap);
   289         Parent::operator=(cmap);
   293         Parent::operator=(cmap);
   290         return *this;
   294         return *this;
   291       }
   295       }
   292     };
   296     };
   293 
   297 
   294     template <typename _Value>
   298     template <typename V>
   295     class EdgeMap : public Graph::template EdgeMap<_Value> {
   299     class EdgeMap : public GR::template EdgeMap<V> {
   296     public:
   300     public:
   297       typedef typename Graph::template EdgeMap<_Value> Parent;
   301       typedef typename GR::template EdgeMap<V> Parent;
   298       explicit EdgeMap(const GraphAdaptorBase<Graph>& adapter)
   302       explicit EdgeMap(const GraphAdaptorBase<GR>& adapter)
   299         : Parent(*adapter._graph) {}
   303         : Parent(*adapter._graph) {}
   300       EdgeMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value)
   304       EdgeMap(const GraphAdaptorBase<GR>& adapter, const V& value)
   301         : Parent(*adapter._graph, value) {}
   305         : Parent(*adapter._graph, value) {}
   302 
   306 
   303     private:
   307     private:
   304       EdgeMap& operator=(const EdgeMap& cmap) {
   308       EdgeMap& operator=(const EdgeMap& cmap) {
   305         return operator=<EdgeMap>(cmap);
   309         return operator=<EdgeMap>(cmap);
   312       }
   316       }
   313     };
   317     };
   314 
   318 
   315   };
   319   };
   316 
   320 
   317   template <typename _Digraph>
   321   template <typename DGR>
   318   class ReverseDigraphBase : public DigraphAdaptorBase<_Digraph> {
   322   class ReverseDigraphBase : public DigraphAdaptorBase<DGR> {
   319   public:
   323   public:
   320     typedef _Digraph Digraph;
   324     typedef DGR Digraph;
   321     typedef DigraphAdaptorBase<_Digraph> Parent;
   325     typedef DigraphAdaptorBase<DGR> Parent;
   322   protected:
   326   protected:
   323     ReverseDigraphBase() : Parent() { }
   327     ReverseDigraphBase() : Parent() { }
   324   public:
   328   public:
   325     typedef typename Parent::Node Node;
   329     typedef typename Parent::Node Node;
   326     typedef typename Parent::Arc Arc;
   330     typedef typename Parent::Arc Arc;
   334     Node source(const Arc& a) const { return Parent::target(a); }
   338     Node source(const Arc& a) const { return Parent::target(a); }
   335     Node target(const Arc& a) const { return Parent::source(a); }
   339     Node target(const Arc& a) const { return Parent::source(a); }
   336 
   340 
   337     Arc addArc(const Node& u, const Node& v) { return Parent::addArc(v, u); }
   341     Arc addArc(const Node& u, const Node& v) { return Parent::addArc(v, u); }
   338 
   342 
   339     typedef FindArcTagIndicator<Digraph> FindArcTag;
   343     typedef FindArcTagIndicator<DGR> FindArcTag;
   340     Arc findArc(const Node& u, const Node& v,
   344     Arc findArc(const Node& u, const Node& v,
   341                 const Arc& prev = INVALID) const {
   345                 const Arc& prev = INVALID) const {
   342       return Parent::findArc(v, u, prev);
   346       return Parent::findArc(v, u, prev);
   343     }
   347     }
   344 
   348 
   354   ///
   358   ///
   355   /// The adapted digraph can also be modified through this adaptor
   359   /// The adapted digraph can also be modified through this adaptor
   356   /// by adding or removing nodes or arcs, unless the \c GR template
   360   /// by adding or removing nodes or arcs, unless the \c GR template
   357   /// parameter is set to be \c const.
   361   /// parameter is set to be \c const.
   358   ///
   362   ///
   359   /// \tparam GR The type of the adapted digraph.
   363   /// \tparam DGR The type of the adapted digraph.
   360   /// It must conform to the \ref concepts::Digraph "Digraph" concept.
   364   /// It must conform to the \ref concepts::Digraph "Digraph" concept.
   361   /// It can also be specified to be \c const.
   365   /// It can also be specified to be \c const.
   362   ///
   366   ///
   363   /// \note The \c Node and \c Arc types of this adaptor and the adapted
   367   /// \note The \c Node and \c Arc types of this adaptor and the adapted
   364   /// digraph are convertible to each other.
   368   /// digraph are convertible to each other.
   365   template<typename GR>
   369   template<typename DGR>
   366 #ifdef DOXYGEN
   370 #ifdef DOXYGEN
   367   class ReverseDigraph {
   371   class ReverseDigraph {
   368 #else
   372 #else
   369   class ReverseDigraph :
   373   class ReverseDigraph :
   370     public DigraphAdaptorExtender<ReverseDigraphBase<GR> > {
   374     public DigraphAdaptorExtender<ReverseDigraphBase<DGR> > {
   371 #endif
   375 #endif
   372   public:
   376   public:
   373     /// The type of the adapted digraph.
   377     /// The type of the adapted digraph.
   374     typedef GR Digraph;
   378     typedef DGR Digraph;
   375     typedef DigraphAdaptorExtender<ReverseDigraphBase<GR> > Parent;
   379     typedef DigraphAdaptorExtender<ReverseDigraphBase<DGR> > Parent;
   376   protected:
   380   protected:
   377     ReverseDigraph() { }
   381     ReverseDigraph() { }
   378   public:
   382   public:
   379 
   383 
   380     /// \brief Constructor
   384     /// \brief Constructor
   381     ///
   385     ///
   382     /// Creates a reverse digraph adaptor for the given digraph.
   386     /// Creates a reverse digraph adaptor for the given digraph.
   383     explicit ReverseDigraph(Digraph& digraph) {
   387     explicit ReverseDigraph(DGR& digraph) {
   384       Parent::setDigraph(digraph);
   388       Parent::initialize(digraph);
   385     }
   389     }
   386   };
   390   };
   387 
   391 
   388   /// \brief Returns a read-only ReverseDigraph adaptor
   392   /// \brief Returns a read-only ReverseDigraph adaptor
   389   ///
   393   ///
   390   /// This function just returns a read-only \ref ReverseDigraph adaptor.
   394   /// This function just returns a read-only \ref ReverseDigraph adaptor.
   391   /// \ingroup graph_adaptors
   395   /// \ingroup graph_adaptors
   392   /// \relates ReverseDigraph
   396   /// \relates ReverseDigraph
   393   template<typename GR>
   397   template<typename DGR>
   394   ReverseDigraph<const GR> reverseDigraph(const GR& digraph) {
   398   ReverseDigraph<const DGR> reverseDigraph(const DGR& digraph) {
   395     return ReverseDigraph<const GR>(digraph);
   399     return ReverseDigraph<const DGR>(digraph);
   396   }
   400   }
   397 
   401 
   398 
   402 
   399   template <typename _Digraph, typename _NodeFilterMap,
   403   template <typename DGR, typename NF, typename AF, bool ch = true>
   400             typename _ArcFilterMap, bool _checked = true>
   404   class SubDigraphBase : public DigraphAdaptorBase<DGR> {
   401   class SubDigraphBase : public DigraphAdaptorBase<_Digraph> {
   405   public:
   402   public:
   406     typedef DGR Digraph;
   403     typedef _Digraph Digraph;
   407     typedef NF NodeFilterMap;
   404     typedef _NodeFilterMap NodeFilterMap;
   408     typedef AF ArcFilterMap;
   405     typedef _ArcFilterMap ArcFilterMap;
       
   406 
   409 
   407     typedef SubDigraphBase Adaptor;
   410     typedef SubDigraphBase Adaptor;
   408     typedef DigraphAdaptorBase<_Digraph> Parent;
   411     typedef DigraphAdaptorBase<DGR> Parent;
   409   protected:
   412   protected:
   410     NodeFilterMap* _node_filter;
   413     NF* _node_filter;
   411     ArcFilterMap* _arc_filter;
   414     AF* _arc_filter;
   412     SubDigraphBase()
   415     SubDigraphBase()
   413       : Parent(), _node_filter(0), _arc_filter(0) { }
   416       : Parent(), _node_filter(0), _arc_filter(0) { }
   414 
   417 
   415     void setNodeFilterMap(NodeFilterMap& node_filter) {
   418     void initialize(DGR& digraph, NF& node_filter, AF& arc_filter) {
       
   419       Parent::initialize(digraph);
   416       _node_filter = &node_filter;
   420       _node_filter = &node_filter;
   417     }
   421       _arc_filter = &arc_filter;      
   418     void setArcFilterMap(ArcFilterMap& arc_filter) {
       
   419       _arc_filter = &arc_filter;
       
   420     }
   422     }
   421 
   423 
   422   public:
   424   public:
   423 
   425 
   424     typedef typename Parent::Node Node;
   426     typedef typename Parent::Node Node;
   485     bool status(const Arc& a) const { return (*_arc_filter)[a]; }
   487     bool status(const Arc& a) const { return (*_arc_filter)[a]; }
   486 
   488 
   487     typedef False NodeNumTag;
   489     typedef False NodeNumTag;
   488     typedef False ArcNumTag;
   490     typedef False ArcNumTag;
   489 
   491 
   490     typedef FindArcTagIndicator<Digraph> FindArcTag;
   492     typedef FindArcTagIndicator<DGR> FindArcTag;
   491     Arc findArc(const Node& source, const Node& target,
   493     Arc findArc(const Node& source, const Node& target,
   492                 const Arc& prev = INVALID) const {
   494                 const Arc& prev = INVALID) const {
   493       if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
   495       if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
   494         return INVALID;
   496         return INVALID;
   495       }
   497       }
   498         arc = Parent::findArc(source, target, arc);
   500         arc = Parent::findArc(source, target, arc);
   499       }
   501       }
   500       return arc;
   502       return arc;
   501     }
   503     }
   502 
   504 
   503     template <typename _Value>
   505   public:
   504     class NodeMap : public SubMapExtender<Adaptor,
   506 
   505       typename Parent::template NodeMap<_Value> > {
   507     template <typename V>
       
   508     class NodeMap 
       
   509       : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>, 
       
   510 	      LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
   506     public:
   511     public:
   507       typedef _Value Value;
   512       typedef V Value;
   508       typedef SubMapExtender<Adaptor, typename Parent::
   513       typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
   509                              template NodeMap<Value> > MapParent;
   514 	    LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
   510 
   515 
   511       NodeMap(const Adaptor& adaptor)
   516       NodeMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor)
   512         : MapParent(adaptor) {}
   517         : Parent(adaptor) {}
   513       NodeMap(const Adaptor& adaptor, const Value& value)
   518       NodeMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor, const V& value)
   514         : MapParent(adaptor, value) {}
   519         : Parent(adaptor, value) {}
   515 
   520 
   516     private:
   521     private:
   517       NodeMap& operator=(const NodeMap& cmap) {
   522       NodeMap& operator=(const NodeMap& cmap) {
   518         return operator=<NodeMap>(cmap);
   523         return operator=<NodeMap>(cmap);
   519       }
   524       }
   520 
   525 
   521       template <typename CMap>
   526       template <typename CMap>
   522       NodeMap& operator=(const CMap& cmap) {
   527       NodeMap& operator=(const CMap& cmap) {
   523         MapParent::operator=(cmap);
   528         Parent::operator=(cmap);
   524         return *this;
   529         return *this;
   525       }
   530       }
   526     };
   531     };
   527 
   532 
   528     template <typename _Value>
   533     template <typename V>
   529     class ArcMap : public SubMapExtender<Adaptor,
   534     class ArcMap 
   530       typename Parent::template ArcMap<_Value> > {
   535       : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
       
   536 	      LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
   531     public:
   537     public:
   532       typedef _Value Value;
   538       typedef V Value;
   533       typedef SubMapExtender<Adaptor, typename Parent::
   539       typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
   534                              template ArcMap<Value> > MapParent;
   540         LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> Parent;
   535 
   541 
   536       ArcMap(const Adaptor& adaptor)
   542       ArcMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor)
   537         : MapParent(adaptor) {}
   543         : Parent(adaptor) {}
   538       ArcMap(const Adaptor& adaptor, const Value& value)
   544       ArcMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor, const V& value)
   539         : MapParent(adaptor, value) {}
   545         : Parent(adaptor, value) {}
   540 
   546 
   541     private:
   547     private:
   542       ArcMap& operator=(const ArcMap& cmap) {
   548       ArcMap& operator=(const ArcMap& cmap) {
   543         return operator=<ArcMap>(cmap);
   549         return operator=<ArcMap>(cmap);
   544       }
   550       }
   545 
   551 
   546       template <typename CMap>
   552       template <typename CMap>
   547       ArcMap& operator=(const CMap& cmap) {
   553       ArcMap& operator=(const CMap& cmap) {
   548         MapParent::operator=(cmap);
   554         Parent::operator=(cmap);
   549         return *this;
   555         return *this;
   550       }
   556       }
   551     };
   557     };
   552 
   558 
   553   };
   559   };
   554 
   560 
   555   template <typename _Digraph, typename _NodeFilterMap, typename _ArcFilterMap>
   561   template <typename DGR, typename NF, typename AF>
   556   class SubDigraphBase<_Digraph, _NodeFilterMap, _ArcFilterMap, false>
   562   class SubDigraphBase<DGR, NF, AF, false>
   557     : public DigraphAdaptorBase<_Digraph> {
   563     : public DigraphAdaptorBase<DGR> {
   558   public:
   564   public:
   559     typedef _Digraph Digraph;
   565     typedef DGR Digraph;
   560     typedef _NodeFilterMap NodeFilterMap;
   566     typedef NF NodeFilterMap;
   561     typedef _ArcFilterMap ArcFilterMap;
   567     typedef AF ArcFilterMap;
   562 
   568 
   563     typedef SubDigraphBase Adaptor;
   569     typedef SubDigraphBase Adaptor;
   564     typedef DigraphAdaptorBase<Digraph> Parent;
   570     typedef DigraphAdaptorBase<Digraph> Parent;
   565   protected:
   571   protected:
   566     NodeFilterMap* _node_filter;
   572     NF* _node_filter;
   567     ArcFilterMap* _arc_filter;
   573     AF* _arc_filter;
   568     SubDigraphBase()
   574     SubDigraphBase()
   569       : Parent(), _node_filter(0), _arc_filter(0) { }
   575       : Parent(), _node_filter(0), _arc_filter(0) { }
   570 
   576 
   571     void setNodeFilterMap(NodeFilterMap& node_filter) {
   577     void initialize(DGR& digraph, NF& node_filter, AF& arc_filter) {
       
   578       Parent::initialize(digraph);
   572       _node_filter = &node_filter;
   579       _node_filter = &node_filter;
   573     }
   580       _arc_filter = &arc_filter;      
   574     void setArcFilterMap(ArcFilterMap& arc_filter) {
       
   575       _arc_filter = &arc_filter;
       
   576     }
   581     }
   577 
   582 
   578   public:
   583   public:
   579 
   584 
   580     typedef typename Parent::Node Node;
   585     typedef typename Parent::Node Node;
   625     bool status(const Arc& a) const { return (*_arc_filter)[a]; }
   630     bool status(const Arc& a) const { return (*_arc_filter)[a]; }
   626 
   631 
   627     typedef False NodeNumTag;
   632     typedef False NodeNumTag;
   628     typedef False ArcNumTag;
   633     typedef False ArcNumTag;
   629 
   634 
   630     typedef FindArcTagIndicator<Digraph> FindArcTag;
   635     typedef FindArcTagIndicator<DGR> FindArcTag;
   631     Arc findArc(const Node& source, const Node& target,
   636     Arc findArc(const Node& source, const Node& target,
   632                 const Arc& prev = INVALID) const {
   637                 const Arc& prev = INVALID) const {
   633       if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
   638       if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
   634         return INVALID;
   639         return INVALID;
   635       }
   640       }
   638         arc = Parent::findArc(source, target, arc);
   643         arc = Parent::findArc(source, target, arc);
   639       }
   644       }
   640       return arc;
   645       return arc;
   641     }
   646     }
   642 
   647 
   643     template <typename _Value>
   648     template <typename V>
   644     class NodeMap : public SubMapExtender<Adaptor,
   649     class NodeMap 
   645       typename Parent::template NodeMap<_Value> > {
   650       : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
       
   651           LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
   646     public:
   652     public:
   647       typedef _Value Value;
   653       typedef V Value;
   648       typedef SubMapExtender<Adaptor, typename Parent::
   654       typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>, 
   649                              template NodeMap<Value> > MapParent;
   655         LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
   650 
   656 
   651       NodeMap(const Adaptor& adaptor)
   657       NodeMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor)
   652         : MapParent(adaptor) {}
   658         : Parent(adaptor) {}
   653       NodeMap(const Adaptor& adaptor, const Value& value)
   659       NodeMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor, const V& value)
   654         : MapParent(adaptor, value) {}
   660         : Parent(adaptor, value) {}
   655 
   661 
   656     private:
   662     private:
   657       NodeMap& operator=(const NodeMap& cmap) {
   663       NodeMap& operator=(const NodeMap& cmap) {
   658         return operator=<NodeMap>(cmap);
   664         return operator=<NodeMap>(cmap);
   659       }
   665       }
   660 
   666 
   661       template <typename CMap>
   667       template <typename CMap>
   662       NodeMap& operator=(const CMap& cmap) {
   668       NodeMap& operator=(const CMap& cmap) {
   663         MapParent::operator=(cmap);
   669         Parent::operator=(cmap);
   664         return *this;
   670         return *this;
   665       }
   671       }
   666     };
   672     };
   667 
   673 
   668     template <typename _Value>
   674     template <typename V>
   669     class ArcMap : public SubMapExtender<Adaptor,
   675     class ArcMap 
   670       typename Parent::template ArcMap<_Value> > {
   676       : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
       
   677           LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
   671     public:
   678     public:
   672       typedef _Value Value;
   679       typedef V Value;
   673       typedef SubMapExtender<Adaptor, typename Parent::
   680       typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
   674                              template ArcMap<Value> > MapParent;
   681           LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> Parent;
   675 
   682 
   676       ArcMap(const Adaptor& adaptor)
   683       ArcMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor)
   677         : MapParent(adaptor) {}
   684         : Parent(adaptor) {}
   678       ArcMap(const Adaptor& adaptor, const Value& value)
   685       ArcMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor, const V& value)
   679         : MapParent(adaptor, value) {}
   686         : Parent(adaptor, value) {}
   680 
   687 
   681     private:
   688     private:
   682       ArcMap& operator=(const ArcMap& cmap) {
   689       ArcMap& operator=(const ArcMap& cmap) {
   683         return operator=<ArcMap>(cmap);
   690         return operator=<ArcMap>(cmap);
   684       }
   691       }
   685 
   692 
   686       template <typename CMap>
   693       template <typename CMap>
   687       ArcMap& operator=(const CMap& cmap) {
   694       ArcMap& operator=(const CMap& cmap) {
   688         MapParent::operator=(cmap);
   695         Parent::operator=(cmap);
   689         return *this;
   696         return *this;
   690       }
   697       }
   691     };
   698     };
   692 
   699 
   693   };
   700   };
   706   ///
   713   ///
   707   /// The adapted digraph can also be modified through this adaptor
   714   /// The adapted digraph can also be modified through this adaptor
   708   /// by adding or removing nodes or arcs, unless the \c GR template
   715   /// by adding or removing nodes or arcs, unless the \c GR template
   709   /// parameter is set to be \c const.
   716   /// parameter is set to be \c const.
   710   ///
   717   ///
   711   /// \tparam GR The type of the adapted digraph.
   718   /// \tparam DGR The type of the adapted digraph.
   712   /// It must conform to the \ref concepts::Digraph "Digraph" concept.
   719   /// It must conform to the \ref concepts::Digraph "Digraph" concept.
   713   /// It can also be specified to be \c const.
   720   /// It can also be specified to be \c const.
   714   /// \tparam NF The type of the node filter map.
   721   /// \tparam NF The type of the node filter map.
   715   /// It must be a \c bool (or convertible) node map of the
   722   /// It must be a \c bool (or convertible) node map of the
   716   /// adapted digraph. The default type is
   723   /// adapted digraph. The default type is
   717   /// \ref concepts::Digraph::NodeMap "GR::NodeMap<bool>".
   724   /// \ref concepts::Digraph::NodeMap "DGR::NodeMap<bool>".
   718   /// \tparam AF The type of the arc filter map.
   725   /// \tparam AF The type of the arc filter map.
   719   /// It must be \c bool (or convertible) arc map of the
   726   /// It must be \c bool (or convertible) arc map of the
   720   /// adapted digraph. The default type is
   727   /// adapted digraph. The default type is
   721   /// \ref concepts::Digraph::ArcMap "GR::ArcMap<bool>".
   728   /// \ref concepts::Digraph::ArcMap "DGR::ArcMap<bool>".
   722   ///
   729   ///
   723   /// \note The \c Node and \c Arc types of this adaptor and the adapted
   730   /// \note The \c Node and \c Arc types of this adaptor and the adapted
   724   /// digraph are convertible to each other.
   731   /// digraph are convertible to each other.
   725   ///
   732   ///
   726   /// \see FilterNodes
   733   /// \see FilterNodes
   727   /// \see FilterArcs
   734   /// \see FilterArcs
   728 #ifdef DOXYGEN
   735 #ifdef DOXYGEN
   729   template<typename GR, typename NF, typename AF>
   736   template<typename DGR, typename NF, typename AF>
   730   class SubDigraph {
   737   class SubDigraph {
   731 #else
   738 #else
   732   template<typename GR,
   739   template<typename DGR,
   733            typename NF = typename GR::template NodeMap<bool>,
   740            typename NF = typename DGR::template NodeMap<bool>,
   734            typename AF = typename GR::template ArcMap<bool> >
   741            typename AF = typename DGR::template ArcMap<bool> >
   735   class SubDigraph :
   742   class SubDigraph :
   736     public DigraphAdaptorExtender<SubDigraphBase<GR, NF, AF, true> > {
   743     public DigraphAdaptorExtender<SubDigraphBase<DGR, NF, AF, true> > {
   737 #endif
   744 #endif
   738   public:
   745   public:
   739     /// The type of the adapted digraph.
   746     /// The type of the adapted digraph.
   740     typedef GR Digraph;
   747     typedef DGR Digraph;
   741     /// The type of the node filter map.
   748     /// The type of the node filter map.
   742     typedef NF NodeFilterMap;
   749     typedef NF NodeFilterMap;
   743     /// The type of the arc filter map.
   750     /// The type of the arc filter map.
   744     typedef AF ArcFilterMap;
   751     typedef AF ArcFilterMap;
   745 
   752 
   746     typedef DigraphAdaptorExtender<SubDigraphBase<GR, NF, AF, true> >
   753     typedef DigraphAdaptorExtender<SubDigraphBase<DGR, NF, AF, true> >
   747       Parent;
   754       Parent;
   748 
   755 
   749     typedef typename Parent::Node Node;
   756     typedef typename Parent::Node Node;
   750     typedef typename Parent::Arc Arc;
   757     typedef typename Parent::Arc Arc;
   751 
   758 
   755 
   762 
   756     /// \brief Constructor
   763     /// \brief Constructor
   757     ///
   764     ///
   758     /// Creates a subdigraph for the given digraph with the
   765     /// Creates a subdigraph for the given digraph with the
   759     /// given node and arc filter maps.
   766     /// given node and arc filter maps.
   760     SubDigraph(Digraph& digraph, NodeFilterMap& node_filter,
   767     SubDigraph(DGR& digraph, NF& node_filter, AF& arc_filter) {
   761                ArcFilterMap& arc_filter) {
   768       Parent::initialize(digraph, node_filter, arc_filter);
   762       setDigraph(digraph);
       
   763       setNodeFilterMap(node_filter);
       
   764       setArcFilterMap(arc_filter);
       
   765     }
   769     }
   766 
   770 
   767     /// \brief Sets the status of the given node
   771     /// \brief Sets the status of the given node
   768     ///
   772     ///
   769     /// This function sets the status of the given node.
   773     /// This function sets the status of the given node.
   821   /// \brief Returns a read-only SubDigraph adaptor
   825   /// \brief Returns a read-only SubDigraph adaptor
   822   ///
   826   ///
   823   /// This function just returns a read-only \ref SubDigraph adaptor.
   827   /// This function just returns a read-only \ref SubDigraph adaptor.
   824   /// \ingroup graph_adaptors
   828   /// \ingroup graph_adaptors
   825   /// \relates SubDigraph
   829   /// \relates SubDigraph
   826   template<typename GR, typename NF, typename AF>
   830   template<typename DGR, typename NF, typename AF>
   827   SubDigraph<const GR, NF, AF>
   831   SubDigraph<const DGR, NF, AF>
   828   subDigraph(const GR& digraph,
   832   subDigraph(const DGR& digraph,
   829              NF& node_filter_map, AF& arc_filter_map) {
   833              NF& node_filter, AF& arc_filter) {
   830     return SubDigraph<const GR, NF, AF>
   834     return SubDigraph<const DGR, NF, AF>
   831       (digraph, node_filter_map, arc_filter_map);
   835       (digraph, node_filter, arc_filter);
   832   }
   836   }
   833 
   837 
   834   template<typename GR, typename NF, typename AF>
   838   template<typename DGR, typename NF, typename AF>
   835   SubDigraph<const GR, const NF, AF>
   839   SubDigraph<const DGR, const NF, AF>
   836   subDigraph(const GR& digraph,
   840   subDigraph(const DGR& digraph,
   837              const NF& node_filter_map, AF& arc_filter_map) {
   841              const NF& node_filter, AF& arc_filter) {
   838     return SubDigraph<const GR, const NF, AF>
   842     return SubDigraph<const DGR, const NF, AF>
   839       (digraph, node_filter_map, arc_filter_map);
   843       (digraph, node_filter, arc_filter);
   840   }
   844   }
   841 
   845 
   842   template<typename GR, typename NF, typename AF>
   846   template<typename DGR, typename NF, typename AF>
   843   SubDigraph<const GR, NF, const AF>
   847   SubDigraph<const DGR, NF, const AF>
   844   subDigraph(const GR& digraph,
   848   subDigraph(const DGR& digraph,
   845              NF& node_filter_map, const AF& arc_filter_map) {
   849              NF& node_filter, const AF& arc_filter) {
   846     return SubDigraph<const GR, NF, const AF>
   850     return SubDigraph<const DGR, NF, const AF>
   847       (digraph, node_filter_map, arc_filter_map);
   851       (digraph, node_filter, arc_filter);
   848   }
   852   }
   849 
   853 
   850   template<typename GR, typename NF, typename AF>
   854   template<typename DGR, typename NF, typename AF>
   851   SubDigraph<const GR, const NF, const AF>
   855   SubDigraph<const DGR, const NF, const AF>
   852   subDigraph(const GR& digraph,
   856   subDigraph(const DGR& digraph,
   853              const NF& node_filter_map, const AF& arc_filter_map) {
   857              const NF& node_filter, const AF& arc_filter) {
   854     return SubDigraph<const GR, const NF, const AF>
   858     return SubDigraph<const DGR, const NF, const AF>
   855       (digraph, node_filter_map, arc_filter_map);
   859       (digraph, node_filter, arc_filter);
   856   }
   860   }
   857 
   861 
   858 
   862 
   859   template <typename _Graph, typename _NodeFilterMap,
   863   template <typename GR, typename NF, typename EF, bool ch = true>
   860             typename _EdgeFilterMap, bool _checked = true>
   864   class SubGraphBase : public GraphAdaptorBase<GR> {
   861   class SubGraphBase : public GraphAdaptorBase<_Graph> {
   865   public:
   862   public:
   866     typedef GR Graph;
   863     typedef _Graph Graph;
   867     typedef NF NodeFilterMap;
   864     typedef _NodeFilterMap NodeFilterMap;
   868     typedef EF EdgeFilterMap;
   865     typedef _EdgeFilterMap EdgeFilterMap;
       
   866 
   869 
   867     typedef SubGraphBase Adaptor;
   870     typedef SubGraphBase Adaptor;
   868     typedef GraphAdaptorBase<_Graph> Parent;
   871     typedef GraphAdaptorBase<GR> Parent;
   869   protected:
   872   protected:
   870 
   873 
   871     NodeFilterMap* _node_filter_map;
   874     NF* _node_filter;
   872     EdgeFilterMap* _edge_filter_map;
   875     EF* _edge_filter;
   873 
   876 
   874     SubGraphBase()
   877     SubGraphBase()
   875       : Parent(), _node_filter_map(0), _edge_filter_map(0) { }
   878       : Parent(), _node_filter(0), _edge_filter(0) { }
   876 
   879 
   877     void setNodeFilterMap(NodeFilterMap& node_filter_map) {
   880     void initialize(GR& graph, NF& node_filter, EF& edge_filter) {
   878       _node_filter_map=&node_filter_map;
   881       Parent::initialize(graph);
   879     }
   882       _node_filter = &node_filter;
   880     void setEdgeFilterMap(EdgeFilterMap& edge_filter_map) {
   883       _edge_filter = &edge_filter;
   881       _edge_filter_map=&edge_filter_map;
       
   882     }
   884     }
   883 
   885 
   884   public:
   886   public:
   885 
   887 
   886     typedef typename Parent::Node Node;
   888     typedef typename Parent::Node Node;
   887     typedef typename Parent::Arc Arc;
   889     typedef typename Parent::Arc Arc;
   888     typedef typename Parent::Edge Edge;
   890     typedef typename Parent::Edge Edge;
   889 
   891 
   890     void first(Node& i) const {
   892     void first(Node& i) const {
   891       Parent::first(i);
   893       Parent::first(i);
   892       while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i);
   894       while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
   893     }
   895     }
   894 
   896 
   895     void first(Arc& i) const {
   897     void first(Arc& i) const {
   896       Parent::first(i);
   898       Parent::first(i);
   897       while (i!=INVALID && (!(*_edge_filter_map)[i]
   899       while (i!=INVALID && (!(*_edge_filter)[i]
   898                             || !(*_node_filter_map)[Parent::source(i)]
   900                             || !(*_node_filter)[Parent::source(i)]
   899                             || !(*_node_filter_map)[Parent::target(i)]))
   901                             || !(*_node_filter)[Parent::target(i)]))
   900         Parent::next(i);
   902         Parent::next(i);
   901     }
   903     }
   902 
   904 
   903     void first(Edge& i) const {
   905     void first(Edge& i) const {
   904       Parent::first(i);
   906       Parent::first(i);
   905       while (i!=INVALID && (!(*_edge_filter_map)[i]
   907       while (i!=INVALID && (!(*_edge_filter)[i]
   906                             || !(*_node_filter_map)[Parent::u(i)]
   908                             || !(*_node_filter)[Parent::u(i)]
   907                             || !(*_node_filter_map)[Parent::v(i)]))
   909                             || !(*_node_filter)[Parent::v(i)]))
   908         Parent::next(i);
   910         Parent::next(i);
   909     }
   911     }
   910 
   912 
   911     void firstIn(Arc& i, const Node& n) const {
   913     void firstIn(Arc& i, const Node& n) const {
   912       Parent::firstIn(i, n);
   914       Parent::firstIn(i, n);
   913       while (i!=INVALID && (!(*_edge_filter_map)[i]
   915       while (i!=INVALID && (!(*_edge_filter)[i]
   914                             || !(*_node_filter_map)[Parent::source(i)]))
   916                             || !(*_node_filter)[Parent::source(i)]))
   915         Parent::nextIn(i);
   917         Parent::nextIn(i);
   916     }
   918     }
   917 
   919 
   918     void firstOut(Arc& i, const Node& n) const {
   920     void firstOut(Arc& i, const Node& n) const {
   919       Parent::firstOut(i, n);
   921       Parent::firstOut(i, n);
   920       while (i!=INVALID && (!(*_edge_filter_map)[i]
   922       while (i!=INVALID && (!(*_edge_filter)[i]
   921                             || !(*_node_filter_map)[Parent::target(i)]))
   923                             || !(*_node_filter)[Parent::target(i)]))
   922         Parent::nextOut(i);
   924         Parent::nextOut(i);
   923     }
   925     }
   924 
   926 
   925     void firstInc(Edge& i, bool& d, const Node& n) const {
   927     void firstInc(Edge& i, bool& d, const Node& n) const {
   926       Parent::firstInc(i, d, n);
   928       Parent::firstInc(i, d, n);
   927       while (i!=INVALID && (!(*_edge_filter_map)[i]
   929       while (i!=INVALID && (!(*_edge_filter)[i]
   928                             || !(*_node_filter_map)[Parent::u(i)]
   930                             || !(*_node_filter)[Parent::u(i)]
   929                             || !(*_node_filter_map)[Parent::v(i)]))
   931                             || !(*_node_filter)[Parent::v(i)]))
   930         Parent::nextInc(i, d);
   932         Parent::nextInc(i, d);
   931     }
   933     }
   932 
   934 
   933     void next(Node& i) const {
   935     void next(Node& i) const {
   934       Parent::next(i);
   936       Parent::next(i);
   935       while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i);
   937       while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
   936     }
   938     }
   937 
   939 
   938     void next(Arc& i) const {
   940     void next(Arc& i) const {
   939       Parent::next(i);
   941       Parent::next(i);
   940       while (i!=INVALID && (!(*_edge_filter_map)[i]
   942       while (i!=INVALID && (!(*_edge_filter)[i]
   941                             || !(*_node_filter_map)[Parent::source(i)]
   943                             || !(*_node_filter)[Parent::source(i)]
   942                             || !(*_node_filter_map)[Parent::target(i)]))
   944                             || !(*_node_filter)[Parent::target(i)]))
   943         Parent::next(i);
   945         Parent::next(i);
   944     }
   946     }
   945 
   947 
   946     void next(Edge& i) const {
   948     void next(Edge& i) const {
   947       Parent::next(i);
   949       Parent::next(i);
   948       while (i!=INVALID && (!(*_edge_filter_map)[i]
   950       while (i!=INVALID && (!(*_edge_filter)[i]
   949                             || !(*_node_filter_map)[Parent::u(i)]
   951                             || !(*_node_filter)[Parent::u(i)]
   950                             || !(*_node_filter_map)[Parent::v(i)]))
   952                             || !(*_node_filter)[Parent::v(i)]))
   951         Parent::next(i);
   953         Parent::next(i);
   952     }
   954     }
   953 
   955 
   954     void nextIn(Arc& i) const {
   956     void nextIn(Arc& i) const {
   955       Parent::nextIn(i);
   957       Parent::nextIn(i);
   956       while (i!=INVALID && (!(*_edge_filter_map)[i]
   958       while (i!=INVALID && (!(*_edge_filter)[i]
   957                             || !(*_node_filter_map)[Parent::source(i)]))
   959                             || !(*_node_filter)[Parent::source(i)]))
   958         Parent::nextIn(i);
   960         Parent::nextIn(i);
   959     }
   961     }
   960 
   962 
   961     void nextOut(Arc& i) const {
   963     void nextOut(Arc& i) const {
   962       Parent::nextOut(i);
   964       Parent::nextOut(i);
   963       while (i!=INVALID && (!(*_edge_filter_map)[i]
   965       while (i!=INVALID && (!(*_edge_filter)[i]
   964                             || !(*_node_filter_map)[Parent::target(i)]))
   966                             || !(*_node_filter)[Parent::target(i)]))
   965         Parent::nextOut(i);
   967         Parent::nextOut(i);
   966     }
   968     }
   967 
   969 
   968     void nextInc(Edge& i, bool& d) const {
   970     void nextInc(Edge& i, bool& d) const {
   969       Parent::nextInc(i, d);
   971       Parent::nextInc(i, d);
   970       while (i!=INVALID && (!(*_edge_filter_map)[i]
   972       while (i!=INVALID && (!(*_edge_filter)[i]
   971                             || !(*_node_filter_map)[Parent::u(i)]
   973                             || !(*_node_filter)[Parent::u(i)]
   972                             || !(*_node_filter_map)[Parent::v(i)]))
   974                             || !(*_node_filter)[Parent::v(i)]))
   973         Parent::nextInc(i, d);
   975         Parent::nextInc(i, d);
   974     }
   976     }
   975 
   977 
   976     void status(const Node& n, bool v) const { _node_filter_map->set(n, v); }
   978     void status(const Node& n, bool v) const { _node_filter->set(n, v); }
   977     void status(const Edge& e, bool v) const { _edge_filter_map->set(e, v); }
   979     void status(const Edge& e, bool v) const { _edge_filter->set(e, v); }
   978 
   980 
   979     bool status(const Node& n) const { return (*_node_filter_map)[n]; }
   981     bool status(const Node& n) const { return (*_node_filter)[n]; }
   980     bool status(const Edge& e) const { return (*_edge_filter_map)[e]; }
   982     bool status(const Edge& e) const { return (*_edge_filter)[e]; }
   981 
   983 
   982     typedef False NodeNumTag;
   984     typedef False NodeNumTag;
   983     typedef False ArcNumTag;
   985     typedef False ArcNumTag;
   984     typedef False EdgeNumTag;
   986     typedef False EdgeNumTag;
   985 
   987 
   986     typedef FindArcTagIndicator<Graph> FindArcTag;
   988     typedef FindArcTagIndicator<Graph> FindArcTag;
   987     Arc findArc(const Node& u, const Node& v,
   989     Arc findArc(const Node& u, const Node& v,
   988                 const Arc& prev = INVALID) const {
   990                 const Arc& prev = INVALID) const {
   989       if (!(*_node_filter_map)[u] || !(*_node_filter_map)[v]) {
   991       if (!(*_node_filter)[u] || !(*_node_filter)[v]) {
   990         return INVALID;
   992         return INVALID;
   991       }
   993       }
   992       Arc arc = Parent::findArc(u, v, prev);
   994       Arc arc = Parent::findArc(u, v, prev);
   993       while (arc != INVALID && !(*_edge_filter_map)[arc]) {
   995       while (arc != INVALID && !(*_edge_filter)[arc]) {
   994         arc = Parent::findArc(u, v, arc);
   996         arc = Parent::findArc(u, v, arc);
   995       }
   997       }
   996       return arc;
   998       return arc;
   997     }
   999     }
   998 
  1000 
   999     typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
  1001     typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
  1000     Edge findEdge(const Node& u, const Node& v,
  1002     Edge findEdge(const Node& u, const Node& v,
  1001                   const Edge& prev = INVALID) const {
  1003                   const Edge& prev = INVALID) const {
  1002       if (!(*_node_filter_map)[u] || !(*_node_filter_map)[v]) {
  1004       if (!(*_node_filter)[u] || !(*_node_filter)[v]) {
  1003         return INVALID;
  1005         return INVALID;
  1004       }
  1006       }
  1005       Edge edge = Parent::findEdge(u, v, prev);
  1007       Edge edge = Parent::findEdge(u, v, prev);
  1006       while (edge != INVALID && !(*_edge_filter_map)[edge]) {
  1008       while (edge != INVALID && !(*_edge_filter)[edge]) {
  1007         edge = Parent::findEdge(u, v, edge);
  1009         edge = Parent::findEdge(u, v, edge);
  1008       }
  1010       }
  1009       return edge;
  1011       return edge;
  1010     }
  1012     }
  1011 
  1013 
  1012     template <typename _Value>
  1014     template <typename V>
  1013     class NodeMap : public SubMapExtender<Adaptor,
  1015     class NodeMap 
  1014       typename Parent::template NodeMap<_Value> > {
  1016       : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
       
  1017           LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> {
  1015     public:
  1018     public:
  1016       typedef _Value Value;
  1019       typedef V Value;
  1017       typedef SubMapExtender<Adaptor, typename Parent::
  1020       typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 
  1018                              template NodeMap<Value> > MapParent;
  1021         LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent;
  1019 
  1022 
  1020       NodeMap(const Adaptor& adaptor)
  1023       NodeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
  1021         : MapParent(adaptor) {}
  1024         : Parent(adaptor) {}
  1022       NodeMap(const Adaptor& adaptor, const Value& value)
  1025       NodeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)
  1023         : MapParent(adaptor, value) {}
  1026         : Parent(adaptor, value) {}
  1024 
  1027 
  1025     private:
  1028     private:
  1026       NodeMap& operator=(const NodeMap& cmap) {
  1029       NodeMap& operator=(const NodeMap& cmap) {
  1027         return operator=<NodeMap>(cmap);
  1030         return operator=<NodeMap>(cmap);
  1028       }
  1031       }
  1029 
  1032 
  1030       template <typename CMap>
  1033       template <typename CMap>
  1031       NodeMap& operator=(const CMap& cmap) {
  1034       NodeMap& operator=(const CMap& cmap) {
  1032         MapParent::operator=(cmap);
  1035         Parent::operator=(cmap);
  1033         return *this;
  1036         return *this;
  1034       }
  1037       }
  1035     };
  1038     };
  1036 
  1039 
  1037     template <typename _Value>
  1040     template <typename V>
  1038     class ArcMap : public SubMapExtender<Adaptor,
  1041     class ArcMap 
  1039       typename Parent::template ArcMap<_Value> > {
  1042       : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
       
  1043           LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> {
  1040     public:
  1044     public:
  1041       typedef _Value Value;
  1045       typedef V Value;
  1042       typedef SubMapExtender<Adaptor, typename Parent::
  1046       typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 
  1043                              template ArcMap<Value> > MapParent;
  1047         LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent;
  1044 
  1048 
  1045       ArcMap(const Adaptor& adaptor)
  1049       ArcMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
  1046         : MapParent(adaptor) {}
  1050         : Parent(adaptor) {}
  1047       ArcMap(const Adaptor& adaptor, const Value& value)
  1051       ArcMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)
  1048         : MapParent(adaptor, value) {}
  1052         : Parent(adaptor, value) {}
  1049 
  1053 
  1050     private:
  1054     private:
  1051       ArcMap& operator=(const ArcMap& cmap) {
  1055       ArcMap& operator=(const ArcMap& cmap) {
  1052         return operator=<ArcMap>(cmap);
  1056         return operator=<ArcMap>(cmap);
  1053       }
  1057       }
  1054 
  1058 
  1055       template <typename CMap>
  1059       template <typename CMap>
  1056       ArcMap& operator=(const CMap& cmap) {
  1060       ArcMap& operator=(const CMap& cmap) {
  1057         MapParent::operator=(cmap);
  1061         Parent::operator=(cmap);
  1058         return *this;
  1062         return *this;
  1059       }
  1063       }
  1060     };
  1064     };
  1061 
  1065 
  1062     template <typename _Value>
  1066     template <typename V>
  1063     class EdgeMap : public SubMapExtender<Adaptor,
  1067     class EdgeMap 
  1064       typename Parent::template EdgeMap<_Value> > {
  1068       : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
       
  1069         LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> {
  1065     public:
  1070     public:
  1066       typedef _Value Value;
  1071       typedef V Value;
  1067       typedef SubMapExtender<Adaptor, typename Parent::
  1072       typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>, 
  1068                              template EdgeMap<Value> > MapParent;
  1073         LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
  1069 
  1074 
  1070       EdgeMap(const Adaptor& adaptor)
  1075       EdgeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
  1071         : MapParent(adaptor) {}
  1076         : Parent(adaptor) {}
  1072 
  1077 
  1073       EdgeMap(const Adaptor& adaptor, const Value& value)
  1078       EdgeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)
  1074         : MapParent(adaptor, value) {}
  1079         : Parent(adaptor, value) {}
  1075 
  1080 
  1076     private:
  1081     private:
  1077       EdgeMap& operator=(const EdgeMap& cmap) {
  1082       EdgeMap& operator=(const EdgeMap& cmap) {
  1078         return operator=<EdgeMap>(cmap);
  1083         return operator=<EdgeMap>(cmap);
  1079       }
  1084       }
  1080 
  1085 
  1081       template <typename CMap>
  1086       template <typename CMap>
  1082       EdgeMap& operator=(const CMap& cmap) {
  1087       EdgeMap& operator=(const CMap& cmap) {
  1083         MapParent::operator=(cmap);
  1088         Parent::operator=(cmap);
  1084         return *this;
  1089         return *this;
  1085       }
  1090       }
  1086     };
  1091     };
  1087 
  1092 
  1088   };
  1093   };
  1089 
  1094 
  1090   template <typename _Graph, typename _NodeFilterMap, typename _EdgeFilterMap>
  1095   template <typename GR, typename NF, typename EF>
  1091   class SubGraphBase<_Graph, _NodeFilterMap, _EdgeFilterMap, false>
  1096   class SubGraphBase<GR, NF, EF, false>
  1092     : public GraphAdaptorBase<_Graph> {
  1097     : public GraphAdaptorBase<GR> {
  1093   public:
  1098   public:
  1094     typedef _Graph Graph;
  1099     typedef GR Graph;
  1095     typedef _NodeFilterMap NodeFilterMap;
  1100     typedef NF NodeFilterMap;
  1096     typedef _EdgeFilterMap EdgeFilterMap;
  1101     typedef EF EdgeFilterMap;
  1097 
  1102 
  1098     typedef SubGraphBase Adaptor;
  1103     typedef SubGraphBase Adaptor;
  1099     typedef GraphAdaptorBase<_Graph> Parent;
  1104     typedef GraphAdaptorBase<GR> Parent;
  1100   protected:
  1105   protected:
  1101     NodeFilterMap* _node_filter_map;
  1106     NF* _node_filter;
  1102     EdgeFilterMap* _edge_filter_map;
  1107     EF* _edge_filter;
  1103     SubGraphBase() : Parent(),
  1108     SubGraphBase() 
  1104                      _node_filter_map(0), _edge_filter_map(0) { }
  1109 	  : Parent(), _node_filter(0), _edge_filter(0) { }
  1105 
  1110 
  1106     void setNodeFilterMap(NodeFilterMap& node_filter_map) {
  1111     void initialize(GR& graph, NF& node_filter, EF& edge_filter) {
  1107       _node_filter_map=&node_filter_map;
  1112       Parent::initialize(graph);
  1108     }
  1113       _node_filter = &node_filter;
  1109     void setEdgeFilterMap(EdgeFilterMap& edge_filter_map) {
  1114       _edge_filter = &edge_filter;
  1110       _edge_filter_map=&edge_filter_map;
       
  1111     }
  1115     }
  1112 
  1116 
  1113   public:
  1117   public:
  1114 
  1118 
  1115     typedef typename Parent::Node Node;
  1119     typedef typename Parent::Node Node;
  1116     typedef typename Parent::Arc Arc;
  1120     typedef typename Parent::Arc Arc;
  1117     typedef typename Parent::Edge Edge;
  1121     typedef typename Parent::Edge Edge;
  1118 
  1122 
  1119     void first(Node& i) const {
  1123     void first(Node& i) const {
  1120       Parent::first(i);
  1124       Parent::first(i);
  1121       while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i);
  1125       while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
  1122     }
  1126     }
  1123 
  1127 
  1124     void first(Arc& i) const {
  1128     void first(Arc& i) const {
  1125       Parent::first(i);
  1129       Parent::first(i);
  1126       while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i);
  1130       while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
  1127     }
  1131     }
  1128 
  1132 
  1129     void first(Edge& i) const {
  1133     void first(Edge& i) const {
  1130       Parent::first(i);
  1134       Parent::first(i);
  1131       while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i);
  1135       while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
  1132     }
  1136     }
  1133 
  1137 
  1134     void firstIn(Arc& i, const Node& n) const {
  1138     void firstIn(Arc& i, const Node& n) const {
  1135       Parent::firstIn(i, n);
  1139       Parent::firstIn(i, n);
  1136       while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextIn(i);
  1140       while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextIn(i);
  1137     }
  1141     }
  1138 
  1142 
  1139     void firstOut(Arc& i, const Node& n) const {
  1143     void firstOut(Arc& i, const Node& n) const {
  1140       Parent::firstOut(i, n);
  1144       Parent::firstOut(i, n);
  1141       while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextOut(i);
  1145       while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextOut(i);
  1142     }
  1146     }
  1143 
  1147 
  1144     void firstInc(Edge& i, bool& d, const Node& n) const {
  1148     void firstInc(Edge& i, bool& d, const Node& n) const {
  1145       Parent::firstInc(i, d, n);
  1149       Parent::firstInc(i, d, n);
  1146       while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextInc(i, d);
  1150       while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextInc(i, d);
  1147     }
  1151     }
  1148 
  1152 
  1149     void next(Node& i) const {
  1153     void next(Node& i) const {
  1150       Parent::next(i);
  1154       Parent::next(i);
  1151       while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i);
  1155       while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
  1152     }
  1156     }
  1153     void next(Arc& i) const {
  1157     void next(Arc& i) const {
  1154       Parent::next(i);
  1158       Parent::next(i);
  1155       while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i);
  1159       while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
  1156     }
  1160     }
  1157     void next(Edge& i) const {
  1161     void next(Edge& i) const {
  1158       Parent::next(i);
  1162       Parent::next(i);
  1159       while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i);
  1163       while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
  1160     }
  1164     }
  1161     void nextIn(Arc& i) const {
  1165     void nextIn(Arc& i) const {
  1162       Parent::nextIn(i);
  1166       Parent::nextIn(i);
  1163       while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextIn(i);
  1167       while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextIn(i);
  1164     }
  1168     }
  1165 
  1169 
  1166     void nextOut(Arc& i) const {
  1170     void nextOut(Arc& i) const {
  1167       Parent::nextOut(i);
  1171       Parent::nextOut(i);
  1168       while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextOut(i);
  1172       while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextOut(i);
  1169     }
  1173     }
  1170     void nextInc(Edge& i, bool& d) const {
  1174     void nextInc(Edge& i, bool& d) const {
  1171       Parent::nextInc(i, d);
  1175       Parent::nextInc(i, d);
  1172       while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextInc(i, d);
  1176       while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextInc(i, d);
  1173     }
  1177     }
  1174 
  1178 
  1175     void status(const Node& n, bool v) const { _node_filter_map->set(n, v); }
  1179     void status(const Node& n, bool v) const { _node_filter->set(n, v); }
  1176     void status(const Edge& e, bool v) const { _edge_filter_map->set(e, v); }
  1180     void status(const Edge& e, bool v) const { _edge_filter->set(e, v); }
  1177 
  1181 
  1178     bool status(const Node& n) const { return (*_node_filter_map)[n]; }
  1182     bool status(const Node& n) const { return (*_node_filter)[n]; }
  1179     bool status(const Edge& e) const { return (*_edge_filter_map)[e]; }
  1183     bool status(const Edge& e) const { return (*_edge_filter)[e]; }
  1180 
  1184 
  1181     typedef False NodeNumTag;
  1185     typedef False NodeNumTag;
  1182     typedef False ArcNumTag;
  1186     typedef False ArcNumTag;
  1183     typedef False EdgeNumTag;
  1187     typedef False EdgeNumTag;
  1184 
  1188 
  1185     typedef FindArcTagIndicator<Graph> FindArcTag;
  1189     typedef FindArcTagIndicator<Graph> FindArcTag;
  1186     Arc findArc(const Node& u, const Node& v,
  1190     Arc findArc(const Node& u, const Node& v,
  1187                 const Arc& prev = INVALID) const {
  1191                 const Arc& prev = INVALID) const {
  1188       Arc arc = Parent::findArc(u, v, prev);
  1192       Arc arc = Parent::findArc(u, v, prev);
  1189       while (arc != INVALID && !(*_edge_filter_map)[arc]) {
  1193       while (arc != INVALID && !(*_edge_filter)[arc]) {
  1190         arc = Parent::findArc(u, v, arc);
  1194         arc = Parent::findArc(u, v, arc);
  1191       }
  1195       }
  1192       return arc;
  1196       return arc;
  1193     }
  1197     }
  1194 
  1198 
  1195     typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
  1199     typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
  1196     Edge findEdge(const Node& u, const Node& v,
  1200     Edge findEdge(const Node& u, const Node& v,
  1197                   const Edge& prev = INVALID) const {
  1201                   const Edge& prev = INVALID) const {
  1198       Edge edge = Parent::findEdge(u, v, prev);
  1202       Edge edge = Parent::findEdge(u, v, prev);
  1199       while (edge != INVALID && !(*_edge_filter_map)[edge]) {
  1203       while (edge != INVALID && !(*_edge_filter)[edge]) {
  1200         edge = Parent::findEdge(u, v, edge);
  1204         edge = Parent::findEdge(u, v, edge);
  1201       }
  1205       }
  1202       return edge;
  1206       return edge;
  1203     }
  1207     }
  1204 
  1208 
  1205     template <typename _Value>
  1209     template <typename V>
  1206     class NodeMap : public SubMapExtender<Adaptor,
  1210     class NodeMap 
  1207       typename Parent::template NodeMap<_Value> > {
  1211       : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
       
  1212           LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> {
  1208     public:
  1213     public:
  1209       typedef _Value Value;
  1214       typedef V Value;
  1210       typedef SubMapExtender<Adaptor, typename Parent::
  1215       typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
  1211                              template NodeMap<Value> > MapParent;
  1216         LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent;
  1212 
  1217 
  1213       NodeMap(const Adaptor& adaptor)
  1218       NodeMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
  1214         : MapParent(adaptor) {}
  1219         : Parent(adaptor) {}
  1215       NodeMap(const Adaptor& adaptor, const Value& value)
  1220       NodeMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
  1216         : MapParent(adaptor, value) {}
  1221         : Parent(adaptor, value) {}
  1217 
  1222 
  1218     private:
  1223     private:
  1219       NodeMap& operator=(const NodeMap& cmap) {
  1224       NodeMap& operator=(const NodeMap& cmap) {
  1220         return operator=<NodeMap>(cmap);
  1225         return operator=<NodeMap>(cmap);
  1221       }
  1226       }
  1222 
  1227 
  1223       template <typename CMap>
  1228       template <typename CMap>
  1224       NodeMap& operator=(const CMap& cmap) {
  1229       NodeMap& operator=(const CMap& cmap) {
  1225         MapParent::operator=(cmap);
  1230         Parent::operator=(cmap);
  1226         return *this;
  1231         return *this;
  1227       }
  1232       }
  1228     };
  1233     };
  1229 
  1234 
  1230     template <typename _Value>
  1235     template <typename V>
  1231     class ArcMap : public SubMapExtender<Adaptor,
  1236     class ArcMap 
  1232       typename Parent::template ArcMap<_Value> > {
  1237       : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
       
  1238           LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> {
  1233     public:
  1239     public:
  1234       typedef _Value Value;
  1240       typedef V Value;
  1235       typedef SubMapExtender<Adaptor, typename Parent::
  1241       typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
  1236                              template ArcMap<Value> > MapParent;
  1242         LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent;
  1237 
  1243 
  1238       ArcMap(const Adaptor& adaptor)
  1244       ArcMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
  1239         : MapParent(adaptor) {}
  1245         : Parent(adaptor) {}
  1240       ArcMap(const Adaptor& adaptor, const Value& value)
  1246       ArcMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
  1241         : MapParent(adaptor, value) {}
  1247         : Parent(adaptor, value) {}
  1242 
  1248 
  1243     private:
  1249     private:
  1244       ArcMap& operator=(const ArcMap& cmap) {
  1250       ArcMap& operator=(const ArcMap& cmap) {
  1245         return operator=<ArcMap>(cmap);
  1251         return operator=<ArcMap>(cmap);
  1246       }
  1252       }
  1247 
  1253 
  1248       template <typename CMap>
  1254       template <typename CMap>
  1249       ArcMap& operator=(const CMap& cmap) {
  1255       ArcMap& operator=(const CMap& cmap) {
  1250         MapParent::operator=(cmap);
  1256         Parent::operator=(cmap);
  1251         return *this;
  1257         return *this;
  1252       }
  1258       }
  1253     };
  1259     };
  1254 
  1260 
  1255     template <typename _Value>
  1261     template <typename V>
  1256     class EdgeMap : public SubMapExtender<Adaptor,
  1262     class EdgeMap 
  1257       typename Parent::template EdgeMap<_Value> > {
  1263       : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
       
  1264         LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> {
  1258     public:
  1265     public:
  1259       typedef _Value Value;
  1266       typedef V Value;
  1260       typedef SubMapExtender<Adaptor, typename Parent::
  1267       typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>, 
  1261                              template EdgeMap<Value> > MapParent;
  1268 		  LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
  1262 
  1269 
  1263       EdgeMap(const Adaptor& adaptor)
  1270       EdgeMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
  1264         : MapParent(adaptor) {}
  1271         : Parent(adaptor) {}
  1265 
  1272 
  1266       EdgeMap(const Adaptor& adaptor, const _Value& value)
  1273       EdgeMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
  1267         : MapParent(adaptor, value) {}
  1274         : Parent(adaptor, value) {}
  1268 
  1275 
  1269     private:
  1276     private:
  1270       EdgeMap& operator=(const EdgeMap& cmap) {
  1277       EdgeMap& operator=(const EdgeMap& cmap) {
  1271         return operator=<EdgeMap>(cmap);
  1278         return operator=<EdgeMap>(cmap);
  1272       }
  1279       }
  1273 
  1280 
  1274       template <typename CMap>
  1281       template <typename CMap>
  1275       EdgeMap& operator=(const CMap& cmap) {
  1282       EdgeMap& operator=(const CMap& cmap) {
  1276         MapParent::operator=(cmap);
  1283         Parent::operator=(cmap);
  1277         return *this;
  1284         return *this;
  1278       }
  1285       }
  1279     };
  1286     };
  1280 
  1287 
  1281   };
  1288   };
  1330     /// The type of the node filter map.
  1337     /// The type of the node filter map.
  1331     typedef NF NodeFilterMap;
  1338     typedef NF NodeFilterMap;
  1332     /// The type of the edge filter map.
  1339     /// The type of the edge filter map.
  1333     typedef EF EdgeFilterMap;
  1340     typedef EF EdgeFilterMap;
  1334 
  1341 
  1335     typedef GraphAdaptorExtender< SubGraphBase<GR, NF, EF, true> >
  1342     typedef GraphAdaptorExtender<SubGraphBase<GR, NF, EF, true> >
  1336       Parent;
  1343       Parent;
  1337 
  1344 
  1338     typedef typename Parent::Node Node;
  1345     typedef typename Parent::Node Node;
  1339     typedef typename Parent::Edge Edge;
  1346     typedef typename Parent::Edge Edge;
  1340 
  1347 
  1344 
  1351 
  1345     /// \brief Constructor
  1352     /// \brief Constructor
  1346     ///
  1353     ///
  1347     /// Creates a subgraph for the given graph with the given node
  1354     /// Creates a subgraph for the given graph with the given node
  1348     /// and edge filter maps.
  1355     /// and edge filter maps.
  1349     SubGraph(Graph& graph, NodeFilterMap& node_filter_map,
  1356     SubGraph(GR& graph, NF& node_filter, EF& edge_filter) {
  1350              EdgeFilterMap& edge_filter_map) {
  1357       initialize(graph, node_filter, edge_filter);
  1351       setGraph(graph);
       
  1352       setNodeFilterMap(node_filter_map);
       
  1353       setEdgeFilterMap(edge_filter_map);
       
  1354     }
  1358     }
  1355 
  1359 
  1356     /// \brief Sets the status of the given node
  1360     /// \brief Sets the status of the given node
  1357     ///
  1361     ///
  1358     /// This function sets the status of the given node.
  1362     /// This function sets the status of the given node.
  1412   /// This function just returns a read-only \ref SubGraph adaptor.
  1416   /// This function just returns a read-only \ref SubGraph adaptor.
  1413   /// \ingroup graph_adaptors
  1417   /// \ingroup graph_adaptors
  1414   /// \relates SubGraph
  1418   /// \relates SubGraph
  1415   template<typename GR, typename NF, typename EF>
  1419   template<typename GR, typename NF, typename EF>
  1416   SubGraph<const GR, NF, EF>
  1420   SubGraph<const GR, NF, EF>
  1417   subGraph(const GR& graph,
  1421   subGraph(const GR& graph, NF& node_filter, EF& edge_filter) {
  1418            NF& node_filter_map, EF& edge_filter_map) {
       
  1419     return SubGraph<const GR, NF, EF>
  1422     return SubGraph<const GR, NF, EF>
  1420       (graph, node_filter_map, edge_filter_map);
  1423       (graph, node_filter, edge_filter);
  1421   }
  1424   }
  1422 
  1425 
  1423   template<typename GR, typename NF, typename EF>
  1426   template<typename GR, typename NF, typename EF>
  1424   SubGraph<const GR, const NF, EF>
  1427   SubGraph<const GR, const NF, EF>
  1425   subGraph(const GR& graph,
  1428   subGraph(const GR& graph, const NF& node_filter, EF& edge_filter) {
  1426            const NF& node_filter_map, EF& edge_filter_map) {
       
  1427     return SubGraph<const GR, const NF, EF>
  1429     return SubGraph<const GR, const NF, EF>
  1428       (graph, node_filter_map, edge_filter_map);
  1430       (graph, node_filter, edge_filter);
  1429   }
  1431   }
  1430 
  1432 
  1431   template<typename GR, typename NF, typename EF>
  1433   template<typename GR, typename NF, typename EF>
  1432   SubGraph<const GR, NF, const EF>
  1434   SubGraph<const GR, NF, const EF>
  1433   subGraph(const GR& graph,
  1435   subGraph(const GR& graph, NF& node_filter, const EF& edge_filter) {
  1434            NF& node_filter_map, const EF& edge_filter_map) {
       
  1435     return SubGraph<const GR, NF, const EF>
  1436     return SubGraph<const GR, NF, const EF>
  1436       (graph, node_filter_map, edge_filter_map);
  1437       (graph, node_filter, edge_filter);
  1437   }
  1438   }
  1438 
  1439 
  1439   template<typename GR, typename NF, typename EF>
  1440   template<typename GR, typename NF, typename EF>
  1440   SubGraph<const GR, const NF, const EF>
  1441   SubGraph<const GR, const NF, const EF>
  1441   subGraph(const GR& graph,
  1442   subGraph(const GR& graph, const NF& node_filter, const EF& edge_filter) {
  1442            const NF& node_filter_map, const EF& edge_filter_map) {
       
  1443     return SubGraph<const GR, const NF, const EF>
  1443     return SubGraph<const GR, const NF, const EF>
  1444       (graph, node_filter_map, edge_filter_map);
  1444       (graph, node_filter, edge_filter);
  1445   }
  1445   }
  1446 
  1446 
  1447 
  1447 
  1448   /// \ingroup graph_adaptors
  1448   /// \ingroup graph_adaptors
  1449   ///
  1449   ///
  1479   template<typename GR,
  1479   template<typename GR,
  1480            typename NF = typename GR::template NodeMap<bool>,
  1480            typename NF = typename GR::template NodeMap<bool>,
  1481            typename Enable = void>
  1481            typename Enable = void>
  1482   class FilterNodes :
  1482   class FilterNodes :
  1483     public DigraphAdaptorExtender<
  1483     public DigraphAdaptorExtender<
  1484       SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, bool>, true> > {
  1484       SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >,
       
  1485                      true> > {
  1485 #endif
  1486 #endif
  1486   public:
  1487   public:
  1487 
  1488 
  1488     typedef GR Digraph;
  1489     typedef GR Digraph;
  1489     typedef NF NodeFilterMap;
  1490     typedef NF NodeFilterMap;
  1490 
  1491 
  1491     typedef DigraphAdaptorExtender<
  1492     typedef DigraphAdaptorExtender<
  1492       SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, bool>, true> >
  1493       SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >, 
  1493       Parent;
  1494                      true> > Parent;
  1494 
  1495 
  1495     typedef typename Parent::Node Node;
  1496     typedef typename Parent::Node Node;
  1496 
  1497 
  1497   protected:
  1498   protected:
  1498     ConstMap<typename Digraph::Arc, bool> const_true_map;
  1499     ConstMap<typename Digraph::Arc, Const<bool, true> > const_true_map;
  1499 
  1500 
  1500     FilterNodes() : const_true_map(true) {
  1501     FilterNodes() : const_true_map() {}
  1501       Parent::setArcFilterMap(const_true_map);
       
  1502     }
       
  1503 
  1502 
  1504   public:
  1503   public:
  1505 
  1504 
  1506     /// \brief Constructor
  1505     /// \brief Constructor
  1507     ///
  1506     ///
  1508     /// Creates a subgraph for the given digraph or graph with the
  1507     /// Creates a subgraph for the given digraph or graph with the
  1509     /// given node filter map.
  1508     /// given node filter map.
  1510     FilterNodes(GR& graph, NodeFilterMap& node_filter) :
  1509     FilterNodes(GR& graph, NF& node_filter) 
  1511       Parent(), const_true_map(true)
  1510       : Parent(), const_true_map()
  1512     {
  1511     {
  1513       Parent::setDigraph(graph);
  1512       Parent::initialize(graph, node_filter, const_true_map);
  1514       Parent::setNodeFilterMap(node_filter);
       
  1515       Parent::setArcFilterMap(const_true_map);
       
  1516     }
  1513     }
  1517 
  1514 
  1518     /// \brief Sets the status of the given node
  1515     /// \brief Sets the status of the given node
  1519     ///
  1516     ///
  1520     /// This function sets the status of the given node.
  1517     /// This function sets the status of the given node.
  1545 
  1542 
  1546   template<typename GR, typename NF>
  1543   template<typename GR, typename NF>
  1547   class FilterNodes<GR, NF,
  1544   class FilterNodes<GR, NF,
  1548                     typename enable_if<UndirectedTagIndicator<GR> >::type> :
  1545                     typename enable_if<UndirectedTagIndicator<GR> >::type> :
  1549     public GraphAdaptorExtender<
  1546     public GraphAdaptorExtender<
  1550       SubGraphBase<GR, NF, ConstMap<typename GR::Edge, bool>, true> > {
  1547       SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, 
       
  1548                    true> > {
  1551 
  1549 
  1552   public:
  1550   public:
  1553     typedef GR Graph;
  1551     typedef GR Graph;
  1554     typedef NF NodeFilterMap;
  1552     typedef NF NodeFilterMap;
  1555     typedef GraphAdaptorExtender<
  1553     typedef GraphAdaptorExtender<
  1556       SubGraphBase<GR, NF, ConstMap<typename GR::Edge, bool>, true> >
  1554       SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >, 
  1557       Parent;
  1555                    true> > Parent;
  1558 
  1556 
  1559     typedef typename Parent::Node Node;
  1557     typedef typename Parent::Node Node;
  1560   protected:
  1558   protected:
  1561     ConstMap<typename Graph::Edge, bool> const_true_map;
  1559     ConstMap<typename GR::Edge, Const<bool, true> > const_true_map;
  1562 
  1560 
  1563     FilterNodes() : const_true_map(true) {
  1561     FilterNodes() : const_true_map() {}
  1564       Parent::setEdgeFilterMap(const_true_map);
  1562 
  1565     }
  1563   public:
  1566 
  1564 
  1567   public:
  1565     FilterNodes(GR& graph, NodeFilterMap& node_filter) :
  1568 
  1566       Parent(), const_true_map() {
  1569     FilterNodes(Graph& _graph, NodeFilterMap& node_filter_map) :
  1567       Parent::initialize(graph, node_filter, const_true_map);
  1570       Parent(), const_true_map(true) {
       
  1571       Parent::setGraph(_graph);
       
  1572       Parent::setNodeFilterMap(node_filter_map);
       
  1573       Parent::setEdgeFilterMap(const_true_map);
       
  1574     }
  1568     }
  1575 
  1569 
  1576     void status(const Node& n, bool v) const { Parent::status(n, v); }
  1570     void status(const Node& n, bool v) const { Parent::status(n, v); }
  1577     bool status(const Node& n) const { return Parent::status(n); }
  1571     bool status(const Node& n) const { return Parent::status(n); }
  1578     void disable(const Node& n) const { Parent::status(n, false); }
  1572     void disable(const Node& n) const { Parent::status(n, false); }
  1586   /// This function just returns a read-only \ref FilterNodes adaptor.
  1580   /// This function just returns a read-only \ref FilterNodes adaptor.
  1587   /// \ingroup graph_adaptors
  1581   /// \ingroup graph_adaptors
  1588   /// \relates FilterNodes
  1582   /// \relates FilterNodes
  1589   template<typename GR, typename NF>
  1583   template<typename GR, typename NF>
  1590   FilterNodes<const GR, NF>
  1584   FilterNodes<const GR, NF>
  1591   filterNodes(const GR& graph, NF& node_filter_map) {
  1585   filterNodes(const GR& graph, NF& node_filter) {
  1592     return FilterNodes<const GR, NF>(graph, node_filter_map);
  1586     return FilterNodes<const GR, NF>(graph, node_filter);
  1593   }
  1587   }
  1594 
  1588 
  1595   template<typename GR, typename NF>
  1589   template<typename GR, typename NF>
  1596   FilterNodes<const GR, const NF>
  1590   FilterNodes<const GR, const NF>
  1597   filterNodes(const GR& graph, const NF& node_filter_map) {
  1591   filterNodes(const GR& graph, const NF& node_filter) {
  1598     return FilterNodes<const GR, const NF>(graph, node_filter_map);
  1592     return FilterNodes<const GR, const NF>(graph, node_filter);
  1599   }
  1593   }
  1600 
  1594 
  1601   /// \ingroup graph_adaptors
  1595   /// \ingroup graph_adaptors
  1602   ///
  1596   ///
  1603   /// \brief Adaptor class for hiding arcs in a digraph.
  1597   /// \brief Adaptor class for hiding arcs in a digraph.
  1610   ///
  1604   ///
  1611   /// The adapted digraph can also be modified through this adaptor
  1605   /// The adapted digraph can also be modified through this adaptor
  1612   /// by adding or removing nodes or arcs, unless the \c GR template
  1606   /// by adding or removing nodes or arcs, unless the \c GR template
  1613   /// parameter is set to be \c const.
  1607   /// parameter is set to be \c const.
  1614   ///
  1608   ///
  1615   /// \tparam GR The type of the adapted digraph.
  1609   /// \tparam DGR The type of the adapted digraph.
  1616   /// It must conform to the \ref concepts::Digraph "Digraph" concept.
  1610   /// It must conform to the \ref concepts::Digraph "Digraph" concept.
  1617   /// It can also be specified to be \c const.
  1611   /// It can also be specified to be \c const.
  1618   /// \tparam AF The type of the arc filter map.
  1612   /// \tparam AF The type of the arc filter map.
  1619   /// It must be a \c bool (or convertible) arc map of the
  1613   /// It must be a \c bool (or convertible) arc map of the
  1620   /// adapted digraph. The default type is
  1614   /// adapted digraph. The default type is
  1621   /// \ref concepts::Digraph::ArcMap "GR::ArcMap<bool>".
  1615   /// \ref concepts::Digraph::ArcMap "DGR::ArcMap<bool>".
  1622   ///
  1616   ///
  1623   /// \note The \c Node and \c Arc types of this adaptor and the adapted
  1617   /// \note The \c Node and \c Arc types of this adaptor and the adapted
  1624   /// digraph are convertible to each other.
  1618   /// digraph are convertible to each other.
  1625 #ifdef DOXYGEN
  1619 #ifdef DOXYGEN
  1626   template<typename GR,
  1620   template<typename DGR,
  1627            typename AF>
  1621            typename AF>
  1628   class FilterArcs {
  1622   class FilterArcs {
  1629 #else
  1623 #else
  1630   template<typename GR,
  1624   template<typename DGR,
  1631            typename AF = typename GR::template ArcMap<bool> >
  1625            typename AF = typename DGR::template ArcMap<bool> >
  1632   class FilterArcs :
  1626   class FilterArcs :
  1633     public DigraphAdaptorExtender<
  1627     public DigraphAdaptorExtender<
  1634       SubDigraphBase<GR, ConstMap<typename GR::Node, bool>, AF, false> > {
  1628       SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >,
       
  1629                      AF, false> > {
  1635 #endif
  1630 #endif
  1636   public:
  1631   public:
  1637     /// The type of the adapted digraph.
  1632     /// The type of the adapted digraph.
  1638     typedef GR Digraph;
  1633     typedef DGR Digraph;
  1639     /// The type of the arc filter map.
  1634     /// The type of the arc filter map.
  1640     typedef AF ArcFilterMap;
  1635     typedef AF ArcFilterMap;
  1641 
  1636 
  1642     typedef DigraphAdaptorExtender<
  1637     typedef DigraphAdaptorExtender<
  1643       SubDigraphBase<GR, ConstMap<typename GR::Node, bool>, AF, false> >
  1638       SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >, 
  1644       Parent;
  1639                      AF, false> > Parent;
  1645 
  1640 
  1646     typedef typename Parent::Arc Arc;
  1641     typedef typename Parent::Arc Arc;
  1647 
  1642 
  1648   protected:
  1643   protected:
  1649     ConstMap<typename Digraph::Node, bool> const_true_map;
  1644     ConstMap<typename DGR::Node, Const<bool, true> > const_true_map;
  1650 
  1645 
  1651     FilterArcs() : const_true_map(true) {
  1646     FilterArcs() : const_true_map() {}
  1652       Parent::setNodeFilterMap(const_true_map);
       
  1653     }
       
  1654 
  1647 
  1655   public:
  1648   public:
  1656 
  1649 
  1657     /// \brief Constructor
  1650     /// \brief Constructor
  1658     ///
  1651     ///
  1659     /// Creates a subdigraph for the given digraph with the given arc
  1652     /// Creates a subdigraph for the given digraph with the given arc
  1660     /// filter map.
  1653     /// filter map.
  1661     FilterArcs(Digraph& digraph, ArcFilterMap& arc_filter)
  1654     FilterArcs(DGR& digraph, ArcFilterMap& arc_filter)
  1662       : Parent(), const_true_map(true) {
  1655       : Parent(), const_true_map() {
  1663       Parent::setDigraph(digraph);
  1656       Parent::initialize(digraph, const_true_map, arc_filter);
  1664       Parent::setNodeFilterMap(const_true_map);
       
  1665       Parent::setArcFilterMap(arc_filter);
       
  1666     }
  1657     }
  1667 
  1658 
  1668     /// \brief Sets the status of the given arc
  1659     /// \brief Sets the status of the given arc
  1669     ///
  1660     ///
  1670     /// This function sets the status of the given arc.
  1661     /// This function sets the status of the given arc.
  1696   /// \brief Returns a read-only FilterArcs adaptor
  1687   /// \brief Returns a read-only FilterArcs adaptor
  1697   ///
  1688   ///
  1698   /// This function just returns a read-only \ref FilterArcs adaptor.
  1689   /// This function just returns a read-only \ref FilterArcs adaptor.
  1699   /// \ingroup graph_adaptors
  1690   /// \ingroup graph_adaptors
  1700   /// \relates FilterArcs
  1691   /// \relates FilterArcs
  1701   template<typename GR, typename AF>
  1692   template<typename DGR, typename AF>
  1702   FilterArcs<const GR, AF>
  1693   FilterArcs<const DGR, AF>
  1703   filterArcs(const GR& digraph, AF& arc_filter_map) {
  1694   filterArcs(const DGR& digraph, AF& arc_filter) {
  1704     return FilterArcs<const GR, AF>(digraph, arc_filter_map);
  1695     return FilterArcs<const DGR, AF>(digraph, arc_filter);
  1705   }
  1696   }
  1706 
  1697 
  1707   template<typename GR, typename AF>
  1698   template<typename DGR, typename AF>
  1708   FilterArcs<const GR, const AF>
  1699   FilterArcs<const DGR, const AF>
  1709   filterArcs(const GR& digraph, const AF& arc_filter_map) {
  1700   filterArcs(const DGR& digraph, const AF& arc_filter) {
  1710     return FilterArcs<const GR, const AF>(digraph, arc_filter_map);
  1701     return FilterArcs<const DGR, const AF>(digraph, arc_filter);
  1711   }
  1702   }
  1712 
  1703 
  1713   /// \ingroup graph_adaptors
  1704   /// \ingroup graph_adaptors
  1714   ///
  1705   ///
  1715   /// \brief Adaptor class for hiding edges in a graph.
  1706   /// \brief Adaptor class for hiding edges in a graph.
  1741 #else
  1732 #else
  1742   template<typename GR,
  1733   template<typename GR,
  1743            typename EF = typename GR::template EdgeMap<bool> >
  1734            typename EF = typename GR::template EdgeMap<bool> >
  1744   class FilterEdges :
  1735   class FilterEdges :
  1745     public GraphAdaptorExtender<
  1736     public GraphAdaptorExtender<
  1746       SubGraphBase<GR, ConstMap<typename GR::Node,bool>, EF, false> > {
  1737       SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >, 
       
  1738                    EF, false> > {
  1747 #endif
  1739 #endif
  1748   public:
  1740   public:
  1749     /// The type of the adapted graph.
  1741     /// The type of the adapted graph.
  1750     typedef GR Graph;
  1742     typedef GR Graph;
  1751     /// The type of the edge filter map.
  1743     /// The type of the edge filter map.
  1752     typedef EF EdgeFilterMap;
  1744     typedef EF EdgeFilterMap;
  1753 
  1745 
  1754     typedef GraphAdaptorExtender<
  1746     typedef GraphAdaptorExtender<
  1755       SubGraphBase<GR, ConstMap<typename GR::Node,bool>, EF, false> >
  1747       SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >, 
  1756       Parent;
  1748                    EF, false> > Parent;
  1757 
  1749 
  1758     typedef typename Parent::Edge Edge;
  1750     typedef typename Parent::Edge Edge;
  1759 
  1751 
  1760   protected:
  1752   protected:
  1761     ConstMap<typename Graph::Node, bool> const_true_map;
  1753     ConstMap<typename GR::Node, Const<bool, true> > const_true_map;
  1762 
  1754 
  1763     FilterEdges() : const_true_map(true) {
  1755     FilterEdges() : const_true_map(true) {
  1764       Parent::setNodeFilterMap(const_true_map);
  1756       Parent::setNodeFilterMap(const_true_map);
  1765     }
  1757     }
  1766 
  1758 
  1768 
  1760 
  1769     /// \brief Constructor
  1761     /// \brief Constructor
  1770     ///
  1762     ///
  1771     /// Creates a subgraph for the given graph with the given edge
  1763     /// Creates a subgraph for the given graph with the given edge
  1772     /// filter map.
  1764     /// filter map.
  1773     FilterEdges(Graph& graph, EdgeFilterMap& edge_filter_map) :
  1765     FilterEdges(GR& graph, EF& edge_filter) 
  1774       Parent(), const_true_map(true) {
  1766       : Parent(), const_true_map() {
  1775       Parent::setGraph(graph);
  1767       Parent::initialize(graph, const_true_map, edge_filter);
  1776       Parent::setNodeFilterMap(const_true_map);
       
  1777       Parent::setEdgeFilterMap(edge_filter_map);
       
  1778     }
  1768     }
  1779 
  1769 
  1780     /// \brief Sets the status of the given edge
  1770     /// \brief Sets the status of the given edge
  1781     ///
  1771     ///
  1782     /// This function sets the status of the given edge.
  1772     /// This function sets the status of the given edge.
  1810   /// This function just returns a read-only \ref FilterEdges adaptor.
  1800   /// This function just returns a read-only \ref FilterEdges adaptor.
  1811   /// \ingroup graph_adaptors
  1801   /// \ingroup graph_adaptors
  1812   /// \relates FilterEdges
  1802   /// \relates FilterEdges
  1813   template<typename GR, typename EF>
  1803   template<typename GR, typename EF>
  1814   FilterEdges<const GR, EF>
  1804   FilterEdges<const GR, EF>
  1815   filterEdges(const GR& graph, EF& edge_filter_map) {
  1805   filterEdges(const GR& graph, EF& edge_filter) {
  1816     return FilterEdges<const GR, EF>(graph, edge_filter_map);
  1806     return FilterEdges<const GR, EF>(graph, edge_filter);
  1817   }
  1807   }
  1818 
  1808 
  1819   template<typename GR, typename EF>
  1809   template<typename GR, typename EF>
  1820   FilterEdges<const GR, const EF>
  1810   FilterEdges<const GR, const EF>
  1821   filterEdges(const GR& graph, const EF& edge_filter_map) {
  1811   filterEdges(const GR& graph, const EF& edge_filter) {
  1822     return FilterEdges<const GR, const EF>(graph, edge_filter_map);
  1812     return FilterEdges<const GR, const EF>(graph, edge_filter);
  1823   }
  1813   }
  1824 
  1814 
  1825 
  1815 
  1826   template <typename _Digraph>
  1816   template <typename DGR>
  1827   class UndirectorBase {
  1817   class UndirectorBase {
  1828   public:
  1818   public:
  1829     typedef _Digraph Digraph;
  1819     typedef DGR Digraph;
  1830     typedef UndirectorBase Adaptor;
  1820     typedef UndirectorBase Adaptor;
  1831 
  1821 
  1832     typedef True UndirectedTag;
  1822     typedef True UndirectedTag;
  1833 
  1823 
  1834     typedef typename Digraph::Arc Edge;
  1824     typedef typename Digraph::Arc Edge;
  2060       return INVALID;
  2050       return INVALID;
  2061     }
  2051     }
  2062 
  2052 
  2063   private:
  2053   private:
  2064 
  2054 
  2065     template <typename _Value>
  2055     template <typename V>
  2066     class ArcMapBase {
  2056     class ArcMapBase {
  2067     private:
  2057     private:
  2068 
  2058 
  2069       typedef typename Digraph::template ArcMap<_Value> MapImpl;
  2059       typedef typename DGR::template ArcMap<V> MapImpl;
  2070 
  2060 
  2071     public:
  2061     public:
  2072 
  2062 
  2073       typedef typename MapTraits<MapImpl>::ReferenceMapTag ReferenceMapTag;
  2063       typedef typename MapTraits<MapImpl>::ReferenceMapTag ReferenceMapTag;
  2074 
  2064 
  2075       typedef _Value Value;
  2065       typedef V Value;
  2076       typedef Arc Key;
  2066       typedef Arc Key;
  2077       typedef typename MapTraits<MapImpl>::ConstReturnValue ConstReturnValue;
  2067       typedef typename MapTraits<MapImpl>::ConstReturnValue ConstReturnValue;
  2078       typedef typename MapTraits<MapImpl>::ReturnValue ReturnValue;
  2068       typedef typename MapTraits<MapImpl>::ReturnValue ReturnValue;
  2079       typedef typename MapTraits<MapImpl>::ConstReturnValue ConstReference;
  2069       typedef typename MapTraits<MapImpl>::ConstReturnValue ConstReference;
  2080       typedef typename MapTraits<MapImpl>::ReturnValue Reference;
  2070       typedef typename MapTraits<MapImpl>::ReturnValue Reference;
  2081 
  2071 
  2082       ArcMapBase(const Adaptor& adaptor) :
  2072       ArcMapBase(const UndirectorBase<DGR>& adaptor) :
  2083         _forward(*adaptor._digraph), _backward(*adaptor._digraph) {}
  2073         _forward(*adaptor._digraph), _backward(*adaptor._digraph) {}
  2084 
  2074 
  2085       ArcMapBase(const Adaptor& adaptor, const Value& v)
  2075       ArcMapBase(const UndirectorBase<DGR>& adaptor, const V& value)
  2086         : _forward(*adaptor._digraph, v), _backward(*adaptor._digraph, v) {}
  2076         : _forward(*adaptor._digraph, value), 
  2087 
  2077           _backward(*adaptor._digraph, value) {}
  2088       void set(const Arc& a, const Value& v) {
  2078 
       
  2079       void set(const Arc& a, const V& value) {
  2089         if (direction(a)) {
  2080         if (direction(a)) {
  2090           _forward.set(a, v);
  2081           _forward.set(a, value);
  2091         } else {
  2082         } else {
  2092           _backward.set(a, v);
  2083           _backward.set(a, value);
  2093         }
  2084         }
  2094       }
  2085       }
  2095 
  2086 
  2096       ConstReturnValue operator[](const Arc& a) const {
  2087       ConstReturnValue operator[](const Arc& a) const {
  2097         if (direction(a)) {
  2088         if (direction(a)) {
  2115 
  2106 
  2116     };
  2107     };
  2117 
  2108 
  2118   public:
  2109   public:
  2119 
  2110 
  2120     template <typename _Value>
  2111     template <typename V>
  2121     class NodeMap : public Digraph::template NodeMap<_Value> {
  2112     class NodeMap : public DGR::template NodeMap<V> {
  2122     public:
  2113     public:
  2123 
  2114 
  2124       typedef _Value Value;
  2115       typedef V Value;
  2125       typedef typename Digraph::template NodeMap<Value> Parent;
  2116       typedef typename DGR::template NodeMap<Value> Parent;
  2126 
  2117 
  2127       explicit NodeMap(const Adaptor& adaptor)
  2118       explicit NodeMap(const UndirectorBase<DGR>& adaptor)
  2128         : Parent(*adaptor._digraph) {}
  2119         : Parent(*adaptor._digraph) {}
  2129 
  2120 
  2130       NodeMap(const Adaptor& adaptor, const _Value& value)
  2121       NodeMap(const UndirectorBase<DGR>& adaptor, const V& value)
  2131         : Parent(*adaptor._digraph, value) { }
  2122         : Parent(*adaptor._digraph, value) { }
  2132 
  2123 
  2133     private:
  2124     private:
  2134       NodeMap& operator=(const NodeMap& cmap) {
  2125       NodeMap& operator=(const NodeMap& cmap) {
  2135         return operator=<NodeMap>(cmap);
  2126         return operator=<NodeMap>(cmap);
  2141         return *this;
  2132         return *this;
  2142       }
  2133       }
  2143 
  2134 
  2144     };
  2135     };
  2145 
  2136 
  2146     template <typename _Value>
  2137     template <typename V>
  2147     class ArcMap
  2138     class ArcMap
  2148       : public SubMapExtender<Adaptor, ArcMapBase<_Value> >
  2139       : public SubMapExtender<UndirectorBase<DGR>, ArcMapBase<V> >
  2149     {
  2140     {
  2150     public:
  2141     public:
  2151       typedef _Value Value;
  2142       typedef V Value;
  2152       typedef SubMapExtender<Adaptor, ArcMapBase<Value> > Parent;
  2143       typedef SubMapExtender<Adaptor, ArcMapBase<V> > Parent;
  2153 
  2144 
  2154       explicit ArcMap(const Adaptor& adaptor)
  2145       explicit ArcMap(const UndirectorBase<DGR>& adaptor)
  2155         : Parent(adaptor) {}
  2146         : Parent(adaptor) {}
  2156 
  2147 
  2157       ArcMap(const Adaptor& adaptor, const Value& value)
  2148       ArcMap(const UndirectorBase<DGR>& adaptor, const V& value)
  2158         : Parent(adaptor, value) {}
  2149         : Parent(adaptor, value) {}
  2159 
  2150 
  2160     private:
  2151     private:
  2161       ArcMap& operator=(const ArcMap& cmap) {
  2152       ArcMap& operator=(const ArcMap& cmap) {
  2162         return operator=<ArcMap>(cmap);
  2153         return operator=<ArcMap>(cmap);
  2167         Parent::operator=(cmap);
  2158         Parent::operator=(cmap);
  2168         return *this;
  2159         return *this;
  2169       }
  2160       }
  2170     };
  2161     };
  2171 
  2162 
  2172     template <typename _Value>
  2163     template <typename V>
  2173     class EdgeMap : public Digraph::template ArcMap<_Value> {
  2164     class EdgeMap : public Digraph::template ArcMap<V> {
  2174     public:
  2165     public:
  2175 
  2166 
  2176       typedef _Value Value;
  2167       typedef V Value;
  2177       typedef typename Digraph::template ArcMap<Value> Parent;
  2168       typedef typename Digraph::template ArcMap<V> Parent;
  2178 
  2169 
  2179       explicit EdgeMap(const Adaptor& adaptor)
  2170       explicit EdgeMap(const UndirectorBase<DGR>& adaptor)
  2180         : Parent(*adaptor._digraph) {}
  2171         : Parent(*adaptor._digraph) {}
  2181 
  2172 
  2182       EdgeMap(const Adaptor& adaptor, const Value& value)
  2173       EdgeMap(const UndirectorBase<DGR>& adaptor, const V& value)
  2183         : Parent(*adaptor._digraph, value) {}
  2174         : Parent(*adaptor._digraph, value) {}
  2184 
  2175 
  2185     private:
  2176     private:
  2186       EdgeMap& operator=(const EdgeMap& cmap) {
  2177       EdgeMap& operator=(const EdgeMap& cmap) {
  2187         return operator=<EdgeMap>(cmap);
  2178         return operator=<EdgeMap>(cmap);
  2193         return *this;
  2184         return *this;
  2194       }
  2185       }
  2195 
  2186 
  2196     };
  2187     };
  2197 
  2188 
  2198     typedef typename ItemSetTraits<Digraph, Node>::ItemNotifier NodeNotifier;
  2189     typedef typename ItemSetTraits<DGR, Node>::ItemNotifier NodeNotifier;
  2199     NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
  2190     NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
  2200 
  2191 
  2201     typedef typename ItemSetTraits<Digraph, Edge>::ItemNotifier EdgeNotifier;
  2192     typedef typename ItemSetTraits<DGR, Edge>::ItemNotifier EdgeNotifier;
  2202     EdgeNotifier& notifier(Edge) const { return _digraph->notifier(Edge()); }
  2193     EdgeNotifier& notifier(Edge) const { return _digraph->notifier(Edge()); }
  2203 
  2194 
  2204   protected:
  2195   protected:
  2205 
  2196 
  2206     UndirectorBase() : _digraph(0) {}
  2197     UndirectorBase() : _digraph(0) {}
  2207 
  2198 
  2208     Digraph* _digraph;
  2199     DGR* _digraph;
  2209 
  2200 
  2210     void setDigraph(Digraph& digraph) {
  2201     void initialize(DGR& digraph) {
  2211       _digraph = &digraph;
  2202       _digraph = &digraph;
  2212     }
  2203     }
  2213 
  2204 
  2214   };
  2205   };
  2215 
  2206 
  2224   ///
  2215   ///
  2225   /// The adapted digraph can also be modified through this adaptor
  2216   /// The adapted digraph can also be modified through this adaptor
  2226   /// by adding or removing nodes or edges, unless the \c GR template
  2217   /// by adding or removing nodes or edges, unless the \c GR template
  2227   /// parameter is set to be \c const.
  2218   /// parameter is set to be \c const.
  2228   ///
  2219   ///
  2229   /// \tparam GR The type of the adapted digraph.
  2220   /// \tparam DGR The type of the adapted digraph.
  2230   /// It must conform to the \ref concepts::Digraph "Digraph" concept.
  2221   /// It must conform to the \ref concepts::Digraph "Digraph" concept.
  2231   /// It can also be specified to be \c const.
  2222   /// It can also be specified to be \c const.
  2232   ///
  2223   ///
  2233   /// \note The \c Node type of this adaptor and the adapted digraph are
  2224   /// \note The \c Node type of this adaptor and the adapted digraph are
  2234   /// convertible to each other, moreover the \c Edge type of the adaptor
  2225   /// convertible to each other, moreover the \c Edge type of the adaptor
  2235   /// and the \c Arc type of the adapted digraph are also convertible to
  2226   /// and the \c Arc type of the adapted digraph are also convertible to
  2236   /// each other.
  2227   /// each other.
  2237   /// (Thus the \c Arc type of the adaptor is convertible to the \c Arc type
  2228   /// (Thus the \c Arc type of the adaptor is convertible to the \c Arc type
  2238   /// of the adapted digraph.)
  2229   /// of the adapted digraph.)
  2239   template<typename GR>
  2230   template<typename DGR>
  2240 #ifdef DOXYGEN
  2231 #ifdef DOXYGEN
  2241   class Undirector {
  2232   class Undirector {
  2242 #else
  2233 #else
  2243   class Undirector :
  2234   class Undirector :
  2244     public GraphAdaptorExtender<UndirectorBase<GR> > {
  2235     public GraphAdaptorExtender<UndirectorBase<DGR> > {
  2245 #endif
  2236 #endif
  2246   public:
  2237   public:
  2247     /// The type of the adapted digraph.
  2238     /// The type of the adapted digraph.
  2248     typedef GR Digraph;
  2239     typedef DGR Digraph;
  2249     typedef GraphAdaptorExtender<UndirectorBase<GR> > Parent;
  2240     typedef GraphAdaptorExtender<UndirectorBase<DGR> > Parent;
  2250   protected:
  2241   protected:
  2251     Undirector() { }
  2242     Undirector() { }
  2252   public:
  2243   public:
  2253 
  2244 
  2254     /// \brief Constructor
  2245     /// \brief Constructor
  2255     ///
  2246     ///
  2256     /// Creates an undirected graph from the given digraph.
  2247     /// Creates an undirected graph from the given digraph.
  2257     Undirector(Digraph& digraph) {
  2248     Undirector(DGR& digraph) {
  2258       setDigraph(digraph);
  2249       initialize(digraph);
  2259     }
  2250     }
  2260 
  2251 
  2261     /// \brief Arc map combined from two original arc maps
  2252     /// \brief Arc map combined from two original arc maps
  2262     ///
  2253     ///
  2263     /// This map adaptor class adapts two arc maps of the underlying
  2254     /// This map adaptor class adapts two arc maps of the underlying
  2353   /// \brief Returns a read-only Undirector adaptor
  2344   /// \brief Returns a read-only Undirector adaptor
  2354   ///
  2345   ///
  2355   /// This function just returns a read-only \ref Undirector adaptor.
  2346   /// This function just returns a read-only \ref Undirector adaptor.
  2356   /// \ingroup graph_adaptors
  2347   /// \ingroup graph_adaptors
  2357   /// \relates Undirector
  2348   /// \relates Undirector
  2358   template<typename GR>
  2349   template<typename DGR>
  2359   Undirector<const GR> undirector(const GR& digraph) {
  2350   Undirector<const DGR> undirector(const DGR& digraph) {
  2360     return Undirector<const GR>(digraph);
  2351     return Undirector<const DGR>(digraph);
  2361   }
  2352   }
  2362 
  2353 
  2363 
  2354 
  2364   template <typename _Graph, typename _DirectionMap>
  2355   template <typename GR, typename DM>
  2365   class OrienterBase {
  2356   class OrienterBase {
  2366   public:
  2357   public:
  2367 
  2358 
  2368     typedef _Graph Graph;
  2359     typedef GR Graph;
  2369     typedef _DirectionMap DirectionMap;
  2360     typedef DM DirectionMap;
  2370 
  2361 
  2371     typedef typename Graph::Node Node;
  2362     typedef typename GR::Node Node;
  2372     typedef typename Graph::Edge Arc;
  2363     typedef typename GR::Edge Arc;
  2373 
  2364 
  2374     void reverseArc(const Arc& arc) {
  2365     void reverseArc(const Arc& arc) {
  2375       _direction->set(arc, !(*_direction)[arc]);
  2366       _direction->set(arc, !(*_direction)[arc]);
  2376     }
  2367     }
  2377 
  2368 
  2446     Arc arcFromId(int idx) const { return _graph->edgeFromId(idx); }
  2437     Arc arcFromId(int idx) const { return _graph->edgeFromId(idx); }
  2447 
  2438 
  2448     int maxNodeId() const { return _graph->maxNodeId(); }
  2439     int maxNodeId() const { return _graph->maxNodeId(); }
  2449     int maxArcId() const { return _graph->maxEdgeId(); }
  2440     int maxArcId() const { return _graph->maxEdgeId(); }
  2450 
  2441 
  2451     typedef typename ItemSetTraits<Graph, Node>::ItemNotifier NodeNotifier;
  2442     typedef typename ItemSetTraits<GR, Node>::ItemNotifier NodeNotifier;
  2452     NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); }
  2443     NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); }
  2453 
  2444 
  2454     typedef typename ItemSetTraits<Graph, Arc>::ItemNotifier ArcNotifier;
  2445     typedef typename ItemSetTraits<GR, Arc>::ItemNotifier ArcNotifier;
  2455     ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); }
  2446     ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); }
  2456 
  2447 
  2457     template <typename _Value>
  2448     template <typename V>
  2458     class NodeMap : public _Graph::template NodeMap<_Value> {
  2449     class NodeMap : public GR::template NodeMap<V> {
  2459     public:
  2450     public:
  2460 
  2451 
  2461       typedef typename _Graph::template NodeMap<_Value> Parent;
  2452       typedef typename GR::template NodeMap<V> Parent;
  2462 
  2453 
  2463       explicit NodeMap(const OrienterBase& adapter)
  2454       explicit NodeMap(const OrienterBase<GR, DM>& adapter)
  2464         : Parent(*adapter._graph) {}
  2455         : Parent(*adapter._graph) {}
  2465 
  2456 
  2466       NodeMap(const OrienterBase& adapter, const _Value& value)
  2457       NodeMap(const OrienterBase<GR, DM>& adapter, const V& value)
  2467         : Parent(*adapter._graph, value) {}
  2458         : Parent(*adapter._graph, value) {}
  2468 
  2459 
  2469     private:
  2460     private:
  2470       NodeMap& operator=(const NodeMap& cmap) {
  2461       NodeMap& operator=(const NodeMap& cmap) {
  2471         return operator=<NodeMap>(cmap);
  2462         return operator=<NodeMap>(cmap);
  2477         return *this;
  2468         return *this;
  2478       }
  2469       }
  2479 
  2470 
  2480     };
  2471     };
  2481 
  2472 
  2482     template <typename _Value>
  2473     template <typename V>
  2483     class ArcMap : public _Graph::template EdgeMap<_Value> {
  2474     class ArcMap : public GR::template EdgeMap<V> {
  2484     public:
  2475     public:
  2485 
  2476 
  2486       typedef typename Graph::template EdgeMap<_Value> Parent;
  2477       typedef typename Graph::template EdgeMap<V> Parent;
  2487 
  2478 
  2488       explicit ArcMap(const OrienterBase& adapter)
  2479       explicit ArcMap(const OrienterBase<GR, DM>& adapter)
  2489         : Parent(*adapter._graph) { }
  2480         : Parent(*adapter._graph) { }
  2490 
  2481 
  2491       ArcMap(const OrienterBase& adapter, const _Value& value)
  2482       ArcMap(const OrienterBase<GR, DM>& adapter, const V& value)
  2492         : Parent(*adapter._graph, value) { }
  2483         : Parent(*adapter._graph, value) { }
  2493 
  2484 
  2494     private:
  2485     private:
  2495       ArcMap& operator=(const ArcMap& cmap) {
  2486       ArcMap& operator=(const ArcMap& cmap) {
  2496         return operator=<ArcMap>(cmap);
  2487         return operator=<ArcMap>(cmap);
  2505 
  2496 
  2506 
  2497 
  2507 
  2498 
  2508   protected:
  2499   protected:
  2509     Graph* _graph;
  2500     Graph* _graph;
  2510     DirectionMap* _direction;
  2501     DM* _direction;
  2511 
  2502 
  2512     void setDirectionMap(DirectionMap& direction) {
  2503     void initialize(GR& graph, DM& direction) {
       
  2504       _graph = &graph;
  2513       _direction = &direction;
  2505       _direction = &direction;
  2514     }
       
  2515 
       
  2516     void setGraph(Graph& graph) {
       
  2517       _graph = &graph;
       
  2518     }
  2506     }
  2519 
  2507 
  2520   };
  2508   };
  2521 
  2509 
  2522   /// \ingroup graph_adaptors
  2510   /// \ingroup graph_adaptors
  2570   public:
  2558   public:
  2571 
  2559 
  2572     /// \brief Constructor
  2560     /// \brief Constructor
  2573     ///
  2561     ///
  2574     /// Constructor of the adaptor.
  2562     /// Constructor of the adaptor.
  2575     Orienter(Graph& graph, DirectionMap& direction) {
  2563     Orienter(GR& graph, DM& direction) {
  2576       setGraph(graph);
  2564       Parent::initialize(graph, direction);
  2577       setDirectionMap(direction);
       
  2578     }
  2565     }
  2579 
  2566 
  2580     /// \brief Reverses the given arc
  2567     /// \brief Reverses the given arc
  2581     ///
  2568     ///
  2582     /// This function reverses the given arc.
  2569     /// This function reverses the given arc.
  2592   /// This function just returns a read-only \ref Orienter adaptor.
  2579   /// This function just returns a read-only \ref Orienter adaptor.
  2593   /// \ingroup graph_adaptors
  2580   /// \ingroup graph_adaptors
  2594   /// \relates Orienter
  2581   /// \relates Orienter
  2595   template<typename GR, typename DM>
  2582   template<typename GR, typename DM>
  2596   Orienter<const GR, DM>
  2583   Orienter<const GR, DM>
  2597   orienter(const GR& graph, DM& direction_map) {
  2584   orienter(const GR& graph, DM& direction) {
  2598     return Orienter<const GR, DM>(graph, direction_map);
  2585     return Orienter<const GR, DM>(graph, direction);
  2599   }
  2586   }
  2600 
  2587 
  2601   template<typename GR, typename DM>
  2588   template<typename GR, typename DM>
  2602   Orienter<const GR, const DM>
  2589   Orienter<const GR, const DM>
  2603   orienter(const GR& graph, const DM& direction_map) {
  2590   orienter(const GR& graph, const DM& direction) {
  2604     return Orienter<const GR, const DM>(graph, direction_map);
  2591     return Orienter<const GR, const DM>(graph, direction);
  2605   }
  2592   }
  2606 
  2593 
  2607   namespace _adaptor_bits {
  2594   namespace _adaptor_bits {
  2608 
  2595 
  2609     template<typename Digraph,
  2596     template <typename DGR, typename CM, typename FM, typename TL>
  2610              typename CapacityMap,
       
  2611              typename FlowMap,
       
  2612              typename Tolerance>
       
  2613     class ResForwardFilter {
  2597     class ResForwardFilter {
  2614     public:
  2598     public:
  2615 
  2599 
  2616       typedef typename Digraph::Arc Key;
  2600       typedef typename DGR::Arc Key;
  2617       typedef bool Value;
  2601       typedef bool Value;
  2618 
  2602 
  2619     private:
  2603     private:
  2620 
  2604 
  2621       const CapacityMap* _capacity;
  2605       const CM* _capacity;
  2622       const FlowMap* _flow;
  2606       const FM* _flow;
  2623       Tolerance _tolerance;
  2607       TL _tolerance;
       
  2608 
  2624     public:
  2609     public:
  2625 
  2610 
  2626       ResForwardFilter(const CapacityMap& capacity, const FlowMap& flow,
  2611       ResForwardFilter(const CM& capacity, const FM& flow,
  2627                        const Tolerance& tolerance = Tolerance())
  2612                        const TL& tolerance = TL())
  2628         : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
  2613         : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
  2629 
  2614 
  2630       bool operator[](const typename Digraph::Arc& a) const {
  2615       bool operator[](const typename DGR::Arc& a) const {
  2631         return _tolerance.positive((*_capacity)[a] - (*_flow)[a]);
  2616         return _tolerance.positive((*_capacity)[a] - (*_flow)[a]);
  2632       }
  2617       }
  2633     };
  2618     };
  2634 
  2619 
  2635     template<typename Digraph,
  2620     template<typename DGR,typename CM, typename FM, typename TL>
  2636              typename CapacityMap,
       
  2637              typename FlowMap,
       
  2638              typename Tolerance>
       
  2639     class ResBackwardFilter {
  2621     class ResBackwardFilter {
  2640     public:
  2622     public:
  2641 
  2623 
  2642       typedef typename Digraph::Arc Key;
  2624       typedef typename DGR::Arc Key;
  2643       typedef bool Value;
  2625       typedef bool Value;
  2644 
  2626 
  2645     private:
  2627     private:
  2646 
  2628 
  2647       const CapacityMap* _capacity;
  2629       const CM* _capacity;
  2648       const FlowMap* _flow;
  2630       const FM* _flow;
  2649       Tolerance _tolerance;
  2631       TL _tolerance;
  2650 
  2632 
  2651     public:
  2633     public:
  2652 
  2634 
  2653       ResBackwardFilter(const CapacityMap& capacity, const FlowMap& flow,
  2635       ResBackwardFilter(const CM& capacity, const FM& flow,
  2654                         const Tolerance& tolerance = Tolerance())
  2636                         const TL& tolerance = TL())
  2655         : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
  2637         : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
  2656 
  2638 
  2657       bool operator[](const typename Digraph::Arc& a) const {
  2639       bool operator[](const typename DGR::Arc& a) const {
  2658         return _tolerance.positive((*_flow)[a]);
  2640         return _tolerance.positive((*_flow)[a]);
  2659       }
  2641       }
  2660     };
  2642     };
  2661 
  2643 
  2662   }
  2644   }
  2679   /// multiplicities are counted, i.e. the adaptor has exactly
  2661   /// multiplicities are counted, i.e. the adaptor has exactly
  2680   /// \f$ |A_{forward}| + |A_{backward}|\f$ arcs (it may have parallel
  2662   /// \f$ |A_{forward}| + |A_{backward}|\f$ arcs (it may have parallel
  2681   /// arcs).
  2663   /// arcs).
  2682   /// This class conforms to the \ref concepts::Digraph "Digraph" concept.
  2664   /// This class conforms to the \ref concepts::Digraph "Digraph" concept.
  2683   ///
  2665   ///
  2684   /// \tparam GR The type of the adapted digraph.
  2666   /// \tparam DGR The type of the adapted digraph.
  2685   /// It must conform to the \ref concepts::Digraph "Digraph" concept.
  2667   /// It must conform to the \ref concepts::Digraph "Digraph" concept.
  2686   /// It is implicitly \c const.
  2668   /// It is implicitly \c const.
  2687   /// \tparam CM The type of the capacity map.
  2669   /// \tparam CM The type of the capacity map.
  2688   /// It must be an arc map of some numerical type, which defines
  2670   /// It must be an arc map of some numerical type, which defines
  2689   /// the capacities in the flow problem. It is implicitly \c const.
  2671   /// the capacities in the flow problem. It is implicitly \c const.
  2701   ///
  2683   ///
  2702   /// \note The \c Node type of this adaptor and the adapted digraph are
  2684   /// \note The \c Node type of this adaptor and the adapted digraph are
  2703   /// convertible to each other, moreover the \c Arc type of the adaptor
  2685   /// convertible to each other, moreover the \c Arc type of the adaptor
  2704   /// is convertible to the \c Arc type of the adapted digraph.
  2686   /// is convertible to the \c Arc type of the adapted digraph.
  2705 #ifdef DOXYGEN
  2687 #ifdef DOXYGEN
  2706   template<typename GR, typename CM, typename FM, typename TL>
  2688   template<typename DGR, typename CM, typename FM, typename TL>
  2707   class ResidualDigraph
  2689   class ResidualDigraph
  2708 #else
  2690 #else
  2709   template<typename GR,
  2691   template<typename DGR,
  2710            typename CM = typename GR::template ArcMap<int>,
  2692            typename CM = typename DGR::template ArcMap<int>,
  2711            typename FM = CM,
  2693            typename FM = CM,
  2712            typename TL = Tolerance<typename CM::Value> >
  2694            typename TL = Tolerance<typename CM::Value> >
  2713   class ResidualDigraph :
  2695   class ResidualDigraph 
  2714     public FilterArcs<
  2696     : public SubDigraph<
  2715       Undirector<const GR>,
  2697         Undirector<const DGR>,
  2716       typename Undirector<const GR>::template CombinedArcMap<
  2698         ConstMap<typename DGR::Node, Const<bool, true> >,
  2717         _adaptor_bits::ResForwardFilter<const GR, CM, FM, TL>,
  2699         typename Undirector<const DGR>::template CombinedArcMap<
  2718         _adaptor_bits::ResBackwardFilter<const GR, CM, FM, TL> > >
  2700           _adaptor_bits::ResForwardFilter<const DGR, CM, FM, TL>,
       
  2701           _adaptor_bits::ResBackwardFilter<const DGR, CM, FM, TL> > >
  2719 #endif
  2702 #endif
  2720   {
  2703   {
  2721   public:
  2704   public:
  2722 
  2705 
  2723     /// The type of the underlying digraph.
  2706     /// The type of the underlying digraph.
  2724     typedef GR Digraph;
  2707     typedef DGR Digraph;
  2725     /// The type of the capacity map.
  2708     /// The type of the capacity map.
  2726     typedef CM CapacityMap;
  2709     typedef CM CapacityMap;
  2727     /// The type of the flow map.
  2710     /// The type of the flow map.
  2728     typedef FM FlowMap;
  2711     typedef FM FlowMap;
  2729     /// The tolerance type.
  2712     /// The tolerance type.
  2734 
  2717 
  2735   protected:
  2718   protected:
  2736 
  2719 
  2737     typedef Undirector<const Digraph> Undirected;
  2720     typedef Undirector<const Digraph> Undirected;
  2738 
  2721 
  2739     typedef _adaptor_bits::ResForwardFilter<const Digraph, CapacityMap,
  2722     typedef ConstMap<typename DGR::Node, Const<bool, true> > NodeFilter;
  2740                                             FlowMap, Tolerance> ForwardFilter;
  2723 
  2741 
  2724     typedef _adaptor_bits::ResForwardFilter<const DGR, CM,
  2742     typedef _adaptor_bits::ResBackwardFilter<const Digraph, CapacityMap,
  2725                                             FM, TL> ForwardFilter;
  2743                                              FlowMap, Tolerance> BackwardFilter;
  2726 
       
  2727     typedef _adaptor_bits::ResBackwardFilter<const DGR, CM,
       
  2728                                              FM, TL> BackwardFilter;
  2744 
  2729 
  2745     typedef typename Undirected::
  2730     typedef typename Undirected::
  2746       template CombinedArcMap<ForwardFilter, BackwardFilter> ArcFilter;
  2731       template CombinedArcMap<ForwardFilter, BackwardFilter> ArcFilter;
  2747 
  2732 
  2748     typedef FilterArcs<Undirected, ArcFilter> Parent;
  2733     typedef SubDigraph<Undirected, NodeFilter, ArcFilter> Parent;
  2749 
  2734 
  2750     const CapacityMap* _capacity;
  2735     const CapacityMap* _capacity;
  2751     FlowMap* _flow;
  2736     FlowMap* _flow;
  2752 
  2737 
  2753     Undirected _graph;
  2738     Undirected _graph;
       
  2739     NodeFilter _node_filter;
  2754     ForwardFilter _forward_filter;
  2740     ForwardFilter _forward_filter;
  2755     BackwardFilter _backward_filter;
  2741     BackwardFilter _backward_filter;
  2756     ArcFilter _arc_filter;
  2742     ArcFilter _arc_filter;
  2757 
  2743 
  2758   public:
  2744   public:
  2759 
  2745 
  2760     /// \brief Constructor
  2746     /// \brief Constructor
  2761     ///
  2747     ///
  2762     /// Constructor of the residual digraph adaptor. The parameters are the
  2748     /// Constructor of the residual digraph adaptor. The parameters are the
  2763     /// digraph, the capacity map, the flow map, and a tolerance object.
  2749     /// digraph, the capacity map, the flow map, and a tolerance object.
  2764     ResidualDigraph(const Digraph& digraph, const CapacityMap& capacity,
  2750     ResidualDigraph(const DGR& digraph, const CM& capacity,
  2765                     FlowMap& flow, const Tolerance& tolerance = Tolerance())
  2751                     FM& flow, const TL& tolerance = Tolerance())
  2766       : Parent(), _capacity(&capacity), _flow(&flow), _graph(digraph),
  2752       : Parent(), _capacity(&capacity), _flow(&flow), 
       
  2753         _graph(digraph), _node_filter(),
  2767         _forward_filter(capacity, flow, tolerance),
  2754         _forward_filter(capacity, flow, tolerance),
  2768         _backward_filter(capacity, flow, tolerance),
  2755         _backward_filter(capacity, flow, tolerance),
  2769         _arc_filter(_forward_filter, _backward_filter)
  2756         _arc_filter(_forward_filter, _backward_filter)
  2770     {
  2757     {
  2771       Parent::setDigraph(_graph);
  2758       Parent::initialize(_graph, _node_filter, _arc_filter);
  2772       Parent::setArcFilterMap(_arc_filter);
       
  2773     }
  2759     }
  2774 
  2760 
  2775     typedef typename Parent::Arc Arc;
  2761     typedef typename Parent::Arc Arc;
  2776 
  2762 
  2777     /// \brief Returns the residual capacity of the given arc.
  2763     /// \brief Returns the residual capacity of the given arc.
  2843       typedef Arc Key;
  2829       typedef Arc Key;
  2844       /// The value type of the map
  2830       /// The value type of the map
  2845       typedef typename CapacityMap::Value Value;
  2831       typedef typename CapacityMap::Value Value;
  2846 
  2832 
  2847       /// Constructor
  2833       /// Constructor
  2848       ResidualCapacity(const Adaptor& adaptor) : _adaptor(&adaptor) {}
  2834       ResidualCapacity(const ResidualDigraph<DGR, CM, FM, TL>& adaptor) 
       
  2835         : _adaptor(&adaptor) {}
  2849 
  2836 
  2850       /// Returns the value associated with the given residual arc
  2837       /// Returns the value associated with the given residual arc
  2851       Value operator[](const Arc& a) const {
  2838       Value operator[](const Arc& a) const {
  2852         return _adaptor->residualCapacity(a);
  2839         return _adaptor->residualCapacity(a);
  2853       }
  2840       }
  2863 
  2850 
  2864   };
  2851   };
  2865 
  2852 
  2866   /// \brief Returns a (read-only) Residual adaptor
  2853   /// \brief Returns a (read-only) Residual adaptor
  2867   ///
  2854   ///
  2868   /// This function just returns a (read-only) \ref Residual adaptor.
  2855   /// This function just returns a (read-only) \ref ResidualDigraph adaptor.
  2869   /// \ingroup graph_adaptors
  2856   /// \ingroup graph_adaptors
  2870   /// \relates Residual
  2857   /// \relates ResidualDigraph
  2871   template<typename GR, typename CM, typename FM>
  2858     template<typename DGR, typename CM, typename FM>
  2872   ResidualDigraph<GR, CM, FM>
  2859   ResidualDigraph<DGR, CM, FM>
  2873   residualDigraph(const GR& digraph, const CM& capacity_map, FM& flow_map) {
  2860   residualDigraph(const DGR& digraph, const CM& capacity_map, FM& flow_map) {
  2874     return ResidualDigraph<GR, CM, FM> (digraph, capacity_map, flow_map);
  2861     return ResidualDigraph<DGR, CM, FM> (digraph, capacity_map, flow_map);
  2875   }
  2862   }
  2876 
  2863 
  2877 
  2864 
  2878   template <typename _Digraph>
  2865   template <typename DGR>
  2879   class SplitNodesBase {
  2866   class SplitNodesBase {
  2880   public:
  2867   public:
  2881 
  2868 
  2882     typedef _Digraph Digraph;
  2869     typedef DGR Digraph;
  2883     typedef DigraphAdaptorBase<const _Digraph> Parent;
  2870     typedef DigraphAdaptorBase<const DGR> Parent;
  2884     typedef SplitNodesBase Adaptor;
  2871     typedef SplitNodesBase Adaptor;
  2885 
  2872 
  2886     typedef typename Digraph::Node DigraphNode;
  2873     typedef typename DGR::Node DigraphNode;
  2887     typedef typename Digraph::Arc DigraphArc;
  2874     typedef typename DGR::Arc DigraphArc;
  2888 
  2875 
  2889     class Node;
  2876     class Node;
  2890     class Arc;
  2877     class Arc;
  2891 
  2878 
  2892   private:
  2879   private:
  3146       return INVALID;
  3133       return INVALID;
  3147     }
  3134     }
  3148 
  3135 
  3149   private:
  3136   private:
  3150 
  3137 
  3151     template <typename _Value>
  3138     template <typename V>
  3152     class NodeMapBase
  3139     class NodeMapBase
  3153       : public MapTraits<typename Parent::template NodeMap<_Value> > {
  3140       : public MapTraits<typename Parent::template NodeMap<V> > {
  3154       typedef typename Parent::template NodeMap<_Value> NodeImpl;
  3141       typedef typename Parent::template NodeMap<V> NodeImpl;
  3155     public:
  3142     public:
  3156       typedef Node Key;
  3143       typedef Node Key;
  3157       typedef _Value Value;
  3144       typedef V Value;
  3158       typedef typename MapTraits<NodeImpl>::ReferenceMapTag ReferenceMapTag;
  3145       typedef typename MapTraits<NodeImpl>::ReferenceMapTag ReferenceMapTag;
  3159       typedef typename MapTraits<NodeImpl>::ReturnValue ReturnValue;
  3146       typedef typename MapTraits<NodeImpl>::ReturnValue ReturnValue;
  3160       typedef typename MapTraits<NodeImpl>::ConstReturnValue ConstReturnValue;
  3147       typedef typename MapTraits<NodeImpl>::ConstReturnValue ConstReturnValue;
  3161       typedef typename MapTraits<NodeImpl>::ReturnValue Reference;
  3148       typedef typename MapTraits<NodeImpl>::ReturnValue Reference;
  3162       typedef typename MapTraits<NodeImpl>::ConstReturnValue ConstReference;
  3149       typedef typename MapTraits<NodeImpl>::ConstReturnValue ConstReference;
  3163 
  3150 
  3164       NodeMapBase(const Adaptor& adaptor)
  3151       NodeMapBase(const SplitNodesBase<DGR>& adaptor)
  3165         : _in_map(*adaptor._digraph), _out_map(*adaptor._digraph) {}
  3152         : _in_map(*adaptor._digraph), _out_map(*adaptor._digraph) {}
  3166       NodeMapBase(const Adaptor& adaptor, const Value& value)
  3153       NodeMapBase(const SplitNodesBase<DGR>& adaptor, const V& value)
  3167         : _in_map(*adaptor._digraph, value),
  3154         : _in_map(*adaptor._digraph, value),
  3168           _out_map(*adaptor._digraph, value) {}
  3155           _out_map(*adaptor._digraph, value) {}
  3169 
  3156 
  3170       void set(const Node& key, const Value& val) {
  3157       void set(const Node& key, const V& val) {
  3171         if (Adaptor::inNode(key)) { _in_map.set(key, val); }
  3158         if (SplitNodesBase<DGR>::inNode(key)) { _in_map.set(key, val); }
  3172         else {_out_map.set(key, val); }
  3159         else {_out_map.set(key, val); }
  3173       }
  3160       }
  3174 
  3161 
  3175       ReturnValue operator[](const Node& key) {
  3162       ReturnValue operator[](const Node& key) {
  3176         if (Adaptor::inNode(key)) { return _in_map[key]; }
  3163         if (SplitNodesBase<DGR>::inNode(key)) { return _in_map[key]; }
  3177         else { return _out_map[key]; }
  3164         else { return _out_map[key]; }
  3178       }
  3165       }
  3179 
  3166 
  3180       ConstReturnValue operator[](const Node& key) const {
  3167       ConstReturnValue operator[](const Node& key) const {
  3181         if (Adaptor::inNode(key)) { return _in_map[key]; }
  3168         if (Adaptor::inNode(key)) { return _in_map[key]; }
  3184 
  3171 
  3185     private:
  3172     private:
  3186       NodeImpl _in_map, _out_map;
  3173       NodeImpl _in_map, _out_map;
  3187     };
  3174     };
  3188 
  3175 
  3189     template <typename _Value>
  3176     template <typename V>
  3190     class ArcMapBase
  3177     class ArcMapBase
  3191       : public MapTraits<typename Parent::template ArcMap<_Value> > {
  3178       : public MapTraits<typename Parent::template ArcMap<V> > {
  3192       typedef typename Parent::template ArcMap<_Value> ArcImpl;
  3179       typedef typename Parent::template ArcMap<V> ArcImpl;
  3193       typedef typename Parent::template NodeMap<_Value> NodeImpl;
  3180       typedef typename Parent::template NodeMap<V> NodeImpl;
  3194     public:
  3181     public:
  3195       typedef Arc Key;
  3182       typedef Arc Key;
  3196       typedef _Value Value;
  3183       typedef V Value;
  3197       typedef typename MapTraits<ArcImpl>::ReferenceMapTag ReferenceMapTag;
  3184       typedef typename MapTraits<ArcImpl>::ReferenceMapTag ReferenceMapTag;
  3198       typedef typename MapTraits<ArcImpl>::ReturnValue ReturnValue;
  3185       typedef typename MapTraits<ArcImpl>::ReturnValue ReturnValue;
  3199       typedef typename MapTraits<ArcImpl>::ConstReturnValue ConstReturnValue;
  3186       typedef typename MapTraits<ArcImpl>::ConstReturnValue ConstReturnValue;
  3200       typedef typename MapTraits<ArcImpl>::ReturnValue Reference;
  3187       typedef typename MapTraits<ArcImpl>::ReturnValue Reference;
  3201       typedef typename MapTraits<ArcImpl>::ConstReturnValue ConstReference;
  3188       typedef typename MapTraits<ArcImpl>::ConstReturnValue ConstReference;
  3202 
  3189 
  3203       ArcMapBase(const Adaptor& adaptor)
  3190       ArcMapBase(const SplitNodesBase<DGR>& adaptor)
  3204         : _arc_map(*adaptor._digraph), _node_map(*adaptor._digraph) {}
  3191         : _arc_map(*adaptor._digraph), _node_map(*adaptor._digraph) {}
  3205       ArcMapBase(const Adaptor& adaptor, const Value& value)
  3192       ArcMapBase(const SplitNodesBase<DGR>& adaptor, const V& value)
  3206         : _arc_map(*adaptor._digraph, value),
  3193         : _arc_map(*adaptor._digraph, value),
  3207           _node_map(*adaptor._digraph, value) {}
  3194           _node_map(*adaptor._digraph, value) {}
  3208 
  3195 
  3209       void set(const Arc& key, const Value& val) {
  3196       void set(const Arc& key, const V& val) {
  3210         if (Adaptor::origArc(key)) {
  3197         if (SplitNodesBase<DGR>::origArc(key)) {
  3211           _arc_map.set(key._item.first(), val);
  3198           _arc_map.set(key._item.first(), val);
  3212         } else {
  3199         } else {
  3213           _node_map.set(key._item.second(), val);
  3200           _node_map.set(key._item.second(), val);
  3214         }
  3201         }
  3215       }
  3202       }
  3216 
  3203 
  3217       ReturnValue operator[](const Arc& key) {
  3204       ReturnValue operator[](const Arc& key) {
  3218         if (Adaptor::origArc(key)) {
  3205         if (SplitNodesBase<DGR>::origArc(key)) {
  3219           return _arc_map[key._item.first()];
  3206           return _arc_map[key._item.first()];
  3220         } else {
  3207         } else {
  3221           return _node_map[key._item.second()];
  3208           return _node_map[key._item.second()];
  3222         }
  3209         }
  3223       }
  3210       }
  3224 
  3211 
  3225       ConstReturnValue operator[](const Arc& key) const {
  3212       ConstReturnValue operator[](const Arc& key) const {
  3226         if (Adaptor::origArc(key)) {
  3213         if (SplitNodesBase<DGR>::origArc(key)) {
  3227           return _arc_map[key._item.first()];
  3214           return _arc_map[key._item.first()];
  3228         } else {
  3215         } else {
  3229           return _node_map[key._item.second()];
  3216           return _node_map[key._item.second()];
  3230         }
  3217         }
  3231       }
  3218       }
  3235       NodeImpl _node_map;
  3222       NodeImpl _node_map;
  3236     };
  3223     };
  3237 
  3224 
  3238   public:
  3225   public:
  3239 
  3226 
  3240     template <typename _Value>
  3227     template <typename V>
  3241     class NodeMap
  3228     class NodeMap
  3242       : public SubMapExtender<Adaptor, NodeMapBase<_Value> >
  3229       : public SubMapExtender<SplitNodesBase<DGR>, NodeMapBase<V> >
  3243     {
  3230     {
  3244     public:
  3231     public:
  3245       typedef _Value Value;
  3232       typedef V Value;
  3246       typedef SubMapExtender<Adaptor, NodeMapBase<Value> > Parent;
  3233       typedef SubMapExtender<SplitNodesBase<DGR>, NodeMapBase<Value> > Parent;
  3247 
  3234 
  3248       NodeMap(const Adaptor& adaptor)
  3235       NodeMap(const SplitNodesBase<DGR>& adaptor)
  3249         : Parent(adaptor) {}
  3236         : Parent(adaptor) {}
  3250 
  3237 
  3251       NodeMap(const Adaptor& adaptor, const Value& value)
  3238       NodeMap(const SplitNodesBase<DGR>& adaptor, const V& value)
  3252         : Parent(adaptor, value) {}
  3239         : Parent(adaptor, value) {}
  3253 
  3240 
  3254     private:
  3241     private:
  3255       NodeMap& operator=(const NodeMap& cmap) {
  3242       NodeMap& operator=(const NodeMap& cmap) {
  3256         return operator=<NodeMap>(cmap);
  3243         return operator=<NodeMap>(cmap);
  3261         Parent::operator=(cmap);
  3248         Parent::operator=(cmap);
  3262         return *this;
  3249         return *this;
  3263       }
  3250       }
  3264     };
  3251     };
  3265 
  3252 
  3266     template <typename _Value>
  3253     template <typename V>
  3267     class ArcMap
  3254     class ArcMap
  3268       : public SubMapExtender<Adaptor, ArcMapBase<_Value> >
  3255       : public SubMapExtender<SplitNodesBase<DGR>, ArcMapBase<V> >
  3269     {
  3256     {
  3270     public:
  3257     public:
  3271       typedef _Value Value;
  3258       typedef V Value;
  3272       typedef SubMapExtender<Adaptor, ArcMapBase<Value> > Parent;
  3259       typedef SubMapExtender<SplitNodesBase<DGR>, ArcMapBase<Value> > Parent;
  3273 
  3260 
  3274       ArcMap(const Adaptor& adaptor)
  3261       ArcMap(const SplitNodesBase<DGR>& adaptor)
  3275         : Parent(adaptor) {}
  3262         : Parent(adaptor) {}
  3276 
  3263 
  3277       ArcMap(const Adaptor& adaptor, const Value& value)
  3264       ArcMap(const SplitNodesBase<DGR>& adaptor, const V& value)
  3278         : Parent(adaptor, value) {}
  3265         : Parent(adaptor, value) {}
  3279 
  3266 
  3280     private:
  3267     private:
  3281       ArcMap& operator=(const ArcMap& cmap) {
  3268       ArcMap& operator=(const ArcMap& cmap) {
  3282         return operator=<ArcMap>(cmap);
  3269         return operator=<ArcMap>(cmap);
  3291 
  3278 
  3292   protected:
  3279   protected:
  3293 
  3280 
  3294     SplitNodesBase() : _digraph(0) {}
  3281     SplitNodesBase() : _digraph(0) {}
  3295 
  3282 
  3296     Digraph* _digraph;
  3283     DGR* _digraph;
  3297 
  3284 
  3298     void setDigraph(Digraph& digraph) {
  3285     void initialize(Digraph& digraph) {
  3299       _digraph = &digraph;
  3286       _digraph = &digraph;
  3300     }
  3287     }
  3301 
  3288 
  3302   };
  3289   };
  3303 
  3290 
  3320   /// capacities directly.
  3307   /// capacities directly.
  3321   /// In this case you can use \c SplitNodes adaptor, and set the node
  3308   /// In this case you can use \c SplitNodes adaptor, and set the node
  3322   /// costs/capacities of the original digraph to the \e bind \e arcs
  3309   /// costs/capacities of the original digraph to the \e bind \e arcs
  3323   /// in the adaptor.
  3310   /// in the adaptor.
  3324   ///
  3311   ///
  3325   /// \tparam GR The type of the adapted digraph.
  3312   /// \tparam DGR The type of the adapted digraph.
  3326   /// It must conform to the \ref concepts::Digraph "Digraph" concept.
  3313   /// It must conform to the \ref concepts::Digraph "Digraph" concept.
  3327   /// It is implicitly \c const.
  3314   /// It is implicitly \c const.
  3328   ///
  3315   ///
  3329   /// \note The \c Node type of this adaptor is converible to the \c Node
  3316   /// \note The \c Node type of this adaptor is converible to the \c Node
  3330   /// type of the adapted digraph.
  3317   /// type of the adapted digraph.
  3331   template <typename GR>
  3318   template <typename DGR>
  3332 #ifdef DOXYGEN
  3319 #ifdef DOXYGEN
  3333   class SplitNodes {
  3320   class SplitNodes {
  3334 #else
  3321 #else
  3335   class SplitNodes
  3322   class SplitNodes
  3336     : public DigraphAdaptorExtender<SplitNodesBase<const GR> > {
  3323     : public DigraphAdaptorExtender<SplitNodesBase<const DGR> > {
  3337 #endif
  3324 #endif
  3338   public:
  3325   public:
  3339     typedef GR Digraph;
  3326     typedef DGR Digraph;
  3340     typedef DigraphAdaptorExtender<SplitNodesBase<const GR> > Parent;
  3327     typedef DigraphAdaptorExtender<SplitNodesBase<const DGR> > Parent;
  3341 
  3328 
  3342     typedef typename Digraph::Node DigraphNode;
  3329     typedef typename DGR::Node DigraphNode;
  3343     typedef typename Digraph::Arc DigraphArc;
  3330     typedef typename DGR::Arc DigraphArc;
  3344 
  3331 
  3345     typedef typename Parent::Node Node;
  3332     typedef typename Parent::Node Node;
  3346     typedef typename Parent::Arc Arc;
  3333     typedef typename Parent::Arc Arc;
  3347 
  3334 
  3348     /// \brief Constructor
  3335     /// \brief Constructor
  3349     ///
  3336     ///
  3350     /// Constructor of the adaptor.
  3337     /// Constructor of the adaptor.
  3351     SplitNodes(const Digraph& g) {
  3338     SplitNodes(const DGR& g) {
  3352       Parent::setDigraph(g);
  3339       Parent::initialize(g);
  3353     }
  3340     }
  3354 
  3341 
  3355     /// \brief Returns \c true if the given node is an in-node.
  3342     /// \brief Returns \c true if the given node is an in-node.
  3356     ///
  3343     ///
  3357     /// Returns \c true if the given node is an in-node.
  3344     /// Returns \c true if the given node is an in-node.
  3439       CombinedNodeMap(InNodeMap& in_map, OutNodeMap& out_map)
  3426       CombinedNodeMap(InNodeMap& in_map, OutNodeMap& out_map)
  3440         : _in_map(in_map), _out_map(out_map) {}
  3427         : _in_map(in_map), _out_map(out_map) {}
  3441 
  3428 
  3442       /// Returns the value associated with the given key.
  3429       /// Returns the value associated with the given key.
  3443       Value operator[](const Key& key) const {
  3430       Value operator[](const Key& key) const {
  3444         if (Parent::inNode(key)) {
  3431         if (SplitNodesBase<const DGR>::inNode(key)) {
  3445           return _in_map[key];
  3432           return _in_map[key];
  3446         } else {
  3433         } else {
  3447           return _out_map[key];
  3434           return _out_map[key];
  3448         }
  3435         }
  3449       }
  3436       }
  3450 
  3437 
  3451       /// Returns a reference to the value associated with the given key.
  3438       /// Returns a reference to the value associated with the given key.
  3452       Value& operator[](const Key& key) {
  3439       Value& operator[](const Key& key) {
  3453         if (Parent::inNode(key)) {
  3440         if (SplitNodesBase<const DGR>::inNode(key)) {
  3454           return _in_map[key];
  3441           return _in_map[key];
  3455         } else {
  3442         } else {
  3456           return _out_map[key];
  3443           return _out_map[key];
  3457         }
  3444         }
  3458       }
  3445       }
  3459 
  3446 
  3460       /// Sets the value associated with the given key.
  3447       /// Sets the value associated with the given key.
  3461       void set(const Key& key, const Value& value) {
  3448       void set(const Key& key, const Value& value) {
  3462         if (Parent::inNode(key)) {
  3449         if (SplitNodesBase<const DGR>::inNode(key)) {
  3463           _in_map.set(key, value);
  3450           _in_map.set(key, value);
  3464         } else {
  3451         } else {
  3465           _out_map.set(key, value);
  3452           _out_map.set(key, value);
  3466         }
  3453         }
  3467       }
  3454       }
  3528       CombinedArcMap(ArcMap& arc_map, NodeMap& node_map)
  3515       CombinedArcMap(ArcMap& arc_map, NodeMap& node_map)
  3529         : _arc_map(arc_map), _node_map(node_map) {}
  3516         : _arc_map(arc_map), _node_map(node_map) {}
  3530 
  3517 
  3531       /// Returns the value associated with the given key.
  3518       /// Returns the value associated with the given key.
  3532       Value operator[](const Key& arc) const {
  3519       Value operator[](const Key& arc) const {
  3533         if (Parent::origArc(arc)) {
  3520         if (SplitNodesBase<const DGR>::origArc(arc)) {
  3534           return _arc_map[arc];
  3521           return _arc_map[arc];
  3535         } else {
  3522         } else {
  3536           return _node_map[arc];
  3523           return _node_map[arc];
  3537         }
  3524         }
  3538       }
  3525       }
  3539 
  3526 
  3540       /// Returns a reference to the value associated with the given key.
  3527       /// Returns a reference to the value associated with the given key.
  3541       Value& operator[](const Key& arc) {
  3528       Value& operator[](const Key& arc) {
  3542         if (Parent::origArc(arc)) {
  3529         if (SplitNodesBase<const DGR>::origArc(arc)) {
  3543           return _arc_map[arc];
  3530           return _arc_map[arc];
  3544         } else {
  3531         } else {
  3545           return _node_map[arc];
  3532           return _node_map[arc];
  3546         }
  3533         }
  3547       }
  3534       }
  3548 
  3535 
  3549       /// Sets the value associated with the given key.
  3536       /// Sets the value associated with the given key.
  3550       void set(const Arc& arc, const Value& val) {
  3537       void set(const Arc& arc, const Value& val) {
  3551         if (Parent::origArc(arc)) {
  3538         if (SplitNodesBase<const DGR>::origArc(arc)) {
  3552           _arc_map.set(arc, val);
  3539           _arc_map.set(arc, val);
  3553         } else {
  3540         } else {
  3554           _node_map.set(arc, val);
  3541           _node_map.set(arc, val);
  3555         }
  3542         }
  3556       }
  3543       }
  3592   /// \brief Returns a (read-only) SplitNodes adaptor
  3579   /// \brief Returns a (read-only) SplitNodes adaptor
  3593   ///
  3580   ///
  3594   /// This function just returns a (read-only) \ref SplitNodes adaptor.
  3581   /// This function just returns a (read-only) \ref SplitNodes adaptor.
  3595   /// \ingroup graph_adaptors
  3582   /// \ingroup graph_adaptors
  3596   /// \relates SplitNodes
  3583   /// \relates SplitNodes
  3597   template<typename GR>
  3584   template<typename DGR>
  3598   SplitNodes<GR>
  3585   SplitNodes<DGR>
  3599   splitNodes(const GR& digraph) {
  3586   splitNodes(const DGR& digraph) {
  3600     return SplitNodes<GR>(digraph);
  3587     return SplitNodes<DGR>(digraph);
  3601   }
  3588   }
  3602 
  3589 
       
  3590 #undef LEMON_SCOPE_FIX
       
  3591 
  3603 } //namespace lemon
  3592 } //namespace lemon
  3604 
  3593 
  3605 #endif //LEMON_ADAPTORS_H
  3594 #endif //LEMON_ADAPTORS_H