COIN-OR::LEMON - Graph Library

Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • lemon/adaptors.h

    r487 r703  
    3131
    3232#include <lemon/bits/graph_adaptor_extender.h>
     33#include <lemon/bits/map_extender.h>
    3334#include <lemon/tolerance.h>
    3435
     
    3738namespace lemon {
    3839
    39   template<typename _Digraph>
     40#ifdef _MSC_VER
     41#define LEMON_SCOPE_FIX(OUTER, NESTED) OUTER::NESTED
     42#else
     43#define LEMON_SCOPE_FIX(OUTER, NESTED) typename OUTER::template NESTED
     44#endif
     45
     46  template<typename DGR>
    4047  class DigraphAdaptorBase {
    4148  public:
    42     typedef _Digraph Digraph;
     49    typedef DGR Digraph;
    4350    typedef DigraphAdaptorBase Adaptor;
    44     typedef Digraph ParentDigraph;
    4551
    4652  protected:
    47     Digraph* _digraph;
     53    DGR* _digraph;
    4854    DigraphAdaptorBase() : _digraph(0) { }
    49     void setDigraph(Digraph& digraph) { _digraph = &digraph; }
    50 
    51   public:
    52     DigraphAdaptorBase(Digraph& digraph) : _digraph(&digraph) { }
    53 
    54     typedef typename Digraph::Node Node;
    55     typedef typename Digraph::Arc Arc;
     55    void initialize(DGR& digraph) { _digraph = &digraph; }
     56
     57  public:
     58    DigraphAdaptorBase(DGR& digraph) : _digraph(&digraph) { }
     59
     60    typedef typename DGR::Node Node;
     61    typedef typename DGR::Arc Arc;
    5662
    5763    void first(Node& i) const { _digraph->first(i); }
     
    6874    Node target(const Arc& a) const { return _digraph->target(a); }
    6975
    70     typedef NodeNumTagIndicator<Digraph> NodeNumTag;
     76    typedef NodeNumTagIndicator<DGR> NodeNumTag;
    7177    int nodeNum() const { return _digraph->nodeNum(); }
    7278
    73     typedef ArcNumTagIndicator<Digraph> ArcNumTag;
     79    typedef ArcNumTagIndicator<DGR> ArcNumTag;
    7480    int arcNum() const { return _digraph->arcNum(); }
    7581
    76     typedef FindArcTagIndicator<Digraph> FindArcTag;
     82    typedef FindArcTagIndicator<DGR> FindArcTag;
    7783    Arc findArc(const Node& u, const Node& v, const Arc& prev = INVALID) const {
    7884      return _digraph->findArc(u, v, prev);
     
    96102    int maxArcId() const { return _digraph->maxArcId(); }
    97103
    98     typedef typename ItemSetTraits<Digraph, Node>::ItemNotifier NodeNotifier;
     104    typedef typename ItemSetTraits<DGR, Node>::ItemNotifier NodeNotifier;
    99105    NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
    100106
    101     typedef typename ItemSetTraits<Digraph, Arc>::ItemNotifier ArcNotifier;
     107    typedef typename ItemSetTraits<DGR, Arc>::ItemNotifier ArcNotifier;
    102108    ArcNotifier& notifier(Arc) const { return _digraph->notifier(Arc()); }
    103109
    104     template <typename _Value>
    105     class NodeMap : public Digraph::template NodeMap<_Value> {
     110    template <typename V>
     111    class NodeMap : public DGR::template NodeMap<V> {
     112      typedef typename DGR::template NodeMap<V> Parent;
     113
    106114    public:
    107 
    108       typedef typename Digraph::template NodeMap<_Value> Parent;
    109 
    110115      explicit NodeMap(const Adaptor& adaptor)
    111116        : Parent(*adaptor._digraph) {}
    112 
    113       NodeMap(const Adaptor& adaptor, const _Value& value)
     117      NodeMap(const Adaptor& adaptor, const V& value)
    114118        : Parent(*adaptor._digraph, value) { }
    115119
     
    127131    };
    128132
    129     template <typename _Value>
    130     class ArcMap : public Digraph::template ArcMap<_Value> {
     133    template <typename V>
     134    class ArcMap : public DGR::template ArcMap<V> {
     135      typedef typename DGR::template ArcMap<V> Parent;
     136
    131137    public:
    132 
    133       typedef typename Digraph::template ArcMap<_Value> Parent;
    134 
    135       explicit ArcMap(const Adaptor& adaptor)
     138      explicit ArcMap(const DigraphAdaptorBase<DGR>& adaptor)
    136139        : Parent(*adaptor._digraph) {}
    137 
    138       ArcMap(const Adaptor& adaptor, const _Value& value)
     140      ArcMap(const DigraphAdaptorBase<DGR>& adaptor, const V& value)
    139141        : Parent(*adaptor._digraph, value) {}
    140142
     
    154156  };
    155157
    156   template<typename _Graph>
     158  template<typename GR>
    157159  class GraphAdaptorBase {
    158160  public:
    159     typedef _Graph Graph;
    160     typedef Graph ParentGraph;
     161    typedef GR Graph;
    161162
    162163  protected:
    163     Graph* _graph;
     164    GR* _graph;
    164165
    165166    GraphAdaptorBase() : _graph(0) {}
    166167
    167     void setGraph(Graph& graph) { _graph = &graph; }
    168 
    169   public:
    170     GraphAdaptorBase(Graph& graph) : _graph(&graph) {}
    171 
    172     typedef typename Graph::Node Node;
    173     typedef typename Graph::Arc Arc;
    174     typedef typename Graph::Edge Edge;
     168    void initialize(GR& graph) { _graph = &graph; }
     169
     170  public:
     171    GraphAdaptorBase(GR& graph) : _graph(&graph) {}
     172
     173    typedef typename GR::Node Node;
     174    typedef typename GR::Arc Arc;
     175    typedef typename GR::Edge Edge;
    175176
    176177    void first(Node& i) const { _graph->first(i); }
     
    240241    int maxEdgeId() const { return _graph->maxEdgeId(); }
    241242
    242     typedef typename ItemSetTraits<Graph, Node>::ItemNotifier NodeNotifier;
     243    typedef typename ItemSetTraits<GR, Node>::ItemNotifier NodeNotifier;
    243244    NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); }
    244245
    245     typedef typename ItemSetTraits<Graph, Arc>::ItemNotifier ArcNotifier;
     246    typedef typename ItemSetTraits<GR, Arc>::ItemNotifier ArcNotifier;
    246247    ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); }
    247248
    248     typedef typename ItemSetTraits<Graph, Edge>::ItemNotifier EdgeNotifier;
     249    typedef typename ItemSetTraits<GR, Edge>::ItemNotifier EdgeNotifier;
    249250    EdgeNotifier& notifier(Edge) const { return _graph->notifier(Edge()); }
    250251
    251     template <typename _Value>
    252     class NodeMap : public Graph::template NodeMap<_Value> {
     252    template <typename V>
     253    class NodeMap : public GR::template NodeMap<V> {
     254      typedef typename GR::template NodeMap<V> Parent;
     255
    253256    public:
    254       typedef typename Graph::template NodeMap<_Value> Parent;
    255       explicit NodeMap(const GraphAdaptorBase<Graph>& adapter)
     257      explicit NodeMap(const GraphAdaptorBase<GR>& adapter)
    256258        : Parent(*adapter._graph) {}
    257       NodeMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value)
     259      NodeMap(const GraphAdaptorBase<GR>& adapter, const V& value)
    258260        : Parent(*adapter._graph, value) {}
    259261
     
    271273    };
    272274
    273     template <typename _Value>
    274     class ArcMap : public Graph::template ArcMap<_Value> {
     275    template <typename V>
     276    class ArcMap : public GR::template ArcMap<V> {
     277      typedef typename GR::template ArcMap<V> Parent;
     278
    275279    public:
    276       typedef typename Graph::template ArcMap<_Value> Parent;
    277       explicit ArcMap(const GraphAdaptorBase<Graph>& adapter)
     280      explicit ArcMap(const GraphAdaptorBase<GR>& adapter)
    278281        : Parent(*adapter._graph) {}
    279       ArcMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value)
     282      ArcMap(const GraphAdaptorBase<GR>& adapter, const V& value)
    280283        : Parent(*adapter._graph, value) {}
    281284
     
    292295    };
    293296
    294     template <typename _Value>
    295     class EdgeMap : public Graph::template EdgeMap<_Value> {
     297    template <typename V>
     298    class EdgeMap : public GR::template EdgeMap<V> {
     299      typedef typename GR::template EdgeMap<V> Parent;
     300
    296301    public:
    297       typedef typename Graph::template EdgeMap<_Value> Parent;
    298       explicit EdgeMap(const GraphAdaptorBase<Graph>& adapter)
     302      explicit EdgeMap(const GraphAdaptorBase<GR>& adapter)
    299303        : Parent(*adapter._graph) {}
    300       EdgeMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value)
     304      EdgeMap(const GraphAdaptorBase<GR>& adapter, const V& value)
    301305        : Parent(*adapter._graph, value) {}
    302306
     
    315319  };
    316320
    317   template <typename _Digraph>
    318   class ReverseDigraphBase : public DigraphAdaptorBase<_Digraph> {
    319   public:
    320     typedef _Digraph Digraph;
    321     typedef DigraphAdaptorBase<_Digraph> Parent;
     321  template <typename DGR>
     322  class ReverseDigraphBase : public DigraphAdaptorBase<DGR> {
     323    typedef DigraphAdaptorBase<DGR> Parent;
     324  public:
     325    typedef DGR Digraph;
    322326  protected:
    323327    ReverseDigraphBase() : Parent() { }
     
    337341    Arc addArc(const Node& u, const Node& v) { return Parent::addArc(v, u); }
    338342
    339     typedef FindArcTagIndicator<Digraph> FindArcTag;
     343    typedef FindArcTagIndicator<DGR> FindArcTag;
    340344    Arc findArc(const Node& u, const Node& v,
    341345                const Arc& prev = INVALID) const {
     
    357361  /// parameter is set to be \c const.
    358362  ///
    359   /// \tparam GR The type of the adapted digraph.
     363  /// \tparam DGR The type of the adapted digraph.
    360364  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
    361365  /// It can also be specified to be \c const.
     
    363367  /// \note The \c Node and \c Arc types of this adaptor and the adapted
    364368  /// digraph are convertible to each other.
    365   template<typename GR>
     369  template<typename DGR>
    366370#ifdef DOXYGEN
    367371  class ReverseDigraph {
    368372#else
    369373  class ReverseDigraph :
    370     public DigraphAdaptorExtender<ReverseDigraphBase<GR> > {
     374    public DigraphAdaptorExtender<ReverseDigraphBase<DGR> > {
    371375#endif
     376    typedef DigraphAdaptorExtender<ReverseDigraphBase<DGR> > Parent;
    372377  public:
    373378    /// The type of the adapted digraph.
    374     typedef GR Digraph;
    375     typedef DigraphAdaptorExtender<ReverseDigraphBase<GR> > Parent;
     379    typedef DGR Digraph;
    376380  protected:
    377381    ReverseDigraph() { }
     
    381385    ///
    382386    /// Creates a reverse digraph adaptor for the given digraph.
    383     explicit ReverseDigraph(Digraph& digraph) {
    384       Parent::setDigraph(digraph);
     387    explicit ReverseDigraph(DGR& digraph) {
     388      Parent::initialize(digraph);
    385389    }
    386390  };
     
    391395  /// \ingroup graph_adaptors
    392396  /// \relates ReverseDigraph
    393   template<typename GR>
    394   ReverseDigraph<const GR> reverseDigraph(const GR& digraph) {
    395     return ReverseDigraph<const GR>(digraph);
     397  template<typename DGR>
     398  ReverseDigraph<const DGR> reverseDigraph(const DGR& digraph) {
     399    return ReverseDigraph<const DGR>(digraph);
    396400  }
    397401
    398402
    399   template <typename _Digraph, typename _NodeFilterMap,
    400             typename _ArcFilterMap, bool _checked = true>
    401   class SubDigraphBase : public DigraphAdaptorBase<_Digraph> {
    402   public:
    403     typedef _Digraph Digraph;
    404     typedef _NodeFilterMap NodeFilterMap;
    405     typedef _ArcFilterMap ArcFilterMap;
     403  template <typename DGR, typename NF, typename AF, bool ch = true>
     404  class SubDigraphBase : public DigraphAdaptorBase<DGR> {
     405    typedef DigraphAdaptorBase<DGR> Parent;
     406  public:
     407    typedef DGR Digraph;
     408    typedef NF NodeFilterMap;
     409    typedef AF ArcFilterMap;
    406410
    407411    typedef SubDigraphBase Adaptor;
    408     typedef DigraphAdaptorBase<_Digraph> Parent;
    409412  protected:
    410     NodeFilterMap* _node_filter;
    411     ArcFilterMap* _arc_filter;
     413    NF* _node_filter;
     414    AF* _arc_filter;
    412415    SubDigraphBase()
    413416      : Parent(), _node_filter(0), _arc_filter(0) { }
    414417
    415     void setNodeFilterMap(NodeFilterMap& node_filter) {
     418    void initialize(DGR& digraph, NF& node_filter, AF& arc_filter) {
     419      Parent::initialize(digraph);
    416420      _node_filter = &node_filter;
    417     }
    418     void setArcFilterMap(ArcFilterMap& arc_filter) {
    419       _arc_filter = &arc_filter;
     421      _arc_filter = &arc_filter;     
    420422    }
    421423
     
    488490    typedef False ArcNumTag;
    489491
    490     typedef FindArcTagIndicator<Digraph> FindArcTag;
     492    typedef FindArcTagIndicator<DGR> FindArcTag;
    491493    Arc findArc(const Node& source, const Node& target,
    492494                const Arc& prev = INVALID) const {
     
    501503    }
    502504
    503     template <typename _Value>
    504     class NodeMap : public SubMapExtender<Adaptor,
    505       typename Parent::template NodeMap<_Value> > {
     505  public:
     506
     507    template <typename V>
     508    class NodeMap
     509      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
     510              LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
     511      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
     512        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
     513
    506514    public:
    507       typedef _Value Value;
    508       typedef SubMapExtender<Adaptor, typename Parent::
    509                              template NodeMap<Value> > MapParent;
    510 
    511       NodeMap(const Adaptor& adaptor)
    512         : MapParent(adaptor) {}
    513       NodeMap(const Adaptor& adaptor, const Value& value)
    514         : MapParent(adaptor, value) {}
     515      typedef V Value;
     516
     517      NodeMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor)
     518        : Parent(adaptor) {}
     519      NodeMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor, const V& value)
     520        : Parent(adaptor, value) {}
    515521
    516522    private:
     
    521527      template <typename CMap>
    522528      NodeMap& operator=(const CMap& cmap) {
    523         MapParent::operator=(cmap);
     529        Parent::operator=(cmap);
    524530        return *this;
    525531      }
    526532    };
    527533
    528     template <typename _Value>
    529     class ArcMap : public SubMapExtender<Adaptor,
    530       typename Parent::template ArcMap<_Value> > {
     534    template <typename V>
     535    class ArcMap
     536      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
     537              LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
     538      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
     539        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> Parent;
     540
    531541    public:
    532       typedef _Value Value;
    533       typedef SubMapExtender<Adaptor, typename Parent::
    534                              template ArcMap<Value> > MapParent;
    535 
    536       ArcMap(const Adaptor& adaptor)
    537         : MapParent(adaptor) {}
    538       ArcMap(const Adaptor& adaptor, const Value& value)
    539         : MapParent(adaptor, value) {}
     542      typedef V Value;
     543
     544      ArcMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor)
     545        : Parent(adaptor) {}
     546      ArcMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor, const V& value)
     547        : Parent(adaptor, value) {}
    540548
    541549    private:
     
    546554      template <typename CMap>
    547555      ArcMap& operator=(const CMap& cmap) {
    548         MapParent::operator=(cmap);
     556        Parent::operator=(cmap);
    549557        return *this;
    550558      }
     
    553561  };
    554562
    555   template <typename _Digraph, typename _NodeFilterMap, typename _ArcFilterMap>
    556   class SubDigraphBase<_Digraph, _NodeFilterMap, _ArcFilterMap, false>
    557     : public DigraphAdaptorBase<_Digraph> {
    558   public:
    559     typedef _Digraph Digraph;
    560     typedef _NodeFilterMap NodeFilterMap;
    561     typedef _ArcFilterMap ArcFilterMap;
     563  template <typename DGR, typename NF, typename AF>
     564  class SubDigraphBase<DGR, NF, AF, false>
     565    : public DigraphAdaptorBase<DGR> {
     566    typedef DigraphAdaptorBase<DGR> Parent;
     567  public:
     568    typedef DGR Digraph;
     569    typedef NF NodeFilterMap;
     570    typedef AF ArcFilterMap;
    562571
    563572    typedef SubDigraphBase Adaptor;
    564     typedef DigraphAdaptorBase<Digraph> Parent;
    565573  protected:
    566     NodeFilterMap* _node_filter;
    567     ArcFilterMap* _arc_filter;
     574    NF* _node_filter;
     575    AF* _arc_filter;
    568576    SubDigraphBase()
    569577      : Parent(), _node_filter(0), _arc_filter(0) { }
    570578
    571     void setNodeFilterMap(NodeFilterMap& node_filter) {
     579    void initialize(DGR& digraph, NF& node_filter, AF& arc_filter) {
     580      Parent::initialize(digraph);
    572581      _node_filter = &node_filter;
    573     }
    574     void setArcFilterMap(ArcFilterMap& arc_filter) {
    575       _arc_filter = &arc_filter;
     582      _arc_filter = &arc_filter;     
    576583    }
    577584
     
    628635    typedef False ArcNumTag;
    629636
    630     typedef FindArcTagIndicator<Digraph> FindArcTag;
     637    typedef FindArcTagIndicator<DGR> FindArcTag;
    631638    Arc findArc(const Node& source, const Node& target,
    632639                const Arc& prev = INVALID) const {
     
    641648    }
    642649
    643     template <typename _Value>
    644     class NodeMap : public SubMapExtender<Adaptor,
    645       typename Parent::template NodeMap<_Value> > {
     650    template <typename V>
     651    class NodeMap
     652      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
     653          LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
     654      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
     655        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
     656
    646657    public:
    647       typedef _Value Value;
    648       typedef SubMapExtender<Adaptor, typename Parent::
    649                              template NodeMap<Value> > MapParent;
    650 
    651       NodeMap(const Adaptor& adaptor)
    652         : MapParent(adaptor) {}
    653       NodeMap(const Adaptor& adaptor, const Value& value)
    654         : MapParent(adaptor, value) {}
     658      typedef V Value;
     659
     660      NodeMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor)
     661        : Parent(adaptor) {}
     662      NodeMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor, const V& value)
     663        : Parent(adaptor, value) {}
    655664
    656665    private:
     
    661670      template <typename CMap>
    662671      NodeMap& operator=(const CMap& cmap) {
    663         MapParent::operator=(cmap);
     672        Parent::operator=(cmap);
    664673        return *this;
    665674      }
    666675    };
    667676
    668     template <typename _Value>
    669     class ArcMap : public SubMapExtender<Adaptor,
    670       typename Parent::template ArcMap<_Value> > {
     677    template <typename V>
     678    class ArcMap
     679      : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
     680          LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
     681      typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
     682        LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> Parent;
     683
    671684    public:
    672       typedef _Value Value;
    673       typedef SubMapExtender<Adaptor, typename Parent::
    674                              template ArcMap<Value> > MapParent;
    675 
    676       ArcMap(const Adaptor& adaptor)
    677         : MapParent(adaptor) {}
    678       ArcMap(const Adaptor& adaptor, const Value& value)
    679         : MapParent(adaptor, value) {}
     685      typedef V Value;
     686
     687      ArcMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor)
     688        : Parent(adaptor) {}
     689      ArcMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor, const V& value)
     690        : Parent(adaptor, value) {}
    680691
    681692    private:
     
    686697      template <typename CMap>
    687698      ArcMap& operator=(const CMap& cmap) {
    688         MapParent::operator=(cmap);
     699        Parent::operator=(cmap);
    689700        return *this;
    690701      }
     
    709720  /// parameter is set to be \c const.
    710721  ///
    711   /// \tparam GR The type of the adapted digraph.
     722  /// \tparam DGR The type of the adapted digraph.
    712723  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
    713724  /// It can also be specified to be \c const.
     
    715726  /// It must be a \c bool (or convertible) node map of the
    716727  /// adapted digraph. The default type is
    717   /// \ref concepts::Digraph::NodeMap "GR::NodeMap<bool>".
     728  /// \ref concepts::Digraph::NodeMap "DGR::NodeMap<bool>".
    718729  /// \tparam AF The type of the arc filter map.
    719730  /// It must be \c bool (or convertible) arc map of the
    720731  /// adapted digraph. The default type is
    721   /// \ref concepts::Digraph::ArcMap "GR::ArcMap<bool>".
     732  /// \ref concepts::Digraph::ArcMap "DGR::ArcMap<bool>".
    722733  ///
    723734  /// \note The \c Node and \c Arc types of this adaptor and the adapted
     
    727738  /// \see FilterArcs
    728739#ifdef DOXYGEN
    729   template<typename GR, typename NF, typename AF>
     740  template<typename DGR, typename NF, typename AF>
    730741  class SubDigraph {
    731742#else
    732   template<typename GR,
    733            typename NF = typename GR::template NodeMap<bool>,
    734            typename AF = typename GR::template ArcMap<bool> >
     743  template<typename DGR,
     744           typename NF = typename DGR::template NodeMap<bool>,
     745           typename AF = typename DGR::template ArcMap<bool> >
    735746  class SubDigraph :
    736     public DigraphAdaptorExtender<SubDigraphBase<GR, NF, AF, true> > {
     747    public DigraphAdaptorExtender<SubDigraphBase<DGR, NF, AF, true> > {
    737748#endif
    738749  public:
    739750    /// The type of the adapted digraph.
    740     typedef GR Digraph;
     751    typedef DGR Digraph;
    741752    /// The type of the node filter map.
    742753    typedef NF NodeFilterMap;
     
    744755    typedef AF ArcFilterMap;
    745756
    746     typedef DigraphAdaptorExtender<SubDigraphBase<GR, NF, AF, true> >
     757    typedef DigraphAdaptorExtender<SubDigraphBase<DGR, NF, AF, true> >
    747758      Parent;
    748759
     
    758769    /// Creates a subdigraph for the given digraph with the
    759770    /// given node and arc filter maps.
    760     SubDigraph(Digraph& digraph, NodeFilterMap& node_filter,
    761                ArcFilterMap& arc_filter) {
    762       setDigraph(digraph);
    763       setNodeFilterMap(node_filter);
    764       setArcFilterMap(arc_filter);
     771    SubDigraph(DGR& digraph, NF& node_filter, AF& arc_filter) {
     772      Parent::initialize(digraph, node_filter, arc_filter);
    765773    }
    766774
     
    824832  /// \ingroup graph_adaptors
    825833  /// \relates SubDigraph
    826   template<typename GR, typename NF, typename AF>
    827   SubDigraph<const GR, NF, AF>
    828   subDigraph(const GR& digraph,
    829              NF& node_filter_map, AF& arc_filter_map) {
    830     return SubDigraph<const GR, NF, AF>
    831       (digraph, node_filter_map, arc_filter_map);
     834  template<typename DGR, typename NF, typename AF>
     835  SubDigraph<const DGR, NF, AF>
     836  subDigraph(const DGR& digraph,
     837             NF& node_filter, AF& arc_filter) {
     838    return SubDigraph<const DGR, NF, AF>
     839      (digraph, node_filter, arc_filter);
    832840  }
    833841
    834   template<typename GR, typename NF, typename AF>
    835   SubDigraph<const GR, const NF, AF>
    836   subDigraph(const GR& digraph,
    837              const NF& node_filter_map, AF& arc_filter_map) {
    838     return SubDigraph<const GR, const NF, AF>
    839       (digraph, node_filter_map, arc_filter_map);
     842  template<typename DGR, typename NF, typename AF>
     843  SubDigraph<const DGR, const NF, AF>
     844  subDigraph(const DGR& digraph,
     845             const NF& node_filter, AF& arc_filter) {
     846    return SubDigraph<const DGR, const NF, AF>
     847      (digraph, node_filter, arc_filter);
    840848  }
    841849
    842   template<typename GR, typename NF, typename AF>
    843   SubDigraph<const GR, NF, const AF>
    844   subDigraph(const GR& digraph,
    845              NF& node_filter_map, const AF& arc_filter_map) {
    846     return SubDigraph<const GR, NF, const AF>
    847       (digraph, node_filter_map, arc_filter_map);
     850  template<typename DGR, typename NF, typename AF>
     851  SubDigraph<const DGR, NF, const AF>
     852  subDigraph(const DGR& digraph,
     853             NF& node_filter, const AF& arc_filter) {
     854    return SubDigraph<const DGR, NF, const AF>
     855      (digraph, node_filter, arc_filter);
    848856  }
    849857
    850   template<typename GR, typename NF, typename AF>
    851   SubDigraph<const GR, const NF, const AF>
    852   subDigraph(const GR& digraph,
    853              const NF& node_filter_map, const AF& arc_filter_map) {
    854     return SubDigraph<const GR, const NF, const AF>
    855       (digraph, node_filter_map, arc_filter_map);
     858  template<typename DGR, typename NF, typename AF>
     859  SubDigraph<const DGR, const NF, const AF>
     860  subDigraph(const DGR& digraph,
     861             const NF& node_filter, const AF& arc_filter) {
     862    return SubDigraph<const DGR, const NF, const AF>
     863      (digraph, node_filter, arc_filter);
    856864  }
    857865
    858866
    859   template <typename _Graph, typename _NodeFilterMap,
    860             typename _EdgeFilterMap, bool _checked = true>
    861   class SubGraphBase : public GraphAdaptorBase<_Graph> {
    862   public:
    863     typedef _Graph Graph;
    864     typedef _NodeFilterMap NodeFilterMap;
    865     typedef _EdgeFilterMap EdgeFilterMap;
     867  template <typename GR, typename NF, typename EF, bool ch = true>
     868  class SubGraphBase : public GraphAdaptorBase<GR> {
     869    typedef GraphAdaptorBase<GR> Parent;
     870  public:
     871    typedef GR Graph;
     872    typedef NF NodeFilterMap;
     873    typedef EF EdgeFilterMap;
    866874
    867875    typedef SubGraphBase Adaptor;
    868     typedef GraphAdaptorBase<_Graph> Parent;
    869876  protected:
    870877
    871     NodeFilterMap* _node_filter_map;
    872     EdgeFilterMap* _edge_filter_map;
     878    NF* _node_filter;
     879    EF* _edge_filter;
    873880
    874881    SubGraphBase()
    875       : Parent(), _node_filter_map(0), _edge_filter_map(0) { }
    876 
    877     void setNodeFilterMap(NodeFilterMap& node_filter_map) {
    878       _node_filter_map=&node_filter_map;
    879     }
    880     void setEdgeFilterMap(EdgeFilterMap& edge_filter_map) {
    881       _edge_filter_map=&edge_filter_map;
     882      : Parent(), _node_filter(0), _edge_filter(0) { }
     883
     884    void initialize(GR& graph, NF& node_filter, EF& edge_filter) {
     885      Parent::initialize(graph);
     886      _node_filter = &node_filter;
     887      _edge_filter = &edge_filter;
    882888    }
    883889
     
    890896    void first(Node& i) const {
    891897      Parent::first(i);
    892       while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i);
     898      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
    893899    }
    894900
    895901    void first(Arc& i) const {
    896902      Parent::first(i);
    897       while (i!=INVALID && (!(*_edge_filter_map)[i]
    898                             || !(*_node_filter_map)[Parent::source(i)]
    899                             || !(*_node_filter_map)[Parent::target(i)]))
     903      while (i!=INVALID && (!(*_edge_filter)[i]
     904                            || !(*_node_filter)[Parent::source(i)]
     905                            || !(*_node_filter)[Parent::target(i)]))
    900906        Parent::next(i);
    901907    }
     
    903909    void first(Edge& i) const {
    904910      Parent::first(i);
    905       while (i!=INVALID && (!(*_edge_filter_map)[i]
    906                             || !(*_node_filter_map)[Parent::u(i)]
    907                             || !(*_node_filter_map)[Parent::v(i)]))
     911      while (i!=INVALID && (!(*_edge_filter)[i]
     912                            || !(*_node_filter)[Parent::u(i)]
     913                            || !(*_node_filter)[Parent::v(i)]))
    908914        Parent::next(i);
    909915    }
     
    911917    void firstIn(Arc& i, const Node& n) const {
    912918      Parent::firstIn(i, n);
    913       while (i!=INVALID && (!(*_edge_filter_map)[i]
    914                             || !(*_node_filter_map)[Parent::source(i)]))
     919      while (i!=INVALID && (!(*_edge_filter)[i]
     920                            || !(*_node_filter)[Parent::source(i)]))
    915921        Parent::nextIn(i);
    916922    }
     
    918924    void firstOut(Arc& i, const Node& n) const {
    919925      Parent::firstOut(i, n);
    920       while (i!=INVALID && (!(*_edge_filter_map)[i]
    921                             || !(*_node_filter_map)[Parent::target(i)]))
     926      while (i!=INVALID && (!(*_edge_filter)[i]
     927                            || !(*_node_filter)[Parent::target(i)]))
    922928        Parent::nextOut(i);
    923929    }
     
    925931    void firstInc(Edge& i, bool& d, const Node& n) const {
    926932      Parent::firstInc(i, d, n);
    927       while (i!=INVALID && (!(*_edge_filter_map)[i]
    928                             || !(*_node_filter_map)[Parent::u(i)]
    929                             || !(*_node_filter_map)[Parent::v(i)]))
     933      while (i!=INVALID && (!(*_edge_filter)[i]
     934                            || !(*_node_filter)[Parent::u(i)]
     935                            || !(*_node_filter)[Parent::v(i)]))
    930936        Parent::nextInc(i, d);
    931937    }
     
    933939    void next(Node& i) const {
    934940      Parent::next(i);
    935       while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i);
     941      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
    936942    }
    937943
    938944    void next(Arc& i) const {
    939945      Parent::next(i);
    940       while (i!=INVALID && (!(*_edge_filter_map)[i]
    941                             || !(*_node_filter_map)[Parent::source(i)]
    942                             || !(*_node_filter_map)[Parent::target(i)]))
     946      while (i!=INVALID && (!(*_edge_filter)[i]
     947                            || !(*_node_filter)[Parent::source(i)]
     948                            || !(*_node_filter)[Parent::target(i)]))
    943949        Parent::next(i);
    944950    }
     
    946952    void next(Edge& i) const {
    947953      Parent::next(i);
    948       while (i!=INVALID && (!(*_edge_filter_map)[i]
    949                             || !(*_node_filter_map)[Parent::u(i)]
    950                             || !(*_node_filter_map)[Parent::v(i)]))
     954      while (i!=INVALID && (!(*_edge_filter)[i]
     955                            || !(*_node_filter)[Parent::u(i)]
     956                            || !(*_node_filter)[Parent::v(i)]))
    951957        Parent::next(i);
    952958    }
     
    954960    void nextIn(Arc& i) const {
    955961      Parent::nextIn(i);
    956       while (i!=INVALID && (!(*_edge_filter_map)[i]
    957                             || !(*_node_filter_map)[Parent::source(i)]))
     962      while (i!=INVALID && (!(*_edge_filter)[i]
     963                            || !(*_node_filter)[Parent::source(i)]))
    958964        Parent::nextIn(i);
    959965    }
     
    961967    void nextOut(Arc& i) const {
    962968      Parent::nextOut(i);
    963       while (i!=INVALID && (!(*_edge_filter_map)[i]
    964                             || !(*_node_filter_map)[Parent::target(i)]))
     969      while (i!=INVALID && (!(*_edge_filter)[i]
     970                            || !(*_node_filter)[Parent::target(i)]))
    965971        Parent::nextOut(i);
    966972    }
     
    968974    void nextInc(Edge& i, bool& d) const {
    969975      Parent::nextInc(i, d);
    970       while (i!=INVALID && (!(*_edge_filter_map)[i]
    971                             || !(*_node_filter_map)[Parent::u(i)]
    972                             || !(*_node_filter_map)[Parent::v(i)]))
     976      while (i!=INVALID && (!(*_edge_filter)[i]
     977                            || !(*_node_filter)[Parent::u(i)]
     978                            || !(*_node_filter)[Parent::v(i)]))
    973979        Parent::nextInc(i, d);
    974980    }
    975981
    976     void status(const Node& n, bool v) const { _node_filter_map->set(n, v); }
    977     void status(const Edge& e, bool v) const { _edge_filter_map->set(e, v); }
    978 
    979     bool status(const Node& n) const { return (*_node_filter_map)[n]; }
    980     bool status(const Edge& e) const { return (*_edge_filter_map)[e]; }
     982    void status(const Node& n, bool v) const { _node_filter->set(n, v); }
     983    void status(const Edge& e, bool v) const { _edge_filter->set(e, v); }
     984
     985    bool status(const Node& n) const { return (*_node_filter)[n]; }
     986    bool status(const Edge& e) const { return (*_edge_filter)[e]; }
    981987
    982988    typedef False NodeNumTag;
     
    987993    Arc findArc(const Node& u, const Node& v,
    988994                const Arc& prev = INVALID) const {
    989       if (!(*_node_filter_map)[u] || !(*_node_filter_map)[v]) {
     995      if (!(*_node_filter)[u] || !(*_node_filter)[v]) {
    990996        return INVALID;
    991997      }
    992998      Arc arc = Parent::findArc(u, v, prev);
    993       while (arc != INVALID && !(*_edge_filter_map)[arc]) {
     999      while (arc != INVALID && !(*_edge_filter)[arc]) {
    9941000        arc = Parent::findArc(u, v, arc);
    9951001      }
     
    10001006    Edge findEdge(const Node& u, const Node& v,
    10011007                  const Edge& prev = INVALID) const {
    1002       if (!(*_node_filter_map)[u] || !(*_node_filter_map)[v]) {
     1008      if (!(*_node_filter)[u] || !(*_node_filter)[v]) {
    10031009        return INVALID;
    10041010      }
    10051011      Edge edge = Parent::findEdge(u, v, prev);
    1006       while (edge != INVALID && !(*_edge_filter_map)[edge]) {
     1012      while (edge != INVALID && !(*_edge_filter)[edge]) {
    10071013        edge = Parent::findEdge(u, v, edge);
    10081014      }
     
    10101016    }
    10111017
    1012     template <typename _Value>
    1013     class NodeMap : public SubMapExtender<Adaptor,
    1014       typename Parent::template NodeMap<_Value> > {
     1018    template <typename V>
     1019    class NodeMap
     1020      : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
     1021          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> {
     1022      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
     1023        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent;
     1024
    10151025    public:
    1016       typedef _Value Value;
    1017       typedef SubMapExtender<Adaptor, typename Parent::
    1018                              template NodeMap<Value> > MapParent;
    1019 
    1020       NodeMap(const Adaptor& adaptor)
    1021         : MapParent(adaptor) {}
    1022       NodeMap(const Adaptor& adaptor, const Value& value)
    1023         : MapParent(adaptor, value) {}
     1026      typedef V Value;
     1027
     1028      NodeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
     1029        : Parent(adaptor) {}
     1030      NodeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)
     1031        : Parent(adaptor, value) {}
    10241032
    10251033    private:
     
    10301038      template <typename CMap>
    10311039      NodeMap& operator=(const CMap& cmap) {
    1032         MapParent::operator=(cmap);
     1040        Parent::operator=(cmap);
    10331041        return *this;
    10341042      }
    10351043    };
    10361044
    1037     template <typename _Value>
    1038     class ArcMap : public SubMapExtender<Adaptor,
    1039       typename Parent::template ArcMap<_Value> > {
     1045    template <typename V>
     1046    class ArcMap
     1047      : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
     1048          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> {
     1049      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
     1050        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent;
     1051
    10401052    public:
    1041       typedef _Value Value;
    1042       typedef SubMapExtender<Adaptor, typename Parent::
    1043                              template ArcMap<Value> > MapParent;
    1044 
    1045       ArcMap(const Adaptor& adaptor)
    1046         : MapParent(adaptor) {}
    1047       ArcMap(const Adaptor& adaptor, const Value& value)
    1048         : MapParent(adaptor, value) {}
     1053      typedef V Value;
     1054
     1055      ArcMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
     1056        : Parent(adaptor) {}
     1057      ArcMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)
     1058        : Parent(adaptor, value) {}
    10491059
    10501060    private:
     
    10551065      template <typename CMap>
    10561066      ArcMap& operator=(const CMap& cmap) {
    1057         MapParent::operator=(cmap);
     1067        Parent::operator=(cmap);
    10581068        return *this;
    10591069      }
    10601070    };
    10611071
    1062     template <typename _Value>
    1063     class EdgeMap : public SubMapExtender<Adaptor,
    1064       typename Parent::template EdgeMap<_Value> > {
     1072    template <typename V>
     1073    class EdgeMap
     1074      : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
     1075        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> {
     1076      typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
     1077        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
     1078
    10651079    public:
    1066       typedef _Value Value;
    1067       typedef SubMapExtender<Adaptor, typename Parent::
    1068                              template EdgeMap<Value> > MapParent;
    1069 
    1070       EdgeMap(const Adaptor& adaptor)
    1071         : MapParent(adaptor) {}
    1072 
    1073       EdgeMap(const Adaptor& adaptor, const Value& value)
    1074         : MapParent(adaptor, value) {}
     1080      typedef V Value;
     1081
     1082      EdgeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
     1083        : Parent(adaptor) {}
     1084
     1085      EdgeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)
     1086        : Parent(adaptor, value) {}
    10751087
    10761088    private:
     
    10811093      template <typename CMap>
    10821094      EdgeMap& operator=(const CMap& cmap) {
    1083         MapParent::operator=(cmap);
     1095        Parent::operator=(cmap);
    10841096        return *this;
    10851097      }
     
    10881100  };
    10891101
    1090   template <typename _Graph, typename _NodeFilterMap, typename _EdgeFilterMap>
    1091   class SubGraphBase<_Graph, _NodeFilterMap, _EdgeFilterMap, false>
    1092     : public GraphAdaptorBase<_Graph> {
    1093   public:
    1094     typedef _Graph Graph;
    1095     typedef _NodeFilterMap NodeFilterMap;
    1096     typedef _EdgeFilterMap EdgeFilterMap;
     1102  template <typename GR, typename NF, typename EF>
     1103  class SubGraphBase<GR, NF, EF, false>
     1104    : public GraphAdaptorBase<GR> {
     1105    typedef GraphAdaptorBase<GR> Parent;
     1106  public:
     1107    typedef GR Graph;
     1108    typedef NF NodeFilterMap;
     1109    typedef EF EdgeFilterMap;
    10971110
    10981111    typedef SubGraphBase Adaptor;
    1099     typedef GraphAdaptorBase<_Graph> Parent;
    11001112  protected:
    1101     NodeFilterMap* _node_filter_map;
    1102     EdgeFilterMap* _edge_filter_map;
    1103     SubGraphBase() : Parent(),
    1104                      _node_filter_map(0), _edge_filter_map(0) { }
    1105 
    1106     void setNodeFilterMap(NodeFilterMap& node_filter_map) {
    1107       _node_filter_map=&node_filter_map;
    1108     }
    1109     void setEdgeFilterMap(EdgeFilterMap& edge_filter_map) {
    1110       _edge_filter_map=&edge_filter_map;
     1113    NF* _node_filter;
     1114    EF* _edge_filter;
     1115    SubGraphBase()
     1116          : Parent(), _node_filter(0), _edge_filter(0) { }
     1117
     1118    void initialize(GR& graph, NF& node_filter, EF& edge_filter) {
     1119      Parent::initialize(graph);
     1120      _node_filter = &node_filter;
     1121      _edge_filter = &edge_filter;
    11111122    }
    11121123
     
    11191130    void first(Node& i) const {
    11201131      Parent::first(i);
    1121       while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i);
     1132      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
    11221133    }
    11231134
    11241135    void first(Arc& i) const {
    11251136      Parent::first(i);
    1126       while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i);
     1137      while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
    11271138    }
    11281139
    11291140    void first(Edge& i) const {
    11301141      Parent::first(i);
    1131       while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i);
     1142      while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
    11321143    }
    11331144
    11341145    void firstIn(Arc& i, const Node& n) const {
    11351146      Parent::firstIn(i, n);
    1136       while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextIn(i);
     1147      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextIn(i);
    11371148    }
    11381149
    11391150    void firstOut(Arc& i, const Node& n) const {
    11401151      Parent::firstOut(i, n);
    1141       while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextOut(i);
     1152      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextOut(i);
    11421153    }
    11431154
    11441155    void firstInc(Edge& i, bool& d, const Node& n) const {
    11451156      Parent::firstInc(i, d, n);
    1146       while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextInc(i, d);
     1157      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextInc(i, d);
    11471158    }
    11481159
    11491160    void next(Node& i) const {
    11501161      Parent::next(i);
    1151       while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i);
     1162      while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
    11521163    }
    11531164    void next(Arc& i) const {
    11541165      Parent::next(i);
    1155       while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i);
     1166      while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
    11561167    }
    11571168    void next(Edge& i) const {
    11581169      Parent::next(i);
    1159       while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i);
     1170      while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
    11601171    }
    11611172    void nextIn(Arc& i) const {
    11621173      Parent::nextIn(i);
    1163       while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextIn(i);
     1174      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextIn(i);
    11641175    }
    11651176
    11661177    void nextOut(Arc& i) const {
    11671178      Parent::nextOut(i);
    1168       while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextOut(i);
     1179      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextOut(i);
    11691180    }
    11701181    void nextInc(Edge& i, bool& d) const {
    11711182      Parent::nextInc(i, d);
    1172       while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextInc(i, d);
    1173     }
    1174 
    1175     void status(const Node& n, bool v) const { _node_filter_map->set(n, v); }
    1176     void status(const Edge& e, bool v) const { _edge_filter_map->set(e, v); }
    1177 
    1178     bool status(const Node& n) const { return (*_node_filter_map)[n]; }
    1179     bool status(const Edge& e) const { return (*_edge_filter_map)[e]; }
     1183      while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextInc(i, d);
     1184    }
     1185
     1186    void status(const Node& n, bool v) const { _node_filter->set(n, v); }
     1187    void status(const Edge& e, bool v) const { _edge_filter->set(e, v); }
     1188
     1189    bool status(const Node& n) const { return (*_node_filter)[n]; }
     1190    bool status(const Edge& e) const { return (*_edge_filter)[e]; }
    11801191
    11811192    typedef False NodeNumTag;
     
    11871198                const Arc& prev = INVALID) const {
    11881199      Arc arc = Parent::findArc(u, v, prev);
    1189       while (arc != INVALID && !(*_edge_filter_map)[arc]) {
     1200      while (arc != INVALID && !(*_edge_filter)[arc]) {
    11901201        arc = Parent::findArc(u, v, arc);
    11911202      }
     
    11971208                  const Edge& prev = INVALID) const {
    11981209      Edge edge = Parent::findEdge(u, v, prev);
    1199       while (edge != INVALID && !(*_edge_filter_map)[edge]) {
     1210      while (edge != INVALID && !(*_edge_filter)[edge]) {
    12001211        edge = Parent::findEdge(u, v, edge);
    12011212      }
     
    12031214    }
    12041215
    1205     template <typename _Value>
    1206     class NodeMap : public SubMapExtender<Adaptor,
    1207       typename Parent::template NodeMap<_Value> > {
     1216    template <typename V>
     1217    class NodeMap
     1218      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
     1219          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> {
     1220      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
     1221        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent;
     1222
    12081223    public:
    1209       typedef _Value Value;
    1210       typedef SubMapExtender<Adaptor, typename Parent::
    1211                              template NodeMap<Value> > MapParent;
    1212 
    1213       NodeMap(const Adaptor& adaptor)
    1214         : MapParent(adaptor) {}
    1215       NodeMap(const Adaptor& adaptor, const Value& value)
    1216         : MapParent(adaptor, value) {}
     1224      typedef V Value;
     1225
     1226      NodeMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
     1227        : Parent(adaptor) {}
     1228      NodeMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
     1229        : Parent(adaptor, value) {}
    12171230
    12181231    private:
     
    12231236      template <typename CMap>
    12241237      NodeMap& operator=(const CMap& cmap) {
    1225         MapParent::operator=(cmap);
     1238        Parent::operator=(cmap);
    12261239        return *this;
    12271240      }
    12281241    };
    12291242
    1230     template <typename _Value>
    1231     class ArcMap : public SubMapExtender<Adaptor,
    1232       typename Parent::template ArcMap<_Value> > {
     1243    template <typename V>
     1244    class ArcMap
     1245      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
     1246          LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> {
     1247      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
     1248        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent;
     1249
    12331250    public:
    1234       typedef _Value Value;
    1235       typedef SubMapExtender<Adaptor, typename Parent::
    1236                              template ArcMap<Value> > MapParent;
    1237 
    1238       ArcMap(const Adaptor& adaptor)
    1239         : MapParent(adaptor) {}
    1240       ArcMap(const Adaptor& adaptor, const Value& value)
    1241         : MapParent(adaptor, value) {}
     1251      typedef V Value;
     1252
     1253      ArcMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
     1254        : Parent(adaptor) {}
     1255      ArcMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
     1256        : Parent(adaptor, value) {}
    12421257
    12431258    private:
     
    12481263      template <typename CMap>
    12491264      ArcMap& operator=(const CMap& cmap) {
    1250         MapParent::operator=(cmap);
     1265        Parent::operator=(cmap);
    12511266        return *this;
    12521267      }
    12531268    };
    12541269
    1255     template <typename _Value>
    1256     class EdgeMap : public SubMapExtender<Adaptor,
    1257       typename Parent::template EdgeMap<_Value> > {
     1270    template <typename V>
     1271    class EdgeMap
     1272      : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
     1273        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> {
     1274      typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
     1275        LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
     1276
    12581277    public:
    1259       typedef _Value Value;
    1260       typedef SubMapExtender<Adaptor, typename Parent::
    1261                              template EdgeMap<Value> > MapParent;
    1262 
    1263       EdgeMap(const Adaptor& adaptor)
    1264         : MapParent(adaptor) {}
    1265 
    1266       EdgeMap(const Adaptor& adaptor, const _Value& value)
    1267         : MapParent(adaptor, value) {}
     1278      typedef V Value;
     1279
     1280      EdgeMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
     1281        : Parent(adaptor) {}
     1282
     1283      EdgeMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
     1284        : Parent(adaptor, value) {}
    12681285
    12691286    private:
     
    12741291      template <typename CMap>
    12751292      EdgeMap& operator=(const CMap& cmap) {
    1276         MapParent::operator=(cmap);
     1293        Parent::operator=(cmap);
    12771294        return *this;
    12781295      }
     
    13331350    typedef EF EdgeFilterMap;
    13341351
    1335     typedef GraphAdaptorExtender< SubGraphBase<GR, NF, EF, true> >
     1352    typedef GraphAdaptorExtender<SubGraphBase<GR, NF, EF, true> >
    13361353      Parent;
    13371354
     
    13471364    /// Creates a subgraph for the given graph with the given node
    13481365    /// and edge filter maps.
    1349     SubGraph(Graph& graph, NodeFilterMap& node_filter_map,
    1350              EdgeFilterMap& edge_filter_map) {
    1351       setGraph(graph);
    1352       setNodeFilterMap(node_filter_map);
    1353       setEdgeFilterMap(edge_filter_map);
     1366    SubGraph(GR& graph, NF& node_filter, EF& edge_filter) {
     1367      initialize(graph, node_filter, edge_filter);
    13541368    }
    13551369
     
    14151429  template<typename GR, typename NF, typename EF>
    14161430  SubGraph<const GR, NF, EF>
    1417   subGraph(const GR& graph,
    1418            NF& node_filter_map, EF& edge_filter_map) {
     1431  subGraph(const GR& graph, NF& node_filter, EF& edge_filter) {
    14191432    return SubGraph<const GR, NF, EF>
    1420       (graph, node_filter_map, edge_filter_map);
     1433      (graph, node_filter, edge_filter);
    14211434  }
    14221435
    14231436  template<typename GR, typename NF, typename EF>
    14241437  SubGraph<const GR, const NF, EF>
    1425   subGraph(const GR& graph,
    1426            const NF& node_filter_map, EF& edge_filter_map) {
     1438  subGraph(const GR& graph, const NF& node_filter, EF& edge_filter) {
    14271439    return SubGraph<const GR, const NF, EF>
    1428       (graph, node_filter_map, edge_filter_map);
     1440      (graph, node_filter, edge_filter);
    14291441  }
    14301442
    14311443  template<typename GR, typename NF, typename EF>
    14321444  SubGraph<const GR, NF, const EF>
    1433   subGraph(const GR& graph,
    1434            NF& node_filter_map, const EF& edge_filter_map) {
     1445  subGraph(const GR& graph, NF& node_filter, const EF& edge_filter) {
    14351446    return SubGraph<const GR, NF, const EF>
    1436       (graph, node_filter_map, edge_filter_map);
     1447      (graph, node_filter, edge_filter);
    14371448  }
    14381449
    14391450  template<typename GR, typename NF, typename EF>
    14401451  SubGraph<const GR, const NF, const EF>
    1441   subGraph(const GR& graph,
    1442            const NF& node_filter_map, const EF& edge_filter_map) {
     1452  subGraph(const GR& graph, const NF& node_filter, const EF& edge_filter) {
    14431453    return SubGraph<const GR, const NF, const EF>
    1444       (graph, node_filter_map, edge_filter_map);
     1454      (graph, node_filter, edge_filter);
    14451455  }
    14461456
     
    14821492  class FilterNodes :
    14831493    public DigraphAdaptorExtender<
    1484       SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, bool>, true> > {
     1494      SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >,
     1495                     true> > {
    14851496#endif
     1497    typedef DigraphAdaptorExtender<
     1498      SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >,
     1499                     true> > Parent;
     1500
    14861501  public:
    14871502
     
    14891504    typedef NF NodeFilterMap;
    14901505
    1491     typedef DigraphAdaptorExtender<
    1492       SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, bool>, true> >
    1493       Parent;
    1494 
    14951506    typedef typename Parent::Node Node;
    14961507
    14971508  protected:
    1498     ConstMap<typename Digraph::Arc, bool> const_true_map;
    1499 
    1500     FilterNodes() : const_true_map(true) {
    1501       Parent::setArcFilterMap(const_true_map);
    1502     }
     1509    ConstMap<typename Digraph::Arc, Const<bool, true> > const_true_map;
     1510
     1511    FilterNodes() : const_true_map() {}
    15031512
    15041513  public:
     
    15081517    /// Creates a subgraph for the given digraph or graph with the
    15091518    /// given node filter map.
    1510     FilterNodes(GR& graph, NodeFilterMap& node_filter) :
    1511       Parent(), const_true_map(true)
     1519    FilterNodes(GR& graph, NF& node_filter)
     1520      : Parent(), const_true_map()
    15121521    {
    1513       Parent::setDigraph(graph);
    1514       Parent::setNodeFilterMap(node_filter);
    1515       Parent::setArcFilterMap(const_true_map);
     1522      Parent::initialize(graph, node_filter, const_true_map);
    15161523    }
    15171524
     
    15481555                    typename enable_if<UndirectedTagIndicator<GR> >::type> :
    15491556    public GraphAdaptorExtender<
    1550       SubGraphBase<GR, NF, ConstMap<typename GR::Edge, bool>, true> > {
    1551 
    1552   public:
     1557      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >,
     1558                   true> > {
     1559
     1560    typedef GraphAdaptorExtender<
     1561      SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >,
     1562                   true> > Parent;
     1563
     1564  public:
     1565
    15531566    typedef GR Graph;
    15541567    typedef NF NodeFilterMap;
    1555     typedef GraphAdaptorExtender<
    1556       SubGraphBase<GR, NF, ConstMap<typename GR::Edge, bool>, true> >
    1557       Parent;
    15581568
    15591569    typedef typename Parent::Node Node;
     1570
    15601571  protected:
    1561     ConstMap<typename Graph::Edge, bool> const_true_map;
    1562 
    1563     FilterNodes() : const_true_map(true) {
    1564       Parent::setEdgeFilterMap(const_true_map);
    1565     }
    1566 
    1567   public:
    1568 
    1569     FilterNodes(Graph& _graph, NodeFilterMap& node_filter_map) :
    1570       Parent(), const_true_map(true) {
    1571       Parent::setGraph(_graph);
    1572       Parent::setNodeFilterMap(node_filter_map);
    1573       Parent::setEdgeFilterMap(const_true_map);
     1572    ConstMap<typename GR::Edge, Const<bool, true> > const_true_map;
     1573
     1574    FilterNodes() : const_true_map() {}
     1575
     1576  public:
     1577
     1578    FilterNodes(GR& graph, NodeFilterMap& node_filter) :
     1579      Parent(), const_true_map() {
     1580      Parent::initialize(graph, node_filter, const_true_map);
    15741581    }
    15751582
     
    15891596  template<typename GR, typename NF>
    15901597  FilterNodes<const GR, NF>
    1591   filterNodes(const GR& graph, NF& node_filter_map) {
    1592     return FilterNodes<const GR, NF>(graph, node_filter_map);
     1598  filterNodes(const GR& graph, NF& node_filter) {
     1599    return FilterNodes<const GR, NF>(graph, node_filter);
    15931600  }
    15941601
    15951602  template<typename GR, typename NF>
    15961603  FilterNodes<const GR, const NF>
    1597   filterNodes(const GR& graph, const NF& node_filter_map) {
    1598     return FilterNodes<const GR, const NF>(graph, node_filter_map);
     1604  filterNodes(const GR& graph, const NF& node_filter) {
     1605    return FilterNodes<const GR, const NF>(graph, node_filter);
    15991606  }
    16001607
     
    16131620  /// parameter is set to be \c const.
    16141621  ///
    1615   /// \tparam GR The type of the adapted digraph.
     1622  /// \tparam DGR The type of the adapted digraph.
    16161623  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
    16171624  /// It can also be specified to be \c const.
     
    16191626  /// It must be a \c bool (or convertible) arc map of the
    16201627  /// adapted digraph. The default type is
    1621   /// \ref concepts::Digraph::ArcMap "GR::ArcMap<bool>".
     1628  /// \ref concepts::Digraph::ArcMap "DGR::ArcMap<bool>".
    16221629  ///
    16231630  /// \note The \c Node and \c Arc types of this adaptor and the adapted
    16241631  /// digraph are convertible to each other.
    16251632#ifdef DOXYGEN
    1626   template<typename GR,
     1633  template<typename DGR,
    16271634           typename AF>
    16281635  class FilterArcs {
    16291636#else
    1630   template<typename GR,
    1631            typename AF = typename GR::template ArcMap<bool> >
     1637  template<typename DGR,
     1638           typename AF = typename DGR::template ArcMap<bool> >
    16321639  class FilterArcs :
    16331640    public DigraphAdaptorExtender<
    1634       SubDigraphBase<GR, ConstMap<typename GR::Node, bool>, AF, false> > {
     1641      SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >,
     1642                     AF, false> > {
    16351643#endif
    1636   public:
     1644    typedef DigraphAdaptorExtender<
     1645      SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >,
     1646                     AF, false> > Parent;
     1647
     1648  public:
     1649
    16371650    /// The type of the adapted digraph.
    1638     typedef GR Digraph;
     1651    typedef DGR Digraph;
    16391652    /// The type of the arc filter map.
    16401653    typedef AF ArcFilterMap;
    16411654
    1642     typedef DigraphAdaptorExtender<
    1643       SubDigraphBase<GR, ConstMap<typename GR::Node, bool>, AF, false> >
    1644       Parent;
    1645 
    16461655    typedef typename Parent::Arc Arc;
    16471656
    16481657  protected:
    1649     ConstMap<typename Digraph::Node, bool> const_true_map;
    1650 
    1651     FilterArcs() : const_true_map(true) {
    1652       Parent::setNodeFilterMap(const_true_map);
    1653     }
     1658    ConstMap<typename DGR::Node, Const<bool, true> > const_true_map;
     1659
     1660    FilterArcs() : const_true_map() {}
    16541661
    16551662  public:
     
    16591666    /// Creates a subdigraph for the given digraph with the given arc
    16601667    /// filter map.
    1661     FilterArcs(Digraph& digraph, ArcFilterMap& arc_filter)
    1662       : Parent(), const_true_map(true) {
    1663       Parent::setDigraph(digraph);
    1664       Parent::setNodeFilterMap(const_true_map);
    1665       Parent::setArcFilterMap(arc_filter);
     1668    FilterArcs(DGR& digraph, ArcFilterMap& arc_filter)
     1669      : Parent(), const_true_map() {
     1670      Parent::initialize(digraph, const_true_map, arc_filter);
    16661671    }
    16671672
     
    16991704  /// \ingroup graph_adaptors
    17001705  /// \relates FilterArcs
    1701   template<typename GR, typename AF>
    1702   FilterArcs<const GR, AF>
    1703   filterArcs(const GR& digraph, AF& arc_filter_map) {
    1704     return FilterArcs<const GR, AF>(digraph, arc_filter_map);
     1706  template<typename DGR, typename AF>
     1707  FilterArcs<const DGR, AF>
     1708  filterArcs(const DGR& digraph, AF& arc_filter) {
     1709    return FilterArcs<const DGR, AF>(digraph, arc_filter);
    17051710  }
    17061711
    1707   template<typename GR, typename AF>
    1708   FilterArcs<const GR, const AF>
    1709   filterArcs(const GR& digraph, const AF& arc_filter_map) {
    1710     return FilterArcs<const GR, const AF>(digraph, arc_filter_map);
     1712  template<typename DGR, typename AF>
     1713  FilterArcs<const DGR, const AF>
     1714  filterArcs(const DGR& digraph, const AF& arc_filter) {
     1715    return FilterArcs<const DGR, const AF>(digraph, arc_filter);
    17111716  }
    17121717
     
    17441749  class FilterEdges :
    17451750    public GraphAdaptorExtender<
    1746       SubGraphBase<GR, ConstMap<typename GR::Node,bool>, EF, false> > {
     1751      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >,
     1752                   EF, false> > {
    17471753#endif
    1748   public:
     1754    typedef GraphAdaptorExtender<
     1755      SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >,
     1756                   EF, false> > Parent;
     1757
     1758  public:
     1759
    17491760    /// The type of the adapted graph.
    17501761    typedef GR Graph;
     
    17521763    typedef EF EdgeFilterMap;
    17531764
    1754     typedef GraphAdaptorExtender<
    1755       SubGraphBase<GR, ConstMap<typename GR::Node,bool>, EF, false> >
    1756       Parent;
    1757 
    17581765    typedef typename Parent::Edge Edge;
    17591766
    17601767  protected:
    1761     ConstMap<typename Graph::Node, bool> const_true_map;
     1768    ConstMap<typename GR::Node, Const<bool, true> > const_true_map;
    17621769
    17631770    FilterEdges() : const_true_map(true) {
     
    17711778    /// Creates a subgraph for the given graph with the given edge
    17721779    /// filter map.
    1773     FilterEdges(Graph& graph, EdgeFilterMap& edge_filter_map) :
    1774       Parent(), const_true_map(true) {
    1775       Parent::setGraph(graph);
    1776       Parent::setNodeFilterMap(const_true_map);
    1777       Parent::setEdgeFilterMap(edge_filter_map);
     1780    FilterEdges(GR& graph, EF& edge_filter)
     1781      : Parent(), const_true_map() {
     1782      Parent::initialize(graph, const_true_map, edge_filter);
    17781783    }
    17791784
     
    18131818  template<typename GR, typename EF>
    18141819  FilterEdges<const GR, EF>
    1815   filterEdges(const GR& graph, EF& edge_filter_map) {
    1816     return FilterEdges<const GR, EF>(graph, edge_filter_map);
     1820  filterEdges(const GR& graph, EF& edge_filter) {
     1821    return FilterEdges<const GR, EF>(graph, edge_filter);
    18171822  }
    18181823
    18191824  template<typename GR, typename EF>
    18201825  FilterEdges<const GR, const EF>
    1821   filterEdges(const GR& graph, const EF& edge_filter_map) {
    1822     return FilterEdges<const GR, const EF>(graph, edge_filter_map);
     1826  filterEdges(const GR& graph, const EF& edge_filter) {
     1827    return FilterEdges<const GR, const EF>(graph, edge_filter);
    18231828  }
    18241829
    18251830
    1826   template <typename _Digraph>
     1831  template <typename DGR>
    18271832  class UndirectorBase {
    18281833  public:
    1829     typedef _Digraph Digraph;
     1834    typedef DGR Digraph;
    18301835    typedef UndirectorBase Adaptor;
    18311836
     
    18351840    typedef typename Digraph::Node Node;
    18361841
    1837     class Arc : public Edge {
     1842    class Arc {
    18381843      friend class UndirectorBase;
    18391844    protected:
     1845      Edge _edge;
    18401846      bool _forward;
    18411847
    1842       Arc(const Edge& edge, bool forward) :
    1843         Edge(edge), _forward(forward) {}
     1848      Arc(const Edge& edge, bool forward)
     1849        : _edge(edge), _forward(forward) {}
    18441850
    18451851    public:
    18461852      Arc() {}
    18471853
    1848       Arc(Invalid) : Edge(INVALID), _forward(true) {}
     1854      Arc(Invalid) : _edge(INVALID), _forward(true) {}
     1855
     1856      operator const Edge&() const { return _edge; }
    18491857
    18501858      bool operator==(const Arc &other) const {
    1851         return _forward == other._forward &&
    1852           static_cast<const Edge&>(*this) == static_cast<const Edge&>(other);
     1859        return _forward == other._forward && _edge == other._edge;
    18531860      }
    18541861      bool operator!=(const Arc &other) const {
    1855         return _forward != other._forward ||
    1856           static_cast<const Edge&>(*this) != static_cast<const Edge&>(other);
     1862        return _forward != other._forward || _edge != other._edge;
    18571863      }
    18581864      bool operator<(const Arc &other) const {
    18591865        return _forward < other._forward ||
    1860           (_forward == other._forward &&
    1861            static_cast<const Edge&>(*this) < static_cast<const Edge&>(other));
     1866          (_forward == other._forward && _edge < other._edge);
    18621867      }
    18631868    };
     
    18721877
    18731878    void first(Arc& a) const {
    1874       _digraph->first(a);
     1879      _digraph->first(a._edge);
    18751880      a._forward = true;
    18761881    }
     
    18801885        a._forward = false;
    18811886      } else {
    1882         _digraph->next(a);
     1887        _digraph->next(a._edge);
    18831888        a._forward = true;
    18841889      }
     
    18941899
    18951900    void firstOut(Arc& a, const Node& n) const {
    1896       _digraph->firstIn(a, n);
    1897       if( static_cast<const Edge&>(a) != INVALID ) {
     1901      _digraph->firstIn(a._edge, n);
     1902      if (a._edge != INVALID ) {
    18981903        a._forward = false;
    18991904      } else {
    1900         _digraph->firstOut(a, n);
     1905        _digraph->firstOut(a._edge, n);
    19011906        a._forward = true;
    19021907      }
     
    19041909    void nextOut(Arc &a) const {
    19051910      if (!a._forward) {
    1906         Node n = _digraph->target(a);
    1907         _digraph->nextIn(a);
    1908         if (static_cast<const Edge&>(a) == INVALID ) {
    1909           _digraph->firstOut(a, n);
     1911        Node n = _digraph->target(a._edge);
     1912        _digraph->nextIn(a._edge);
     1913        if (a._edge == INVALID) {
     1914          _digraph->firstOut(a._edge, n);
    19101915          a._forward = true;
    19111916        }
    19121917      }
    19131918      else {
    1914         _digraph->nextOut(a);
     1919        _digraph->nextOut(a._edge);
    19151920      }
    19161921    }
    19171922
    19181923    void firstIn(Arc &a, const Node &n) const {
    1919       _digraph->firstOut(a, n);
    1920       if (static_cast<const Edge&>(a) != INVALID ) {
     1924      _digraph->firstOut(a._edge, n);
     1925      if (a._edge != INVALID ) {
    19211926        a._forward = false;
    19221927      } else {
    1923         _digraph->firstIn(a, n);
     1928        _digraph->firstIn(a._edge, n);
    19241929        a._forward = true;
    19251930      }
     
    19271932    void nextIn(Arc &a) const {
    19281933      if (!a._forward) {
    1929         Node n = _digraph->source(a);
    1930         _digraph->nextOut(a);
    1931         if( static_cast<const Edge&>(a) == INVALID ) {
    1932           _digraph->firstIn(a, n);
     1934        Node n = _digraph->source(a._edge);
     1935        _digraph->nextOut(a._edge);
     1936        if (a._edge == INVALID ) {
     1937          _digraph->firstIn(a._edge, n);
    19331938          a._forward = true;
    19341939        }
    19351940      }
    19361941      else {
    1937         _digraph->nextIn(a);
     1942        _digraph->nextIn(a._edge);
    19381943      }
    19391944    }
     
    19681973
    19691974    Node source(const Arc &a) const {
    1970       return a._forward ? _digraph->source(a) : _digraph->target(a);
     1975      return a._forward ? _digraph->source(a._edge) : _digraph->target(a._edge);
    19711976    }
    19721977
    19731978    Node target(const Arc &a) const {
    1974       return a._forward ? _digraph->target(a) : _digraph->source(a);
     1979      return a._forward ? _digraph->target(a._edge) : _digraph->source(a._edge);
    19751980    }
    19761981
    19771982    static Arc direct(const Edge &e, bool d) {
    19781983      return Arc(e, d);
    1979     }
    1980     Arc direct(const Edge &e, const Node& n) const {
    1981       return Arc(e, _digraph->source(e) == n);
    19821984    }
    19831985
     
    20632065  private:
    20642066
    2065     template <typename _Value>
     2067    template <typename V>
    20662068    class ArcMapBase {
    20672069    private:
    20682070
    2069       typedef typename Digraph::template ArcMap<_Value> MapImpl;
     2071      typedef typename DGR::template ArcMap<V> MapImpl;
    20702072
    20712073    public:
     
    20732075      typedef typename MapTraits<MapImpl>::ReferenceMapTag ReferenceMapTag;
    20742076
    2075       typedef _Value Value;
     2077      typedef V Value;
    20762078      typedef Arc Key;
    20772079      typedef typename MapTraits<MapImpl>::ConstReturnValue ConstReturnValue;
     
    20802082      typedef typename MapTraits<MapImpl>::ReturnValue Reference;
    20812083
    2082       ArcMapBase(const Adaptor& adaptor) :
     2084      ArcMapBase(const UndirectorBase<DGR>& adaptor) :
    20832085        _forward(*adaptor._digraph), _backward(*adaptor._digraph) {}
    20842086
    2085       ArcMapBase(const Adaptor& adaptor, const Value& v)
    2086         : _forward(*adaptor._digraph, v), _backward(*adaptor._digraph, v) {}
    2087 
    2088       void set(const Arc& a, const Value& v) {
     2087      ArcMapBase(const UndirectorBase<DGR>& adaptor, const V& value)
     2088        : _forward(*adaptor._digraph, value),
     2089          _backward(*adaptor._digraph, value) {}
     2090
     2091      void set(const Arc& a, const V& value) {
    20892092        if (direction(a)) {
    2090           _forward.set(a, v);
     2093          _forward.set(a, value);
    20912094        } else {
    2092           _backward.set(a, v);
     2095          _backward.set(a, value);
    20932096        }
    20942097      }
     
    21182121  public:
    21192122
    2120     template <typename _Value>
    2121     class NodeMap : public Digraph::template NodeMap<_Value> {
     2123    template <typename V>
     2124    class NodeMap : public DGR::template NodeMap<V> {
     2125      typedef typename DGR::template NodeMap<V> Parent;
     2126
    21222127    public:
    2123 
    2124       typedef _Value Value;
    2125       typedef typename Digraph::template NodeMap<Value> Parent;
    2126 
    2127       explicit NodeMap(const Adaptor& adaptor)
     2128      typedef V Value;
     2129
     2130      explicit NodeMap(const UndirectorBase<DGR>& adaptor)
    21282131        : Parent(*adaptor._digraph) {}
    21292132
    2130       NodeMap(const Adaptor& adaptor, const _Value& value)
     2133      NodeMap(const UndirectorBase<DGR>& adaptor, const V& value)
    21312134        : Parent(*adaptor._digraph, value) { }
    21322135
     
    21442147    };
    21452148
    2146     template <typename _Value>
     2149    template <typename V>
    21472150    class ArcMap
    2148       : public SubMapExtender<Adaptor, ArcMapBase<_Value> >
    2149     {
     2151      : public SubMapExtender<UndirectorBase<DGR>, ArcMapBase<V> > {
     2152      typedef SubMapExtender<UndirectorBase<DGR>, ArcMapBase<V> > Parent;
     2153
    21502154    public:
    2151       typedef _Value Value;
    2152       typedef SubMapExtender<Adaptor, ArcMapBase<Value> > Parent;
    2153 
    2154       explicit ArcMap(const Adaptor& adaptor)
     2155      typedef V Value;
     2156
     2157      explicit ArcMap(const UndirectorBase<DGR>& adaptor)
    21552158        : Parent(adaptor) {}
    21562159
    2157       ArcMap(const Adaptor& adaptor, const Value& value)
     2160      ArcMap(const UndirectorBase<DGR>& adaptor, const V& value)
    21582161        : Parent(adaptor, value) {}
    21592162
     
    21702173    };
    21712174
    2172     template <typename _Value>
    2173     class EdgeMap : public Digraph::template ArcMap<_Value> {
     2175    template <typename V>
     2176    class EdgeMap : public Digraph::template ArcMap<V> {
     2177      typedef typename Digraph::template ArcMap<V> Parent;
     2178
    21742179    public:
    2175 
    2176       typedef _Value Value;
    2177       typedef typename Digraph::template ArcMap<Value> Parent;
    2178 
    2179       explicit EdgeMap(const Adaptor& adaptor)
     2180      typedef V Value;
     2181
     2182      explicit EdgeMap(const UndirectorBase<DGR>& adaptor)
    21802183        : Parent(*adaptor._digraph) {}
    21812184
    2182       EdgeMap(const Adaptor& adaptor, const Value& value)
     2185      EdgeMap(const UndirectorBase<DGR>& adaptor, const V& value)
    21832186        : Parent(*adaptor._digraph, value) {}
    21842187
     
    21962199    };
    21972200
    2198     typedef typename ItemSetTraits<Digraph, Node>::ItemNotifier NodeNotifier;
     2201    typedef typename ItemSetTraits<DGR, Node>::ItemNotifier NodeNotifier;
    21992202    NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
    22002203
    2201     typedef typename ItemSetTraits<Digraph, Edge>::ItemNotifier EdgeNotifier;
     2204    typedef typename ItemSetTraits<DGR, Edge>::ItemNotifier EdgeNotifier;
    22022205    EdgeNotifier& notifier(Edge) const { return _digraph->notifier(Edge()); }
     2206   
     2207    typedef EdgeNotifier ArcNotifier;
     2208    ArcNotifier& notifier(Arc) const { return _digraph->notifier(Edge()); }
    22032209
    22042210  protected:
     
    22062212    UndirectorBase() : _digraph(0) {}
    22072213
    2208     Digraph* _digraph;
    2209 
    2210     void setDigraph(Digraph& digraph) {
     2214    DGR* _digraph;
     2215
     2216    void initialize(DGR& digraph) {
    22112217      _digraph = &digraph;
    22122218    }
     
    22272233  /// parameter is set to be \c const.
    22282234  ///
    2229   /// \tparam GR The type of the adapted digraph.
     2235  /// \tparam DGR The type of the adapted digraph.
    22302236  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
    22312237  /// It can also be specified to be \c const.
     
    22372243  /// (Thus the \c Arc type of the adaptor is convertible to the \c Arc type
    22382244  /// of the adapted digraph.)
    2239   template<typename GR>
     2245  template<typename DGR>
    22402246#ifdef DOXYGEN
    22412247  class Undirector {
    22422248#else
    22432249  class Undirector :
    2244     public GraphAdaptorExtender<UndirectorBase<GR> > {
     2250    public GraphAdaptorExtender<UndirectorBase<DGR> > {
    22452251#endif
     2252    typedef GraphAdaptorExtender<UndirectorBase<DGR> > Parent;
    22462253  public:
    22472254    /// The type of the adapted digraph.
    2248     typedef GR Digraph;
    2249     typedef GraphAdaptorExtender<UndirectorBase<GR> > Parent;
     2255    typedef DGR Digraph;
    22502256  protected:
    22512257    Undirector() { }
     
    22552261    ///
    22562262    /// Creates an undirected graph from the given digraph.
    2257     Undirector(Digraph& digraph) {
    2258       setDigraph(digraph);
     2263    Undirector(DGR& digraph) {
     2264      initialize(digraph);
    22592265    }
    22602266
     
    22632269    /// This map adaptor class adapts two arc maps of the underlying
    22642270    /// digraph to get an arc map of the undirected graph.
    2265     /// Its value type is inherited from the first arc map type
    2266     /// (\c %ForwardMap).
    2267     template <typename ForwardMap, typename BackwardMap>
     2271    /// Its value type is inherited from the first arc map type (\c FW).
     2272    /// \tparam FW The type of the "foward" arc map.
     2273    /// \tparam BK The type of the "backward" arc map.
     2274    template <typename FW, typename BK>
    22682275    class CombinedArcMap {
    22692276    public:
     
    22722279      typedef typename Parent::Arc Key;
    22732280      /// The value type of the map
    2274       typedef typename ForwardMap::Value Value;
    2275 
    2276       typedef typename MapTraits<ForwardMap>::ReferenceMapTag ReferenceMapTag;
    2277 
    2278       typedef typename MapTraits<ForwardMap>::ReturnValue ReturnValue;
    2279       typedef typename MapTraits<ForwardMap>::ConstReturnValue ConstReturnValue;
    2280       typedef typename MapTraits<ForwardMap>::ReturnValue Reference;
    2281       typedef typename MapTraits<ForwardMap>::ConstReturnValue ConstReference;
     2281      typedef typename FW::Value Value;
     2282
     2283      typedef typename MapTraits<FW>::ReferenceMapTag ReferenceMapTag;
     2284
     2285      typedef typename MapTraits<FW>::ReturnValue ReturnValue;
     2286      typedef typename MapTraits<FW>::ConstReturnValue ConstReturnValue;
     2287      typedef typename MapTraits<FW>::ReturnValue Reference;
     2288      typedef typename MapTraits<FW>::ConstReturnValue ConstReference;
    22822289
    22832290      /// Constructor
    2284       CombinedArcMap(ForwardMap& forward, BackwardMap& backward)
     2291      CombinedArcMap(FW& forward, BK& backward)
    22852292        : _forward(&forward), _backward(&backward) {}
    22862293
     
    23142321    protected:
    23152322
    2316       ForwardMap* _forward;
    2317       BackwardMap* _backward;
     2323      FW* _forward;
     2324      BK* _backward;
    23182325
    23192326    };
     
    23222329    ///
    23232330    /// This function just returns a combined arc map.
    2324     template <typename ForwardMap, typename BackwardMap>
    2325     static CombinedArcMap<ForwardMap, BackwardMap>
    2326     combinedArcMap(ForwardMap& forward, BackwardMap& backward) {
    2327       return CombinedArcMap<ForwardMap, BackwardMap>(forward, backward);
    2328     }
    2329 
    2330     template <typename ForwardMap, typename BackwardMap>
    2331     static CombinedArcMap<const ForwardMap, BackwardMap>
    2332     combinedArcMap(const ForwardMap& forward, BackwardMap& backward) {
    2333       return CombinedArcMap<const ForwardMap,
    2334         BackwardMap>(forward, backward);
    2335     }
    2336 
    2337     template <typename ForwardMap, typename BackwardMap>
    2338     static CombinedArcMap<ForwardMap, const BackwardMap>
    2339     combinedArcMap(ForwardMap& forward, const BackwardMap& backward) {
    2340       return CombinedArcMap<ForwardMap,
    2341         const BackwardMap>(forward, backward);
    2342     }
    2343 
    2344     template <typename ForwardMap, typename BackwardMap>
    2345     static CombinedArcMap<const ForwardMap, const BackwardMap>
    2346     combinedArcMap(const ForwardMap& forward, const BackwardMap& backward) {
    2347       return CombinedArcMap<const ForwardMap,
    2348         const BackwardMap>(forward, backward);
     2331    template <typename FW, typename BK>
     2332    static CombinedArcMap<FW, BK>
     2333    combinedArcMap(FW& forward, BK& backward) {
     2334      return CombinedArcMap<FW, BK>(forward, backward);
     2335    }
     2336
     2337    template <typename FW, typename BK>
     2338    static CombinedArcMap<const FW, BK>
     2339    combinedArcMap(const FW& forward, BK& backward) {
     2340      return CombinedArcMap<const FW, BK>(forward, backward);
     2341    }
     2342
     2343    template <typename FW, typename BK>
     2344    static CombinedArcMap<FW, const BK>
     2345    combinedArcMap(FW& forward, const BK& backward) {
     2346      return CombinedArcMap<FW, const BK>(forward, backward);
     2347    }
     2348
     2349    template <typename FW, typename BK>
     2350    static CombinedArcMap<const FW, const BK>
     2351    combinedArcMap(const FW& forward, const BK& backward) {
     2352      return CombinedArcMap<const FW, const BK>(forward, backward);
    23492353    }
    23502354
     
    23562360  /// \ingroup graph_adaptors
    23572361  /// \relates Undirector
    2358   template<typename GR>
    2359   Undirector<const GR> undirector(const GR& digraph) {
    2360     return Undirector<const GR>(digraph);
     2362  template<typename DGR>
     2363  Undirector<const DGR> undirector(const DGR& digraph) {
     2364    return Undirector<const DGR>(digraph);
    23612365  }
    23622366
    23632367
    2364   template <typename _Graph, typename _DirectionMap>
     2368  template <typename GR, typename DM>
    23652369  class OrienterBase {
    23662370  public:
    23672371
    2368     typedef _Graph Graph;
    2369     typedef _DirectionMap DirectionMap;
    2370 
    2371     typedef typename Graph::Node Node;
    2372     typedef typename Graph::Edge Arc;
     2372    typedef GR Graph;
     2373    typedef DM DirectionMap;
     2374
     2375    typedef typename GR::Node Node;
     2376    typedef typename GR::Edge Arc;
    23732377
    23742378    void reverseArc(const Arc& arc) {
     
    24492453    int maxArcId() const { return _graph->maxEdgeId(); }
    24502454
    2451     typedef typename ItemSetTraits<Graph, Node>::ItemNotifier NodeNotifier;
     2455    typedef typename ItemSetTraits<GR, Node>::ItemNotifier NodeNotifier;
    24522456    NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); }
    24532457
    2454     typedef typename ItemSetTraits<Graph, Arc>::ItemNotifier ArcNotifier;
     2458    typedef typename ItemSetTraits<GR, Arc>::ItemNotifier ArcNotifier;
    24552459    ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); }
    24562460
    2457     template <typename _Value>
    2458     class NodeMap : public _Graph::template NodeMap<_Value> {
     2461    template <typename V>
     2462    class NodeMap : public GR::template NodeMap<V> {
     2463      typedef typename GR::template NodeMap<V> Parent;
     2464
    24592465    public:
    24602466
    2461       typedef typename _Graph::template NodeMap<_Value> Parent;
    2462 
    2463       explicit NodeMap(const OrienterBase& adapter)
     2467      explicit NodeMap(const OrienterBase<GR, DM>& adapter)
    24642468        : Parent(*adapter._graph) {}
    24652469
    2466       NodeMap(const OrienterBase& adapter, const _Value& value)
     2470      NodeMap(const OrienterBase<GR, DM>& adapter, const V& value)
    24672471        : Parent(*adapter._graph, value) {}
    24682472
     
    24802484    };
    24812485
    2482     template <typename _Value>
    2483     class ArcMap : public _Graph::template EdgeMap<_Value> {
     2486    template <typename V>
     2487    class ArcMap : public GR::template EdgeMap<V> {
     2488      typedef typename Graph::template EdgeMap<V> Parent;
     2489
    24842490    public:
    24852491
    2486       typedef typename Graph::template EdgeMap<_Value> Parent;
    2487 
    2488       explicit ArcMap(const OrienterBase& adapter)
     2492      explicit ArcMap(const OrienterBase<GR, DM>& adapter)
    24892493        : Parent(*adapter._graph) { }
    24902494
    2491       ArcMap(const OrienterBase& adapter, const _Value& value)
     2495      ArcMap(const OrienterBase<GR, DM>& adapter, const V& value)
    24922496        : Parent(*adapter._graph, value) { }
    24932497
     
    25082512  protected:
    25092513    Graph* _graph;
    2510     DirectionMap* _direction;
    2511 
    2512     void setDirectionMap(DirectionMap& direction) {
     2514    DM* _direction;
     2515
     2516    void initialize(GR& graph, DM& direction) {
     2517      _graph = &graph;
    25132518      _direction = &direction;
    2514     }
    2515 
    2516     void setGraph(Graph& graph) {
    2517       _graph = &graph;
    25182519    }
    25192520
     
    25572558    public DigraphAdaptorExtender<OrienterBase<GR, DM> > {
    25582559#endif
     2560    typedef DigraphAdaptorExtender<OrienterBase<GR, DM> > Parent;
    25592561  public:
    25602562
     
    25642566    typedef DM DirectionMap;
    25652567
    2566     typedef DigraphAdaptorExtender<OrienterBase<GR, DM> > Parent;
    25672568    typedef typename Parent::Arc Arc;
     2569
    25682570  protected:
    25692571    Orienter() { }
     2572
    25702573  public:
    25712574
     
    25732576    ///
    25742577    /// Constructor of the adaptor.
    2575     Orienter(Graph& graph, DirectionMap& direction) {
    2576       setGraph(graph);
    2577       setDirectionMap(direction);
     2578    Orienter(GR& graph, DM& direction) {
     2579      Parent::initialize(graph, direction);
    25782580    }
    25792581
     
    25952597  template<typename GR, typename DM>
    25962598  Orienter<const GR, DM>
    2597   orienter(const GR& graph, DM& direction_map) {
    2598     return Orienter<const GR, DM>(graph, direction_map);
     2599  orienter(const GR& graph, DM& direction) {
     2600    return Orienter<const GR, DM>(graph, direction);
    25992601  }
    26002602
    26012603  template<typename GR, typename DM>
    26022604  Orienter<const GR, const DM>
    2603   orienter(const GR& graph, const DM& direction_map) {
    2604     return Orienter<const GR, const DM>(graph, direction_map);
     2605  orienter(const GR& graph, const DM& direction) {
     2606    return Orienter<const GR, const DM>(graph, direction);
    26052607  }
    26062608
    26072609  namespace _adaptor_bits {
    26082610
    2609     template<typename Digraph,
    2610              typename CapacityMap,
    2611              typename FlowMap,
    2612              typename Tolerance>
     2611    template <typename DGR, typename CM, typename FM, typename TL>
    26132612    class ResForwardFilter {
    26142613    public:
    26152614
    2616       typedef typename Digraph::Arc Key;
     2615      typedef typename DGR::Arc Key;
    26172616      typedef bool Value;
    26182617
    26192618    private:
    26202619
    2621       const CapacityMap* _capacity;
    2622       const FlowMap* _flow;
    2623       Tolerance _tolerance;
     2620      const CM* _capacity;
     2621      const FM* _flow;
     2622      TL _tolerance;
     2623
    26242624    public:
    26252625
    2626       ResForwardFilter(const CapacityMap& capacity, const FlowMap& flow,
    2627                        const Tolerance& tolerance = Tolerance())
     2626      ResForwardFilter(const CM& capacity, const FM& flow,
     2627                       const TL& tolerance = TL())
    26282628        : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
    26292629
    2630       bool operator[](const typename Digraph::Arc& a) const {
     2630      bool operator[](const typename DGR::Arc& a) const {
    26312631        return _tolerance.positive((*_capacity)[a] - (*_flow)[a]);
    26322632      }
    26332633    };
    26342634
    2635     template<typename Digraph,
    2636              typename CapacityMap,
    2637              typename FlowMap,
    2638              typename Tolerance>
     2635    template<typename DGR,typename CM, typename FM, typename TL>
    26392636    class ResBackwardFilter {
    26402637    public:
    26412638
    2642       typedef typename Digraph::Arc Key;
     2639      typedef typename DGR::Arc Key;
    26432640      typedef bool Value;
    26442641
    26452642    private:
    26462643
    2647       const CapacityMap* _capacity;
    2648       const FlowMap* _flow;
    2649       Tolerance _tolerance;
     2644      const CM* _capacity;
     2645      const FM* _flow;
     2646      TL _tolerance;
    26502647
    26512648    public:
    26522649
    2653       ResBackwardFilter(const CapacityMap& capacity, const FlowMap& flow,
    2654                         const Tolerance& tolerance = Tolerance())
     2650      ResBackwardFilter(const CM& capacity, const FM& flow,
     2651                        const TL& tolerance = TL())
    26552652        : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
    26562653
    2657       bool operator[](const typename Digraph::Arc& a) const {
     2654      bool operator[](const typename DGR::Arc& a) const {
    26582655        return _tolerance.positive((*_flow)[a]);
    26592656      }
     
    26822679  /// This class conforms to the \ref concepts::Digraph "Digraph" concept.
    26832680  ///
    2684   /// \tparam GR The type of the adapted digraph.
     2681  /// \tparam DGR The type of the adapted digraph.
    26852682  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
    26862683  /// It is implicitly \c const.
     
    27042701  /// is convertible to the \c Arc type of the adapted digraph.
    27052702#ifdef DOXYGEN
    2706   template<typename GR, typename CM, typename FM, typename TL>
     2703  template<typename DGR, typename CM, typename FM, typename TL>
    27072704  class ResidualDigraph
    27082705#else
    2709   template<typename GR,
    2710            typename CM = typename GR::template ArcMap<int>,
     2706  template<typename DGR,
     2707           typename CM = typename DGR::template ArcMap<int>,
    27112708           typename FM = CM,
    27122709           typename TL = Tolerance<typename CM::Value> >
    2713   class ResidualDigraph :
    2714     public FilterArcs<
    2715       Undirector<const GR>,
    2716       typename Undirector<const GR>::template CombinedArcMap<
    2717         _adaptor_bits::ResForwardFilter<const GR, CM, FM, TL>,
    2718         _adaptor_bits::ResBackwardFilter<const GR, CM, FM, TL> > >
     2710  class ResidualDigraph
     2711    : public SubDigraph<
     2712        Undirector<const DGR>,
     2713        ConstMap<typename DGR::Node, Const<bool, true> >,
     2714        typename Undirector<const DGR>::template CombinedArcMap<
     2715          _adaptor_bits::ResForwardFilter<const DGR, CM, FM, TL>,
     2716          _adaptor_bits::ResBackwardFilter<const DGR, CM, FM, TL> > >
    27192717#endif
    27202718  {
     
    27222720
    27232721    /// The type of the underlying digraph.
    2724     typedef GR Digraph;
     2722    typedef DGR Digraph;
    27252723    /// The type of the capacity map.
    27262724    typedef CM CapacityMap;
     
    27372735    typedef Undirector<const Digraph> Undirected;
    27382736
    2739     typedef _adaptor_bits::ResForwardFilter<const Digraph, CapacityMap,
    2740                                             FlowMap, Tolerance> ForwardFilter;
    2741 
    2742     typedef _adaptor_bits::ResBackwardFilter<const Digraph, CapacityMap,
    2743                                              FlowMap, Tolerance> BackwardFilter;
     2737    typedef ConstMap<typename DGR::Node, Const<bool, true> > NodeFilter;
     2738
     2739    typedef _adaptor_bits::ResForwardFilter<const DGR, CM,
     2740                                            FM, TL> ForwardFilter;
     2741
     2742    typedef _adaptor_bits::ResBackwardFilter<const DGR, CM,
     2743                                             FM, TL> BackwardFilter;
    27442744
    27452745    typedef typename Undirected::
    27462746      template CombinedArcMap<ForwardFilter, BackwardFilter> ArcFilter;
    27472747
    2748     typedef FilterArcs<Undirected, ArcFilter> Parent;
     2748    typedef SubDigraph<Undirected, NodeFilter, ArcFilter> Parent;
    27492749
    27502750    const CapacityMap* _capacity;
     
    27522752
    27532753    Undirected _graph;
     2754    NodeFilter _node_filter;
    27542755    ForwardFilter _forward_filter;
    27552756    BackwardFilter _backward_filter;
     
    27622763    /// Constructor of the residual digraph adaptor. The parameters are the
    27632764    /// digraph, the capacity map, the flow map, and a tolerance object.
    2764     ResidualDigraph(const Digraph& digraph, const CapacityMap& capacity,
    2765                     FlowMap& flow, const Tolerance& tolerance = Tolerance())
    2766       : Parent(), _capacity(&capacity), _flow(&flow), _graph(digraph),
     2765    ResidualDigraph(const DGR& digraph, const CM& capacity,
     2766                    FM& flow, const TL& tolerance = Tolerance())
     2767      : Parent(), _capacity(&capacity), _flow(&flow),
     2768        _graph(digraph), _node_filter(),
    27672769        _forward_filter(capacity, flow, tolerance),
    27682770        _backward_filter(capacity, flow, tolerance),
    27692771        _arc_filter(_forward_filter, _backward_filter)
    27702772    {
    2771       Parent::setDigraph(_graph);
    2772       Parent::setArcFilterMap(_arc_filter);
     2773      Parent::initialize(_graph, _node_filter, _arc_filter);
    27732774    }
    27742775
     
    28462847
    28472848      /// Constructor
    2848       ResidualCapacity(const Adaptor& adaptor) : _adaptor(&adaptor) {}
     2849      ResidualCapacity(const ResidualDigraph<DGR, CM, FM, TL>& adaptor)
     2850        : _adaptor(&adaptor) {}
    28492851
    28502852      /// Returns the value associated with the given residual arc
     
    28662868  /// \brief Returns a (read-only) Residual adaptor
    28672869  ///
    2868   /// This function just returns a (read-only) \ref Residual adaptor.
     2870  /// This function just returns a (read-only) \ref ResidualDigraph adaptor.
    28692871  /// \ingroup graph_adaptors
    2870   /// \relates Residual
    2871   template<typename GR, typename CM, typename FM>
    2872   ResidualDigraph<GR, CM, FM>
    2873   residualDigraph(const GR& digraph, const CM& capacity_map, FM& flow_map) {
    2874     return ResidualDigraph<GR, CM, FM> (digraph, capacity_map, flow_map);
     2872  /// \relates ResidualDigraph
     2873    template<typename DGR, typename CM, typename FM>
     2874  ResidualDigraph<DGR, CM, FM>
     2875  residualDigraph(const DGR& digraph, const CM& capacity_map, FM& flow_map) {
     2876    return ResidualDigraph<DGR, CM, FM> (digraph, capacity_map, flow_map);
    28752877  }
    28762878
    28772879
    2878   template <typename _Digraph>
     2880  template <typename DGR>
    28792881  class SplitNodesBase {
    2880   public:
    2881 
    2882     typedef _Digraph Digraph;
    2883     typedef DigraphAdaptorBase<const _Digraph> Parent;
     2882    typedef DigraphAdaptorBase<const DGR> Parent;
     2883
     2884  public:
     2885
     2886    typedef DGR Digraph;
    28842887    typedef SplitNodesBase Adaptor;
    28852888
    2886     typedef typename Digraph::Node DigraphNode;
    2887     typedef typename Digraph::Arc DigraphArc;
     2889    typedef typename DGR::Node DigraphNode;
     2890    typedef typename DGR::Arc DigraphArc;
    28882891
    28892892    class Node;
     
    31493152  private:
    31503153
    3151     template <typename _Value>
     3154    template <typename V>
    31523155    class NodeMapBase
    3153       : public MapTraits<typename Parent::template NodeMap<_Value> > {
    3154       typedef typename Parent::template NodeMap<_Value> NodeImpl;
     3156      : public MapTraits<typename Parent::template NodeMap<V> > {
     3157      typedef typename Parent::template NodeMap<V> NodeImpl;
    31553158    public:
    31563159      typedef Node Key;
    3157       typedef _Value Value;
     3160      typedef V Value;
    31583161      typedef typename MapTraits<NodeImpl>::ReferenceMapTag ReferenceMapTag;
    31593162      typedef typename MapTraits<NodeImpl>::ReturnValue ReturnValue;
     
    31623165      typedef typename MapTraits<NodeImpl>::ConstReturnValue ConstReference;
    31633166
    3164       NodeMapBase(const Adaptor& adaptor)
     3167      NodeMapBase(const SplitNodesBase<DGR>& adaptor)
    31653168        : _in_map(*adaptor._digraph), _out_map(*adaptor._digraph) {}
    3166       NodeMapBase(const Adaptor& adaptor, const Value& value)
     3169      NodeMapBase(const SplitNodesBase<DGR>& adaptor, const V& value)
    31673170        : _in_map(*adaptor._digraph, value),
    31683171          _out_map(*adaptor._digraph, value) {}
    31693172
    3170       void set(const Node& key, const Value& val) {
    3171         if (Adaptor::inNode(key)) { _in_map.set(key, val); }
     3173      void set(const Node& key, const V& val) {
     3174        if (SplitNodesBase<DGR>::inNode(key)) { _in_map.set(key, val); }
    31723175        else {_out_map.set(key, val); }
    31733176      }
    31743177
    31753178      ReturnValue operator[](const Node& key) {
    3176         if (Adaptor::inNode(key)) { return _in_map[key]; }
     3179        if (SplitNodesBase<DGR>::inNode(key)) { return _in_map[key]; }
    31773180        else { return _out_map[key]; }
    31783181      }
     
    31873190    };
    31883191
    3189     template <typename _Value>
     3192    template <typename V>
    31903193    class ArcMapBase
    3191       : public MapTraits<typename Parent::template ArcMap<_Value> > {
    3192       typedef typename Parent::template ArcMap<_Value> ArcImpl;
    3193       typedef typename Parent::template NodeMap<_Value> NodeImpl;
     3194      : public MapTraits<typename Parent::template ArcMap<V> > {
     3195      typedef typename Parent::template ArcMap<V> ArcImpl;
     3196      typedef typename Parent::template NodeMap<V> NodeImpl;
    31943197    public:
    31953198      typedef Arc Key;
    3196       typedef _Value Value;
     3199      typedef V Value;
    31973200      typedef typename MapTraits<ArcImpl>::ReferenceMapTag ReferenceMapTag;
    31983201      typedef typename MapTraits<ArcImpl>::ReturnValue ReturnValue;
     
    32013204      typedef typename MapTraits<ArcImpl>::ConstReturnValue ConstReference;
    32023205
    3203       ArcMapBase(const Adaptor& adaptor)
     3206      ArcMapBase(const SplitNodesBase<DGR>& adaptor)
    32043207        : _arc_map(*adaptor._digraph), _node_map(*adaptor._digraph) {}
    3205       ArcMapBase(const Adaptor& adaptor, const Value& value)
     3208      ArcMapBase(const SplitNodesBase<DGR>& adaptor, const V& value)
    32063209        : _arc_map(*adaptor._digraph, value),
    32073210          _node_map(*adaptor._digraph, value) {}
    32083211
    3209       void set(const Arc& key, const Value& val) {
    3210         if (Adaptor::origArc(key)) {
    3211           _arc_map.set(key._item.first(), val);
     3212      void set(const Arc& key, const V& val) {
     3213        if (SplitNodesBase<DGR>::origArc(key)) {
     3214          _arc_map.set(static_cast<const DigraphArc&>(key), val);
    32123215        } else {
    3213           _node_map.set(key._item.second(), val);
     3216          _node_map.set(static_cast<const DigraphNode&>(key), val);
    32143217        }
    32153218      }
    32163219
    32173220      ReturnValue operator[](const Arc& key) {
    3218         if (Adaptor::origArc(key)) {
    3219           return _arc_map[key._item.first()];
     3221        if (SplitNodesBase<DGR>::origArc(key)) {
     3222          return _arc_map[static_cast<const DigraphArc&>(key)];
    32203223        } else {
    3221           return _node_map[key._item.second()];
     3224          return _node_map[static_cast<const DigraphNode&>(key)];
    32223225        }
    32233226      }
    32243227
    32253228      ConstReturnValue operator[](const Arc& key) const {
    3226         if (Adaptor::origArc(key)) {
    3227           return _arc_map[key._item.first()];
     3229        if (SplitNodesBase<DGR>::origArc(key)) {
     3230          return _arc_map[static_cast<const DigraphArc&>(key)];
    32283231        } else {
    3229           return _node_map[key._item.second()];
     3232          return _node_map[static_cast<const DigraphNode&>(key)];
    32303233        }
    32313234      }
     
    32383241  public:
    32393242
    3240     template <typename _Value>
     3243    template <typename V>
    32413244    class NodeMap
    3242       : public SubMapExtender<Adaptor, NodeMapBase<_Value> >
    3243     {
     3245      : public SubMapExtender<SplitNodesBase<DGR>, NodeMapBase<V> > {
     3246      typedef SubMapExtender<SplitNodesBase<DGR>, NodeMapBase<V> > Parent;
     3247
    32443248    public:
    3245       typedef _Value Value;
    3246       typedef SubMapExtender<Adaptor, NodeMapBase<Value> > Parent;
    3247 
    3248       NodeMap(const Adaptor& adaptor)
     3249      typedef V Value;
     3250
     3251      NodeMap(const SplitNodesBase<DGR>& adaptor)
    32493252        : Parent(adaptor) {}
    32503253
    3251       NodeMap(const Adaptor& adaptor, const Value& value)
     3254      NodeMap(const SplitNodesBase<DGR>& adaptor, const V& value)
    32523255        : Parent(adaptor, value) {}
    32533256
     
    32643267    };
    32653268
    3266     template <typename _Value>
     3269    template <typename V>
    32673270    class ArcMap
    3268       : public SubMapExtender<Adaptor, ArcMapBase<_Value> >
    3269     {
     3271      : public SubMapExtender<SplitNodesBase<DGR>, ArcMapBase<V> > {
     3272      typedef SubMapExtender<SplitNodesBase<DGR>, ArcMapBase<V> > Parent;
     3273
    32703274    public:
    3271       typedef _Value Value;
    3272       typedef SubMapExtender<Adaptor, ArcMapBase<Value> > Parent;
    3273 
    3274       ArcMap(const Adaptor& adaptor)
     3275      typedef V Value;
     3276
     3277      ArcMap(const SplitNodesBase<DGR>& adaptor)
    32753278        : Parent(adaptor) {}
    32763279
    3277       ArcMap(const Adaptor& adaptor, const Value& value)
     3280      ArcMap(const SplitNodesBase<DGR>& adaptor, const V& value)
    32783281        : Parent(adaptor, value) {}
    32793282
     
    32943297    SplitNodesBase() : _digraph(0) {}
    32953298
    3296     Digraph* _digraph;
    3297 
    3298     void setDigraph(Digraph& digraph) {
     3299    DGR* _digraph;
     3300
     3301    void initialize(Digraph& digraph) {
    32993302      _digraph = &digraph;
    33003303    }
     
    33233326  /// in the adaptor.
    33243327  ///
    3325   /// \tparam GR The type of the adapted digraph.
     3328  /// \tparam DGR The type of the adapted digraph.
    33263329  /// It must conform to the \ref concepts::Digraph "Digraph" concept.
    33273330  /// It is implicitly \c const.
     
    33293332  /// \note The \c Node type of this adaptor is converible to the \c Node
    33303333  /// type of the adapted digraph.
    3331   template <typename GR>
     3334  template <typename DGR>
    33323335#ifdef DOXYGEN
    33333336  class SplitNodes {
    33343337#else
    33353338  class SplitNodes
    3336     : public DigraphAdaptorExtender<SplitNodesBase<const GR> > {
     3339    : public DigraphAdaptorExtender<SplitNodesBase<const DGR> > {
    33373340#endif
    3338   public:
    3339     typedef GR Digraph;
    3340     typedef DigraphAdaptorExtender<SplitNodesBase<const GR> > Parent;
    3341 
    3342     typedef typename Digraph::Node DigraphNode;
    3343     typedef typename Digraph::Arc DigraphArc;
     3341    typedef DigraphAdaptorExtender<SplitNodesBase<const DGR> > Parent;
     3342
     3343  public:
     3344    typedef DGR Digraph;
     3345
     3346    typedef typename DGR::Node DigraphNode;
     3347    typedef typename DGR::Arc DigraphArc;
    33443348
    33453349    typedef typename Parent::Node Node;
     
    33493353    ///
    33503354    /// Constructor of the adaptor.
    3351     SplitNodes(const Digraph& g) {
    3352       Parent::setDigraph(g);
     3355    SplitNodes(const DGR& g) {
     3356      Parent::initialize(g);
    33533357    }
    33543358
     
    34193423    /// This map adaptor class adapts two node maps of the original digraph
    34203424    /// to get a node map of the split digraph.
    3421     /// Its value type is inherited from the first node map type
    3422     /// (\c InNodeMap).
    3423     template <typename InNodeMap, typename OutNodeMap>
     3425    /// Its value type is inherited from the first node map type (\c IN).
     3426    /// \tparam IN The type of the node map for the in-nodes.
     3427    /// \tparam OUT The type of the node map for the out-nodes.
     3428    template <typename IN, typename OUT>
    34243429    class CombinedNodeMap {
    34253430    public:
     
    34283433      typedef Node Key;
    34293434      /// The value type of the map
    3430       typedef typename InNodeMap::Value Value;
    3431 
    3432       typedef typename MapTraits<InNodeMap>::ReferenceMapTag ReferenceMapTag;
    3433       typedef typename MapTraits<InNodeMap>::ReturnValue ReturnValue;
    3434       typedef typename MapTraits<InNodeMap>::ConstReturnValue ConstReturnValue;
    3435       typedef typename MapTraits<InNodeMap>::ReturnValue Reference;
    3436       typedef typename MapTraits<InNodeMap>::ConstReturnValue ConstReference;
     3435      typedef typename IN::Value Value;
     3436
     3437      typedef typename MapTraits<IN>::ReferenceMapTag ReferenceMapTag;
     3438      typedef typename MapTraits<IN>::ReturnValue ReturnValue;
     3439      typedef typename MapTraits<IN>::ConstReturnValue ConstReturnValue;
     3440      typedef typename MapTraits<IN>::ReturnValue Reference;
     3441      typedef typename MapTraits<IN>::ConstReturnValue ConstReference;
    34373442
    34383443      /// Constructor
    3439       CombinedNodeMap(InNodeMap& in_map, OutNodeMap& out_map)
     3444      CombinedNodeMap(IN& in_map, OUT& out_map)
    34403445        : _in_map(in_map), _out_map(out_map) {}
    34413446
    34423447      /// Returns the value associated with the given key.
    34433448      Value operator[](const Key& key) const {
    3444         if (Parent::inNode(key)) {
     3449        if (SplitNodesBase<const DGR>::inNode(key)) {
    34453450          return _in_map[key];
    34463451        } else {
     
    34513456      /// Returns a reference to the value associated with the given key.
    34523457      Value& operator[](const Key& key) {
    3453         if (Parent::inNode(key)) {
     3458        if (SplitNodesBase<const DGR>::inNode(key)) {
    34543459          return _in_map[key];
    34553460        } else {
     
    34603465      /// Sets the value associated with the given key.
    34613466      void set(const Key& key, const Value& value) {
    3462         if (Parent::inNode(key)) {
     3467        if (SplitNodesBase<const DGR>::inNode(key)) {
    34633468          _in_map.set(key, value);
    34643469        } else {
     
    34693474    private:
    34703475
    3471       InNodeMap& _in_map;
    3472       OutNodeMap& _out_map;
     3476      IN& _in_map;
     3477      OUT& _out_map;
    34733478
    34743479    };
     
    34783483    ///
    34793484    /// This function just returns a combined node map.
    3480     template <typename InNodeMap, typename OutNodeMap>
    3481     static CombinedNodeMap<InNodeMap, OutNodeMap>
    3482     combinedNodeMap(InNodeMap& in_map, OutNodeMap& out_map) {
    3483       return CombinedNodeMap<InNodeMap, OutNodeMap>(in_map, out_map);
    3484     }
    3485 
    3486     template <typename InNodeMap, typename OutNodeMap>
    3487     static CombinedNodeMap<const InNodeMap, OutNodeMap>
    3488     combinedNodeMap(const InNodeMap& in_map, OutNodeMap& out_map) {
    3489       return CombinedNodeMap<const InNodeMap, OutNodeMap>(in_map, out_map);
    3490     }
    3491 
    3492     template <typename InNodeMap, typename OutNodeMap>
    3493     static CombinedNodeMap<InNodeMap, const OutNodeMap>
    3494     combinedNodeMap(InNodeMap& in_map, const OutNodeMap& out_map) {
    3495       return CombinedNodeMap<InNodeMap, const OutNodeMap>(in_map, out_map);
    3496     }
    3497 
    3498     template <typename InNodeMap, typename OutNodeMap>
    3499     static CombinedNodeMap<const InNodeMap, const OutNodeMap>
    3500     combinedNodeMap(const InNodeMap& in_map, const OutNodeMap& out_map) {
    3501       return CombinedNodeMap<const InNodeMap,
    3502         const OutNodeMap>(in_map, out_map);
     3485    template <typename IN, typename OUT>
     3486    static CombinedNodeMap<IN, OUT>
     3487    combinedNodeMap(IN& in_map, OUT& out_map) {
     3488      return CombinedNodeMap<IN, OUT>(in_map, out_map);
     3489    }
     3490
     3491    template <typename IN, typename OUT>
     3492    static CombinedNodeMap<const IN, OUT>
     3493    combinedNodeMap(const IN& in_map, OUT& out_map) {
     3494      return CombinedNodeMap<const IN, OUT>(in_map, out_map);
     3495    }
     3496
     3497    template <typename IN, typename OUT>
     3498    static CombinedNodeMap<IN, const OUT>
     3499    combinedNodeMap(IN& in_map, const OUT& out_map) {
     3500      return CombinedNodeMap<IN, const OUT>(in_map, out_map);
     3501    }
     3502
     3503    template <typename IN, typename OUT>
     3504    static CombinedNodeMap<const IN, const OUT>
     3505    combinedNodeMap(const IN& in_map, const OUT& out_map) {
     3506      return CombinedNodeMap<const IN, const OUT>(in_map, out_map);
    35033507    }
    35043508
     
    35083512    /// This map adaptor class adapts an arc map and a node map of the
    35093513    /// original digraph to get an arc map of the split digraph.
    3510     /// Its value type is inherited from the original arc map type
    3511     /// (\c ArcMap).
    3512     template <typename ArcMap, typename NodeMap>
     3514    /// Its value type is inherited from the original arc map type (\c AM).
     3515    /// \tparam AM The type of the arc map.
     3516    /// \tparam NM the type of the node map.
     3517    template <typename AM, typename NM>
    35133518    class CombinedArcMap {
    35143519    public:
     
    35173522      typedef Arc Key;
    35183523      /// The value type of the map
    3519       typedef typename ArcMap::Value Value;
    3520 
    3521       typedef typename MapTraits<ArcMap>::ReferenceMapTag ReferenceMapTag;
    3522       typedef typename MapTraits<ArcMap>::ReturnValue ReturnValue;
    3523       typedef typename MapTraits<ArcMap>::ConstReturnValue ConstReturnValue;
    3524       typedef typename MapTraits<ArcMap>::ReturnValue Reference;
    3525       typedef typename MapTraits<ArcMap>::ConstReturnValue ConstReference;
     3524      typedef typename AM::Value Value;
     3525
     3526      typedef typename MapTraits<AM>::ReferenceMapTag ReferenceMapTag;
     3527      typedef typename MapTraits<AM>::ReturnValue ReturnValue;
     3528      typedef typename MapTraits<AM>::ConstReturnValue ConstReturnValue;
     3529      typedef typename MapTraits<AM>::ReturnValue Reference;
     3530      typedef typename MapTraits<AM>::ConstReturnValue ConstReference;
    35263531
    35273532      /// Constructor
    3528       CombinedArcMap(ArcMap& arc_map, NodeMap& node_map)
     3533      CombinedArcMap(AM& arc_map, NM& node_map)
    35293534        : _arc_map(arc_map), _node_map(node_map) {}
    35303535
    35313536      /// Returns the value associated with the given key.
    35323537      Value operator[](const Key& arc) const {
    3533         if (Parent::origArc(arc)) {
     3538        if (SplitNodesBase<const DGR>::origArc(arc)) {
    35343539          return _arc_map[arc];
    35353540        } else {
     
    35403545      /// Returns a reference to the value associated with the given key.
    35413546      Value& operator[](const Key& arc) {
    3542         if (Parent::origArc(arc)) {
     3547        if (SplitNodesBase<const DGR>::origArc(arc)) {
    35433548          return _arc_map[arc];
    35443549        } else {
     
    35493554      /// Sets the value associated with the given key.
    35503555      void set(const Arc& arc, const Value& val) {
    3551         if (Parent::origArc(arc)) {
     3556        if (SplitNodesBase<const DGR>::origArc(arc)) {
    35523557          _arc_map.set(arc, val);
    35533558        } else {
     
    35573562
    35583563    private:
    3559       ArcMap& _arc_map;
    3560       NodeMap& _node_map;
     3564
     3565      AM& _arc_map;
     3566      NM& _node_map;
     3567
    35613568    };
    35623569
     
    35953602  /// \ingroup graph_adaptors
    35963603  /// \relates SplitNodes
    3597   template<typename GR>
    3598   SplitNodes<GR>
    3599   splitNodes(const GR& digraph) {
    3600     return SplitNodes<GR>(digraph);
     3604  template<typename DGR>
     3605  SplitNodes<DGR>
     3606  splitNodes(const DGR& digraph) {
     3607    return SplitNodes<DGR>(digraph);
    36013608  }
    36023609
     3610#undef LEMON_SCOPE_FIX
     3611
    36033612} //namespace lemon
    36043613
Note: See TracChangeset for help on using the changeset viewer.