1.1 --- a/lemon/adaptors.h Fri Jan 23 16:42:07 2009 +0000
1.2 +++ b/lemon/adaptors.h Fri Feb 13 13:29:28 2009 +0100
1.3 @@ -36,23 +36,28 @@
1.4
1.5 namespace lemon {
1.6
1.7 - template<typename _Digraph>
1.8 +#ifdef _MSC_VER
1.9 +#define LEMON_SCOPE_FIX(OUTER, NESTED) OUTER::NESTED
1.10 +#else
1.11 +#define LEMON_SCOPE_FIX(OUTER, NESTED) typename OUTER::template NESTED
1.12 +#endif
1.13 +
1.14 + template<typename DGR>
1.15 class DigraphAdaptorBase {
1.16 public:
1.17 - typedef _Digraph Digraph;
1.18 + typedef DGR Digraph;
1.19 typedef DigraphAdaptorBase Adaptor;
1.20 - typedef Digraph ParentDigraph;
1.21
1.22 protected:
1.23 - Digraph* _digraph;
1.24 + DGR* _digraph;
1.25 DigraphAdaptorBase() : _digraph(0) { }
1.26 - void setDigraph(Digraph& digraph) { _digraph = &digraph; }
1.27 + void initialize(DGR& digraph) { _digraph = &digraph; }
1.28
1.29 public:
1.30 - DigraphAdaptorBase(Digraph& digraph) : _digraph(&digraph) { }
1.31 -
1.32 - typedef typename Digraph::Node Node;
1.33 - typedef typename Digraph::Arc Arc;
1.34 + DigraphAdaptorBase(DGR& digraph) : _digraph(&digraph) { }
1.35 +
1.36 + typedef typename DGR::Node Node;
1.37 + typedef typename DGR::Arc Arc;
1.38
1.39 void first(Node& i) const { _digraph->first(i); }
1.40 void first(Arc& i) const { _digraph->first(i); }
1.41 @@ -67,13 +72,13 @@
1.42 Node source(const Arc& a) const { return _digraph->source(a); }
1.43 Node target(const Arc& a) const { return _digraph->target(a); }
1.44
1.45 - typedef NodeNumTagIndicator<Digraph> NodeNumTag;
1.46 + typedef NodeNumTagIndicator<DGR> NodeNumTag;
1.47 int nodeNum() const { return _digraph->nodeNum(); }
1.48
1.49 - typedef ArcNumTagIndicator<Digraph> ArcNumTag;
1.50 + typedef ArcNumTagIndicator<DGR> ArcNumTag;
1.51 int arcNum() const { return _digraph->arcNum(); }
1.52
1.53 - typedef FindArcTagIndicator<Digraph> FindArcTag;
1.54 + typedef FindArcTagIndicator<DGR> FindArcTag;
1.55 Arc findArc(const Node& u, const Node& v, const Arc& prev = INVALID) const {
1.56 return _digraph->findArc(u, v, prev);
1.57 }
1.58 @@ -95,22 +100,22 @@
1.59 int maxNodeId() const { return _digraph->maxNodeId(); }
1.60 int maxArcId() const { return _digraph->maxArcId(); }
1.61
1.62 - typedef typename ItemSetTraits<Digraph, Node>::ItemNotifier NodeNotifier;
1.63 + typedef typename ItemSetTraits<DGR, Node>::ItemNotifier NodeNotifier;
1.64 NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
1.65
1.66 - typedef typename ItemSetTraits<Digraph, Arc>::ItemNotifier ArcNotifier;
1.67 + typedef typename ItemSetTraits<DGR, Arc>::ItemNotifier ArcNotifier;
1.68 ArcNotifier& notifier(Arc) const { return _digraph->notifier(Arc()); }
1.69
1.70 - template <typename _Value>
1.71 - class NodeMap : public Digraph::template NodeMap<_Value> {
1.72 + template <typename V>
1.73 + class NodeMap : public DGR::template NodeMap<V> {
1.74 public:
1.75
1.76 - typedef typename Digraph::template NodeMap<_Value> Parent;
1.77 + typedef typename DGR::template NodeMap<V> Parent;
1.78
1.79 explicit NodeMap(const Adaptor& adaptor)
1.80 : Parent(*adaptor._digraph) {}
1.81
1.82 - NodeMap(const Adaptor& adaptor, const _Value& value)
1.83 + NodeMap(const Adaptor& adaptor, const V& value)
1.84 : Parent(*adaptor._digraph, value) { }
1.85
1.86 private:
1.87 @@ -126,16 +131,16 @@
1.88
1.89 };
1.90
1.91 - template <typename _Value>
1.92 - class ArcMap : public Digraph::template ArcMap<_Value> {
1.93 + template <typename V>
1.94 + class ArcMap : public DGR::template ArcMap<V> {
1.95 public:
1.96
1.97 - typedef typename Digraph::template ArcMap<_Value> Parent;
1.98 -
1.99 - explicit ArcMap(const Adaptor& adaptor)
1.100 + typedef typename DGR::template ArcMap<V> Parent;
1.101 +
1.102 + explicit ArcMap(const DigraphAdaptorBase<DGR>& adaptor)
1.103 : Parent(*adaptor._digraph) {}
1.104
1.105 - ArcMap(const Adaptor& adaptor, const _Value& value)
1.106 + ArcMap(const DigraphAdaptorBase<DGR>& adaptor, const V& value)
1.107 : Parent(*adaptor._digraph, value) {}
1.108
1.109 private:
1.110 @@ -153,25 +158,24 @@
1.111
1.112 };
1.113
1.114 - template<typename _Graph>
1.115 + template<typename GR>
1.116 class GraphAdaptorBase {
1.117 public:
1.118 - typedef _Graph Graph;
1.119 - typedef Graph ParentGraph;
1.120 + typedef GR Graph;
1.121
1.122 protected:
1.123 - Graph* _graph;
1.124 + GR* _graph;
1.125
1.126 GraphAdaptorBase() : _graph(0) {}
1.127
1.128 - void setGraph(Graph& graph) { _graph = &graph; }
1.129 + void initialize(GR& graph) { _graph = &graph; }
1.130
1.131 public:
1.132 - GraphAdaptorBase(Graph& graph) : _graph(&graph) {}
1.133 -
1.134 - typedef typename Graph::Node Node;
1.135 - typedef typename Graph::Arc Arc;
1.136 - typedef typename Graph::Edge Edge;
1.137 + GraphAdaptorBase(GR& graph) : _graph(&graph) {}
1.138 +
1.139 + typedef typename GR::Node Node;
1.140 + typedef typename GR::Arc Arc;
1.141 + typedef typename GR::Edge Edge;
1.142
1.143 void first(Node& i) const { _graph->first(i); }
1.144 void first(Arc& i) const { _graph->first(i); }
1.145 @@ -239,22 +243,22 @@
1.146 int maxArcId() const { return _graph->maxArcId(); }
1.147 int maxEdgeId() const { return _graph->maxEdgeId(); }
1.148
1.149 - typedef typename ItemSetTraits<Graph, Node>::ItemNotifier NodeNotifier;
1.150 + typedef typename ItemSetTraits<GR, Node>::ItemNotifier NodeNotifier;
1.151 NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); }
1.152
1.153 - typedef typename ItemSetTraits<Graph, Arc>::ItemNotifier ArcNotifier;
1.154 + typedef typename ItemSetTraits<GR, Arc>::ItemNotifier ArcNotifier;
1.155 ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); }
1.156
1.157 - typedef typename ItemSetTraits<Graph, Edge>::ItemNotifier EdgeNotifier;
1.158 + typedef typename ItemSetTraits<GR, Edge>::ItemNotifier EdgeNotifier;
1.159 EdgeNotifier& notifier(Edge) const { return _graph->notifier(Edge()); }
1.160
1.161 - template <typename _Value>
1.162 - class NodeMap : public Graph::template NodeMap<_Value> {
1.163 + template <typename V>
1.164 + class NodeMap : public GR::template NodeMap<V> {
1.165 public:
1.166 - typedef typename Graph::template NodeMap<_Value> Parent;
1.167 - explicit NodeMap(const GraphAdaptorBase<Graph>& adapter)
1.168 + typedef typename GR::template NodeMap<V> Parent;
1.169 + explicit NodeMap(const GraphAdaptorBase<GR>& adapter)
1.170 : Parent(*adapter._graph) {}
1.171 - NodeMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value)
1.172 + NodeMap(const GraphAdaptorBase<GR>& adapter, const V& value)
1.173 : Parent(*adapter._graph, value) {}
1.174
1.175 private:
1.176 @@ -270,13 +274,13 @@
1.177
1.178 };
1.179
1.180 - template <typename _Value>
1.181 - class ArcMap : public Graph::template ArcMap<_Value> {
1.182 + template <typename V>
1.183 + class ArcMap : public GR::template ArcMap<V> {
1.184 public:
1.185 - typedef typename Graph::template ArcMap<_Value> Parent;
1.186 - explicit ArcMap(const GraphAdaptorBase<Graph>& adapter)
1.187 + typedef typename GR::template ArcMap<V> Parent;
1.188 + explicit ArcMap(const GraphAdaptorBase<GR>& adapter)
1.189 : Parent(*adapter._graph) {}
1.190 - ArcMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value)
1.191 + ArcMap(const GraphAdaptorBase<GR>& adapter, const V& value)
1.192 : Parent(*adapter._graph, value) {}
1.193
1.194 private:
1.195 @@ -291,13 +295,13 @@
1.196 }
1.197 };
1.198
1.199 - template <typename _Value>
1.200 - class EdgeMap : public Graph::template EdgeMap<_Value> {
1.201 + template <typename V>
1.202 + class EdgeMap : public GR::template EdgeMap<V> {
1.203 public:
1.204 - typedef typename Graph::template EdgeMap<_Value> Parent;
1.205 - explicit EdgeMap(const GraphAdaptorBase<Graph>& adapter)
1.206 + typedef typename GR::template EdgeMap<V> Parent;
1.207 + explicit EdgeMap(const GraphAdaptorBase<GR>& adapter)
1.208 : Parent(*adapter._graph) {}
1.209 - EdgeMap(const GraphAdaptorBase<Graph>& adapter, const _Value& value)
1.210 + EdgeMap(const GraphAdaptorBase<GR>& adapter, const V& value)
1.211 : Parent(*adapter._graph, value) {}
1.212
1.213 private:
1.214 @@ -314,11 +318,11 @@
1.215
1.216 };
1.217
1.218 - template <typename _Digraph>
1.219 - class ReverseDigraphBase : public DigraphAdaptorBase<_Digraph> {
1.220 + template <typename DGR>
1.221 + class ReverseDigraphBase : public DigraphAdaptorBase<DGR> {
1.222 public:
1.223 - typedef _Digraph Digraph;
1.224 - typedef DigraphAdaptorBase<_Digraph> Parent;
1.225 + typedef DGR Digraph;
1.226 + typedef DigraphAdaptorBase<DGR> Parent;
1.227 protected:
1.228 ReverseDigraphBase() : Parent() { }
1.229 public:
1.230 @@ -336,7 +340,7 @@
1.231
1.232 Arc addArc(const Node& u, const Node& v) { return Parent::addArc(v, u); }
1.233
1.234 - typedef FindArcTagIndicator<Digraph> FindArcTag;
1.235 + typedef FindArcTagIndicator<DGR> FindArcTag;
1.236 Arc findArc(const Node& u, const Node& v,
1.237 const Arc& prev = INVALID) const {
1.238 return Parent::findArc(v, u, prev);
1.239 @@ -356,23 +360,23 @@
1.240 /// by adding or removing nodes or arcs, unless the \c GR template
1.241 /// parameter is set to be \c const.
1.242 ///
1.243 - /// \tparam GR The type of the adapted digraph.
1.244 + /// \tparam DGR The type of the adapted digraph.
1.245 /// It must conform to the \ref concepts::Digraph "Digraph" concept.
1.246 /// It can also be specified to be \c const.
1.247 ///
1.248 /// \note The \c Node and \c Arc types of this adaptor and the adapted
1.249 /// digraph are convertible to each other.
1.250 - template<typename GR>
1.251 + template<typename DGR>
1.252 #ifdef DOXYGEN
1.253 class ReverseDigraph {
1.254 #else
1.255 class ReverseDigraph :
1.256 - public DigraphAdaptorExtender<ReverseDigraphBase<GR> > {
1.257 + public DigraphAdaptorExtender<ReverseDigraphBase<DGR> > {
1.258 #endif
1.259 public:
1.260 /// The type of the adapted digraph.
1.261 - typedef GR Digraph;
1.262 - typedef DigraphAdaptorExtender<ReverseDigraphBase<GR> > Parent;
1.263 + typedef DGR Digraph;
1.264 + typedef DigraphAdaptorExtender<ReverseDigraphBase<DGR> > Parent;
1.265 protected:
1.266 ReverseDigraph() { }
1.267 public:
1.268 @@ -380,8 +384,8 @@
1.269 /// \brief Constructor
1.270 ///
1.271 /// Creates a reverse digraph adaptor for the given digraph.
1.272 - explicit ReverseDigraph(Digraph& digraph) {
1.273 - Parent::setDigraph(digraph);
1.274 + explicit ReverseDigraph(DGR& digraph) {
1.275 + Parent::initialize(digraph);
1.276 }
1.277 };
1.278
1.279 @@ -390,33 +394,31 @@
1.280 /// This function just returns a read-only \ref ReverseDigraph adaptor.
1.281 /// \ingroup graph_adaptors
1.282 /// \relates ReverseDigraph
1.283 - template<typename GR>
1.284 - ReverseDigraph<const GR> reverseDigraph(const GR& digraph) {
1.285 - return ReverseDigraph<const GR>(digraph);
1.286 + template<typename DGR>
1.287 + ReverseDigraph<const DGR> reverseDigraph(const DGR& digraph) {
1.288 + return ReverseDigraph<const DGR>(digraph);
1.289 }
1.290
1.291
1.292 - template <typename _Digraph, typename _NodeFilterMap,
1.293 - typename _ArcFilterMap, bool _checked = true>
1.294 - class SubDigraphBase : public DigraphAdaptorBase<_Digraph> {
1.295 + template <typename DGR, typename NF, typename AF, bool ch = true>
1.296 + class SubDigraphBase : public DigraphAdaptorBase<DGR> {
1.297 public:
1.298 - typedef _Digraph Digraph;
1.299 - typedef _NodeFilterMap NodeFilterMap;
1.300 - typedef _ArcFilterMap ArcFilterMap;
1.301 + typedef DGR Digraph;
1.302 + typedef NF NodeFilterMap;
1.303 + typedef AF ArcFilterMap;
1.304
1.305 typedef SubDigraphBase Adaptor;
1.306 - typedef DigraphAdaptorBase<_Digraph> Parent;
1.307 + typedef DigraphAdaptorBase<DGR> Parent;
1.308 protected:
1.309 - NodeFilterMap* _node_filter;
1.310 - ArcFilterMap* _arc_filter;
1.311 + NF* _node_filter;
1.312 + AF* _arc_filter;
1.313 SubDigraphBase()
1.314 : Parent(), _node_filter(0), _arc_filter(0) { }
1.315
1.316 - void setNodeFilterMap(NodeFilterMap& node_filter) {
1.317 + void initialize(DGR& digraph, NF& node_filter, AF& arc_filter) {
1.318 + Parent::initialize(digraph);
1.319 _node_filter = &node_filter;
1.320 - }
1.321 - void setArcFilterMap(ArcFilterMap& arc_filter) {
1.322 - _arc_filter = &arc_filter;
1.323 + _arc_filter = &arc_filter;
1.324 }
1.325
1.326 public:
1.327 @@ -487,7 +489,7 @@
1.328 typedef False NodeNumTag;
1.329 typedef False ArcNumTag;
1.330
1.331 - typedef FindArcTagIndicator<Digraph> FindArcTag;
1.332 + typedef FindArcTagIndicator<DGR> FindArcTag;
1.333 Arc findArc(const Node& source, const Node& target,
1.334 const Arc& prev = INVALID) const {
1.335 if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
1.336 @@ -500,18 +502,21 @@
1.337 return arc;
1.338 }
1.339
1.340 - template <typename _Value>
1.341 - class NodeMap : public SubMapExtender<Adaptor,
1.342 - typename Parent::template NodeMap<_Value> > {
1.343 + public:
1.344 +
1.345 + template <typename V>
1.346 + class NodeMap
1.347 + : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
1.348 + LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
1.349 public:
1.350 - typedef _Value Value;
1.351 - typedef SubMapExtender<Adaptor, typename Parent::
1.352 - template NodeMap<Value> > MapParent;
1.353 -
1.354 - NodeMap(const Adaptor& adaptor)
1.355 - : MapParent(adaptor) {}
1.356 - NodeMap(const Adaptor& adaptor, const Value& value)
1.357 - : MapParent(adaptor, value) {}
1.358 + typedef V Value;
1.359 + typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
1.360 + LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
1.361 +
1.362 + NodeMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor)
1.363 + : Parent(adaptor) {}
1.364 + NodeMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor, const V& value)
1.365 + : Parent(adaptor, value) {}
1.366
1.367 private:
1.368 NodeMap& operator=(const NodeMap& cmap) {
1.369 @@ -520,23 +525,24 @@
1.370
1.371 template <typename CMap>
1.372 NodeMap& operator=(const CMap& cmap) {
1.373 - MapParent::operator=(cmap);
1.374 + Parent::operator=(cmap);
1.375 return *this;
1.376 }
1.377 };
1.378
1.379 - template <typename _Value>
1.380 - class ArcMap : public SubMapExtender<Adaptor,
1.381 - typename Parent::template ArcMap<_Value> > {
1.382 + template <typename V>
1.383 + class ArcMap
1.384 + : public SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
1.385 + LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
1.386 public:
1.387 - typedef _Value Value;
1.388 - typedef SubMapExtender<Adaptor, typename Parent::
1.389 - template ArcMap<Value> > MapParent;
1.390 -
1.391 - ArcMap(const Adaptor& adaptor)
1.392 - : MapParent(adaptor) {}
1.393 - ArcMap(const Adaptor& adaptor, const Value& value)
1.394 - : MapParent(adaptor, value) {}
1.395 + typedef V Value;
1.396 + typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, ch>,
1.397 + LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> Parent;
1.398 +
1.399 + ArcMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor)
1.400 + : Parent(adaptor) {}
1.401 + ArcMap(const SubDigraphBase<DGR, NF, AF, ch>& adaptor, const V& value)
1.402 + : Parent(adaptor, value) {}
1.403
1.404 private:
1.405 ArcMap& operator=(const ArcMap& cmap) {
1.406 @@ -545,34 +551,33 @@
1.407
1.408 template <typename CMap>
1.409 ArcMap& operator=(const CMap& cmap) {
1.410 - MapParent::operator=(cmap);
1.411 + Parent::operator=(cmap);
1.412 return *this;
1.413 }
1.414 };
1.415
1.416 };
1.417
1.418 - template <typename _Digraph, typename _NodeFilterMap, typename _ArcFilterMap>
1.419 - class SubDigraphBase<_Digraph, _NodeFilterMap, _ArcFilterMap, false>
1.420 - : public DigraphAdaptorBase<_Digraph> {
1.421 + template <typename DGR, typename NF, typename AF>
1.422 + class SubDigraphBase<DGR, NF, AF, false>
1.423 + : public DigraphAdaptorBase<DGR> {
1.424 public:
1.425 - typedef _Digraph Digraph;
1.426 - typedef _NodeFilterMap NodeFilterMap;
1.427 - typedef _ArcFilterMap ArcFilterMap;
1.428 + typedef DGR Digraph;
1.429 + typedef NF NodeFilterMap;
1.430 + typedef AF ArcFilterMap;
1.431
1.432 typedef SubDigraphBase Adaptor;
1.433 typedef DigraphAdaptorBase<Digraph> Parent;
1.434 protected:
1.435 - NodeFilterMap* _node_filter;
1.436 - ArcFilterMap* _arc_filter;
1.437 + NF* _node_filter;
1.438 + AF* _arc_filter;
1.439 SubDigraphBase()
1.440 : Parent(), _node_filter(0), _arc_filter(0) { }
1.441
1.442 - void setNodeFilterMap(NodeFilterMap& node_filter) {
1.443 + void initialize(DGR& digraph, NF& node_filter, AF& arc_filter) {
1.444 + Parent::initialize(digraph);
1.445 _node_filter = &node_filter;
1.446 - }
1.447 - void setArcFilterMap(ArcFilterMap& arc_filter) {
1.448 - _arc_filter = &arc_filter;
1.449 + _arc_filter = &arc_filter;
1.450 }
1.451
1.452 public:
1.453 @@ -627,7 +632,7 @@
1.454 typedef False NodeNumTag;
1.455 typedef False ArcNumTag;
1.456
1.457 - typedef FindArcTagIndicator<Digraph> FindArcTag;
1.458 + typedef FindArcTagIndicator<DGR> FindArcTag;
1.459 Arc findArc(const Node& source, const Node& target,
1.460 const Arc& prev = INVALID) const {
1.461 if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
1.462 @@ -640,18 +645,19 @@
1.463 return arc;
1.464 }
1.465
1.466 - template <typename _Value>
1.467 - class NodeMap : public SubMapExtender<Adaptor,
1.468 - typename Parent::template NodeMap<_Value> > {
1.469 + template <typename V>
1.470 + class NodeMap
1.471 + : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
1.472 + LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> {
1.473 public:
1.474 - typedef _Value Value;
1.475 - typedef SubMapExtender<Adaptor, typename Parent::
1.476 - template NodeMap<Value> > MapParent;
1.477 -
1.478 - NodeMap(const Adaptor& adaptor)
1.479 - : MapParent(adaptor) {}
1.480 - NodeMap(const Adaptor& adaptor, const Value& value)
1.481 - : MapParent(adaptor, value) {}
1.482 + typedef V Value;
1.483 + typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
1.484 + LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, NodeMap<V>)> Parent;
1.485 +
1.486 + NodeMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor)
1.487 + : Parent(adaptor) {}
1.488 + NodeMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor, const V& value)
1.489 + : Parent(adaptor, value) {}
1.490
1.491 private:
1.492 NodeMap& operator=(const NodeMap& cmap) {
1.493 @@ -660,23 +666,24 @@
1.494
1.495 template <typename CMap>
1.496 NodeMap& operator=(const CMap& cmap) {
1.497 - MapParent::operator=(cmap);
1.498 + Parent::operator=(cmap);
1.499 return *this;
1.500 }
1.501 };
1.502
1.503 - template <typename _Value>
1.504 - class ArcMap : public SubMapExtender<Adaptor,
1.505 - typename Parent::template ArcMap<_Value> > {
1.506 + template <typename V>
1.507 + class ArcMap
1.508 + : public SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
1.509 + LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> {
1.510 public:
1.511 - typedef _Value Value;
1.512 - typedef SubMapExtender<Adaptor, typename Parent::
1.513 - template ArcMap<Value> > MapParent;
1.514 -
1.515 - ArcMap(const Adaptor& adaptor)
1.516 - : MapParent(adaptor) {}
1.517 - ArcMap(const Adaptor& adaptor, const Value& value)
1.518 - : MapParent(adaptor, value) {}
1.519 + typedef V Value;
1.520 + typedef SubMapExtender<SubDigraphBase<DGR, NF, AF, false>,
1.521 + LEMON_SCOPE_FIX(DigraphAdaptorBase<DGR>, ArcMap<V>)> Parent;
1.522 +
1.523 + ArcMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor)
1.524 + : Parent(adaptor) {}
1.525 + ArcMap(const SubDigraphBase<DGR, NF, AF, false>& adaptor, const V& value)
1.526 + : Parent(adaptor, value) {}
1.527
1.528 private:
1.529 ArcMap& operator=(const ArcMap& cmap) {
1.530 @@ -685,7 +692,7 @@
1.531
1.532 template <typename CMap>
1.533 ArcMap& operator=(const CMap& cmap) {
1.534 - MapParent::operator=(cmap);
1.535 + Parent::operator=(cmap);
1.536 return *this;
1.537 }
1.538 };
1.539 @@ -708,17 +715,17 @@
1.540 /// by adding or removing nodes or arcs, unless the \c GR template
1.541 /// parameter is set to be \c const.
1.542 ///
1.543 - /// \tparam GR The type of the adapted digraph.
1.544 + /// \tparam DGR The type of the adapted digraph.
1.545 /// It must conform to the \ref concepts::Digraph "Digraph" concept.
1.546 /// It can also be specified to be \c const.
1.547 /// \tparam NF The type of the node filter map.
1.548 /// It must be a \c bool (or convertible) node map of the
1.549 /// adapted digraph. The default type is
1.550 - /// \ref concepts::Digraph::NodeMap "GR::NodeMap<bool>".
1.551 + /// \ref concepts::Digraph::NodeMap "DGR::NodeMap<bool>".
1.552 /// \tparam AF The type of the arc filter map.
1.553 /// It must be \c bool (or convertible) arc map of the
1.554 /// adapted digraph. The default type is
1.555 - /// \ref concepts::Digraph::ArcMap "GR::ArcMap<bool>".
1.556 + /// \ref concepts::Digraph::ArcMap "DGR::ArcMap<bool>".
1.557 ///
1.558 /// \note The \c Node and \c Arc types of this adaptor and the adapted
1.559 /// digraph are convertible to each other.
1.560 @@ -726,24 +733,24 @@
1.561 /// \see FilterNodes
1.562 /// \see FilterArcs
1.563 #ifdef DOXYGEN
1.564 - template<typename GR, typename NF, typename AF>
1.565 + template<typename DGR, typename NF, typename AF>
1.566 class SubDigraph {
1.567 #else
1.568 - template<typename GR,
1.569 - typename NF = typename GR::template NodeMap<bool>,
1.570 - typename AF = typename GR::template ArcMap<bool> >
1.571 + template<typename DGR,
1.572 + typename NF = typename DGR::template NodeMap<bool>,
1.573 + typename AF = typename DGR::template ArcMap<bool> >
1.574 class SubDigraph :
1.575 - public DigraphAdaptorExtender<SubDigraphBase<GR, NF, AF, true> > {
1.576 + public DigraphAdaptorExtender<SubDigraphBase<DGR, NF, AF, true> > {
1.577 #endif
1.578 public:
1.579 /// The type of the adapted digraph.
1.580 - typedef GR Digraph;
1.581 + typedef DGR Digraph;
1.582 /// The type of the node filter map.
1.583 typedef NF NodeFilterMap;
1.584 /// The type of the arc filter map.
1.585 typedef AF ArcFilterMap;
1.586
1.587 - typedef DigraphAdaptorExtender<SubDigraphBase<GR, NF, AF, true> >
1.588 + typedef DigraphAdaptorExtender<SubDigraphBase<DGR, NF, AF, true> >
1.589 Parent;
1.590
1.591 typedef typename Parent::Node Node;
1.592 @@ -757,11 +764,8 @@
1.593 ///
1.594 /// Creates a subdigraph for the given digraph with the
1.595 /// given node and arc filter maps.
1.596 - SubDigraph(Digraph& digraph, NodeFilterMap& node_filter,
1.597 - ArcFilterMap& arc_filter) {
1.598 - setDigraph(digraph);
1.599 - setNodeFilterMap(node_filter);
1.600 - setArcFilterMap(arc_filter);
1.601 + SubDigraph(DGR& digraph, NF& node_filter, AF& arc_filter) {
1.602 + Parent::initialize(digraph, node_filter, arc_filter);
1.603 }
1.604
1.605 /// \brief Sets the status of the given node
1.606 @@ -823,62 +827,60 @@
1.607 /// This function just returns a read-only \ref SubDigraph adaptor.
1.608 /// \ingroup graph_adaptors
1.609 /// \relates SubDigraph
1.610 - template<typename GR, typename NF, typename AF>
1.611 - SubDigraph<const GR, NF, AF>
1.612 - subDigraph(const GR& digraph,
1.613 - NF& node_filter_map, AF& arc_filter_map) {
1.614 - return SubDigraph<const GR, NF, AF>
1.615 - (digraph, node_filter_map, arc_filter_map);
1.616 + template<typename DGR, typename NF, typename AF>
1.617 + SubDigraph<const DGR, NF, AF>
1.618 + subDigraph(const DGR& digraph,
1.619 + NF& node_filter, AF& arc_filter) {
1.620 + return SubDigraph<const DGR, NF, AF>
1.621 + (digraph, node_filter, arc_filter);
1.622 }
1.623
1.624 - template<typename GR, typename NF, typename AF>
1.625 - SubDigraph<const GR, const NF, AF>
1.626 - subDigraph(const GR& digraph,
1.627 - const NF& node_filter_map, AF& arc_filter_map) {
1.628 - return SubDigraph<const GR, const NF, AF>
1.629 - (digraph, node_filter_map, arc_filter_map);
1.630 + template<typename DGR, typename NF, typename AF>
1.631 + SubDigraph<const DGR, const NF, AF>
1.632 + subDigraph(const DGR& digraph,
1.633 + const NF& node_filter, AF& arc_filter) {
1.634 + return SubDigraph<const DGR, const NF, AF>
1.635 + (digraph, node_filter, arc_filter);
1.636 }
1.637
1.638 - template<typename GR, typename NF, typename AF>
1.639 - SubDigraph<const GR, NF, const AF>
1.640 - subDigraph(const GR& digraph,
1.641 - NF& node_filter_map, const AF& arc_filter_map) {
1.642 - return SubDigraph<const GR, NF, const AF>
1.643 - (digraph, node_filter_map, arc_filter_map);
1.644 + template<typename DGR, typename NF, typename AF>
1.645 + SubDigraph<const DGR, NF, const AF>
1.646 + subDigraph(const DGR& digraph,
1.647 + NF& node_filter, const AF& arc_filter) {
1.648 + return SubDigraph<const DGR, NF, const AF>
1.649 + (digraph, node_filter, arc_filter);
1.650 }
1.651
1.652 - template<typename GR, typename NF, typename AF>
1.653 - SubDigraph<const GR, const NF, const AF>
1.654 - subDigraph(const GR& digraph,
1.655 - const NF& node_filter_map, const AF& arc_filter_map) {
1.656 - return SubDigraph<const GR, const NF, const AF>
1.657 - (digraph, node_filter_map, arc_filter_map);
1.658 + template<typename DGR, typename NF, typename AF>
1.659 + SubDigraph<const DGR, const NF, const AF>
1.660 + subDigraph(const DGR& digraph,
1.661 + const NF& node_filter, const AF& arc_filter) {
1.662 + return SubDigraph<const DGR, const NF, const AF>
1.663 + (digraph, node_filter, arc_filter);
1.664 }
1.665
1.666
1.667 - template <typename _Graph, typename _NodeFilterMap,
1.668 - typename _EdgeFilterMap, bool _checked = true>
1.669 - class SubGraphBase : public GraphAdaptorBase<_Graph> {
1.670 + template <typename GR, typename NF, typename EF, bool ch = true>
1.671 + class SubGraphBase : public GraphAdaptorBase<GR> {
1.672 public:
1.673 - typedef _Graph Graph;
1.674 - typedef _NodeFilterMap NodeFilterMap;
1.675 - typedef _EdgeFilterMap EdgeFilterMap;
1.676 + typedef GR Graph;
1.677 + typedef NF NodeFilterMap;
1.678 + typedef EF EdgeFilterMap;
1.679
1.680 typedef SubGraphBase Adaptor;
1.681 - typedef GraphAdaptorBase<_Graph> Parent;
1.682 + typedef GraphAdaptorBase<GR> Parent;
1.683 protected:
1.684
1.685 - NodeFilterMap* _node_filter_map;
1.686 - EdgeFilterMap* _edge_filter_map;
1.687 + NF* _node_filter;
1.688 + EF* _edge_filter;
1.689
1.690 SubGraphBase()
1.691 - : Parent(), _node_filter_map(0), _edge_filter_map(0) { }
1.692 -
1.693 - void setNodeFilterMap(NodeFilterMap& node_filter_map) {
1.694 - _node_filter_map=&node_filter_map;
1.695 - }
1.696 - void setEdgeFilterMap(EdgeFilterMap& edge_filter_map) {
1.697 - _edge_filter_map=&edge_filter_map;
1.698 + : Parent(), _node_filter(0), _edge_filter(0) { }
1.699 +
1.700 + void initialize(GR& graph, NF& node_filter, EF& edge_filter) {
1.701 + Parent::initialize(graph);
1.702 + _node_filter = &node_filter;
1.703 + _edge_filter = &edge_filter;
1.704 }
1.705
1.706 public:
1.707 @@ -889,95 +891,95 @@
1.708
1.709 void first(Node& i) const {
1.710 Parent::first(i);
1.711 - while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i);
1.712 + while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
1.713 }
1.714
1.715 void first(Arc& i) const {
1.716 Parent::first(i);
1.717 - while (i!=INVALID && (!(*_edge_filter_map)[i]
1.718 - || !(*_node_filter_map)[Parent::source(i)]
1.719 - || !(*_node_filter_map)[Parent::target(i)]))
1.720 + while (i!=INVALID && (!(*_edge_filter)[i]
1.721 + || !(*_node_filter)[Parent::source(i)]
1.722 + || !(*_node_filter)[Parent::target(i)]))
1.723 Parent::next(i);
1.724 }
1.725
1.726 void first(Edge& i) const {
1.727 Parent::first(i);
1.728 - while (i!=INVALID && (!(*_edge_filter_map)[i]
1.729 - || !(*_node_filter_map)[Parent::u(i)]
1.730 - || !(*_node_filter_map)[Parent::v(i)]))
1.731 + while (i!=INVALID && (!(*_edge_filter)[i]
1.732 + || !(*_node_filter)[Parent::u(i)]
1.733 + || !(*_node_filter)[Parent::v(i)]))
1.734 Parent::next(i);
1.735 }
1.736
1.737 void firstIn(Arc& i, const Node& n) const {
1.738 Parent::firstIn(i, n);
1.739 - while (i!=INVALID && (!(*_edge_filter_map)[i]
1.740 - || !(*_node_filter_map)[Parent::source(i)]))
1.741 + while (i!=INVALID && (!(*_edge_filter)[i]
1.742 + || !(*_node_filter)[Parent::source(i)]))
1.743 Parent::nextIn(i);
1.744 }
1.745
1.746 void firstOut(Arc& i, const Node& n) const {
1.747 Parent::firstOut(i, n);
1.748 - while (i!=INVALID && (!(*_edge_filter_map)[i]
1.749 - || !(*_node_filter_map)[Parent::target(i)]))
1.750 + while (i!=INVALID && (!(*_edge_filter)[i]
1.751 + || !(*_node_filter)[Parent::target(i)]))
1.752 Parent::nextOut(i);
1.753 }
1.754
1.755 void firstInc(Edge& i, bool& d, const Node& n) const {
1.756 Parent::firstInc(i, d, n);
1.757 - while (i!=INVALID && (!(*_edge_filter_map)[i]
1.758 - || !(*_node_filter_map)[Parent::u(i)]
1.759 - || !(*_node_filter_map)[Parent::v(i)]))
1.760 + while (i!=INVALID && (!(*_edge_filter)[i]
1.761 + || !(*_node_filter)[Parent::u(i)]
1.762 + || !(*_node_filter)[Parent::v(i)]))
1.763 Parent::nextInc(i, d);
1.764 }
1.765
1.766 void next(Node& i) const {
1.767 Parent::next(i);
1.768 - while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i);
1.769 + while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
1.770 }
1.771
1.772 void next(Arc& i) const {
1.773 Parent::next(i);
1.774 - while (i!=INVALID && (!(*_edge_filter_map)[i]
1.775 - || !(*_node_filter_map)[Parent::source(i)]
1.776 - || !(*_node_filter_map)[Parent::target(i)]))
1.777 + while (i!=INVALID && (!(*_edge_filter)[i]
1.778 + || !(*_node_filter)[Parent::source(i)]
1.779 + || !(*_node_filter)[Parent::target(i)]))
1.780 Parent::next(i);
1.781 }
1.782
1.783 void next(Edge& i) const {
1.784 Parent::next(i);
1.785 - while (i!=INVALID && (!(*_edge_filter_map)[i]
1.786 - || !(*_node_filter_map)[Parent::u(i)]
1.787 - || !(*_node_filter_map)[Parent::v(i)]))
1.788 + while (i!=INVALID && (!(*_edge_filter)[i]
1.789 + || !(*_node_filter)[Parent::u(i)]
1.790 + || !(*_node_filter)[Parent::v(i)]))
1.791 Parent::next(i);
1.792 }
1.793
1.794 void nextIn(Arc& i) const {
1.795 Parent::nextIn(i);
1.796 - while (i!=INVALID && (!(*_edge_filter_map)[i]
1.797 - || !(*_node_filter_map)[Parent::source(i)]))
1.798 + while (i!=INVALID && (!(*_edge_filter)[i]
1.799 + || !(*_node_filter)[Parent::source(i)]))
1.800 Parent::nextIn(i);
1.801 }
1.802
1.803 void nextOut(Arc& i) const {
1.804 Parent::nextOut(i);
1.805 - while (i!=INVALID && (!(*_edge_filter_map)[i]
1.806 - || !(*_node_filter_map)[Parent::target(i)]))
1.807 + while (i!=INVALID && (!(*_edge_filter)[i]
1.808 + || !(*_node_filter)[Parent::target(i)]))
1.809 Parent::nextOut(i);
1.810 }
1.811
1.812 void nextInc(Edge& i, bool& d) const {
1.813 Parent::nextInc(i, d);
1.814 - while (i!=INVALID && (!(*_edge_filter_map)[i]
1.815 - || !(*_node_filter_map)[Parent::u(i)]
1.816 - || !(*_node_filter_map)[Parent::v(i)]))
1.817 + while (i!=INVALID && (!(*_edge_filter)[i]
1.818 + || !(*_node_filter)[Parent::u(i)]
1.819 + || !(*_node_filter)[Parent::v(i)]))
1.820 Parent::nextInc(i, d);
1.821 }
1.822
1.823 - void status(const Node& n, bool v) const { _node_filter_map->set(n, v); }
1.824 - void status(const Edge& e, bool v) const { _edge_filter_map->set(e, v); }
1.825 -
1.826 - bool status(const Node& n) const { return (*_node_filter_map)[n]; }
1.827 - bool status(const Edge& e) const { return (*_edge_filter_map)[e]; }
1.828 + void status(const Node& n, bool v) const { _node_filter->set(n, v); }
1.829 + void status(const Edge& e, bool v) const { _edge_filter->set(e, v); }
1.830 +
1.831 + bool status(const Node& n) const { return (*_node_filter)[n]; }
1.832 + bool status(const Edge& e) const { return (*_edge_filter)[e]; }
1.833
1.834 typedef False NodeNumTag;
1.835 typedef False ArcNumTag;
1.836 @@ -986,11 +988,11 @@
1.837 typedef FindArcTagIndicator<Graph> FindArcTag;
1.838 Arc findArc(const Node& u, const Node& v,
1.839 const Arc& prev = INVALID) const {
1.840 - if (!(*_node_filter_map)[u] || !(*_node_filter_map)[v]) {
1.841 + if (!(*_node_filter)[u] || !(*_node_filter)[v]) {
1.842 return INVALID;
1.843 }
1.844 Arc arc = Parent::findArc(u, v, prev);
1.845 - while (arc != INVALID && !(*_edge_filter_map)[arc]) {
1.846 + while (arc != INVALID && !(*_edge_filter)[arc]) {
1.847 arc = Parent::findArc(u, v, arc);
1.848 }
1.849 return arc;
1.850 @@ -999,28 +1001,29 @@
1.851 typedef FindEdgeTagIndicator<Graph> FindEdgeTag;
1.852 Edge findEdge(const Node& u, const Node& v,
1.853 const Edge& prev = INVALID) const {
1.854 - if (!(*_node_filter_map)[u] || !(*_node_filter_map)[v]) {
1.855 + if (!(*_node_filter)[u] || !(*_node_filter)[v]) {
1.856 return INVALID;
1.857 }
1.858 Edge edge = Parent::findEdge(u, v, prev);
1.859 - while (edge != INVALID && !(*_edge_filter_map)[edge]) {
1.860 + while (edge != INVALID && !(*_edge_filter)[edge]) {
1.861 edge = Parent::findEdge(u, v, edge);
1.862 }
1.863 return edge;
1.864 }
1.865
1.866 - template <typename _Value>
1.867 - class NodeMap : public SubMapExtender<Adaptor,
1.868 - typename Parent::template NodeMap<_Value> > {
1.869 + template <typename V>
1.870 + class NodeMap
1.871 + : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1.872 + LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> {
1.873 public:
1.874 - typedef _Value Value;
1.875 - typedef SubMapExtender<Adaptor, typename Parent::
1.876 - template NodeMap<Value> > MapParent;
1.877 -
1.878 - NodeMap(const Adaptor& adaptor)
1.879 - : MapParent(adaptor) {}
1.880 - NodeMap(const Adaptor& adaptor, const Value& value)
1.881 - : MapParent(adaptor, value) {}
1.882 + typedef V Value;
1.883 + typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1.884 + LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent;
1.885 +
1.886 + NodeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
1.887 + : Parent(adaptor) {}
1.888 + NodeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)
1.889 + : Parent(adaptor, value) {}
1.890
1.891 private:
1.892 NodeMap& operator=(const NodeMap& cmap) {
1.893 @@ -1029,23 +1032,24 @@
1.894
1.895 template <typename CMap>
1.896 NodeMap& operator=(const CMap& cmap) {
1.897 - MapParent::operator=(cmap);
1.898 + Parent::operator=(cmap);
1.899 return *this;
1.900 }
1.901 };
1.902
1.903 - template <typename _Value>
1.904 - class ArcMap : public SubMapExtender<Adaptor,
1.905 - typename Parent::template ArcMap<_Value> > {
1.906 + template <typename V>
1.907 + class ArcMap
1.908 + : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1.909 + LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> {
1.910 public:
1.911 - typedef _Value Value;
1.912 - typedef SubMapExtender<Adaptor, typename Parent::
1.913 - template ArcMap<Value> > MapParent;
1.914 -
1.915 - ArcMap(const Adaptor& adaptor)
1.916 - : MapParent(adaptor) {}
1.917 - ArcMap(const Adaptor& adaptor, const Value& value)
1.918 - : MapParent(adaptor, value) {}
1.919 + typedef V Value;
1.920 + typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1.921 + LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent;
1.922 +
1.923 + ArcMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
1.924 + : Parent(adaptor) {}
1.925 + ArcMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)
1.926 + : Parent(adaptor, value) {}
1.927
1.928 private:
1.929 ArcMap& operator=(const ArcMap& cmap) {
1.930 @@ -1054,24 +1058,25 @@
1.931
1.932 template <typename CMap>
1.933 ArcMap& operator=(const CMap& cmap) {
1.934 - MapParent::operator=(cmap);
1.935 + Parent::operator=(cmap);
1.936 return *this;
1.937 }
1.938 };
1.939
1.940 - template <typename _Value>
1.941 - class EdgeMap : public SubMapExtender<Adaptor,
1.942 - typename Parent::template EdgeMap<_Value> > {
1.943 + template <typename V>
1.944 + class EdgeMap
1.945 + : public SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1.946 + LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> {
1.947 public:
1.948 - typedef _Value Value;
1.949 - typedef SubMapExtender<Adaptor, typename Parent::
1.950 - template EdgeMap<Value> > MapParent;
1.951 -
1.952 - EdgeMap(const Adaptor& adaptor)
1.953 - : MapParent(adaptor) {}
1.954 -
1.955 - EdgeMap(const Adaptor& adaptor, const Value& value)
1.956 - : MapParent(adaptor, value) {}
1.957 + typedef V Value;
1.958 + typedef SubMapExtender<SubGraphBase<GR, NF, EF, ch>,
1.959 + LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
1.960 +
1.961 + EdgeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor)
1.962 + : Parent(adaptor) {}
1.963 +
1.964 + EdgeMap(const SubGraphBase<GR, NF, EF, ch>& adaptor, const V& value)
1.965 + : Parent(adaptor, value) {}
1.966
1.967 private:
1.968 EdgeMap& operator=(const EdgeMap& cmap) {
1.969 @@ -1080,34 +1085,33 @@
1.970
1.971 template <typename CMap>
1.972 EdgeMap& operator=(const CMap& cmap) {
1.973 - MapParent::operator=(cmap);
1.974 + Parent::operator=(cmap);
1.975 return *this;
1.976 }
1.977 };
1.978
1.979 };
1.980
1.981 - template <typename _Graph, typename _NodeFilterMap, typename _EdgeFilterMap>
1.982 - class SubGraphBase<_Graph, _NodeFilterMap, _EdgeFilterMap, false>
1.983 - : public GraphAdaptorBase<_Graph> {
1.984 + template <typename GR, typename NF, typename EF>
1.985 + class SubGraphBase<GR, NF, EF, false>
1.986 + : public GraphAdaptorBase<GR> {
1.987 public:
1.988 - typedef _Graph Graph;
1.989 - typedef _NodeFilterMap NodeFilterMap;
1.990 - typedef _EdgeFilterMap EdgeFilterMap;
1.991 + typedef GR Graph;
1.992 + typedef NF NodeFilterMap;
1.993 + typedef EF EdgeFilterMap;
1.994
1.995 typedef SubGraphBase Adaptor;
1.996 - typedef GraphAdaptorBase<_Graph> Parent;
1.997 + typedef GraphAdaptorBase<GR> Parent;
1.998 protected:
1.999 - NodeFilterMap* _node_filter_map;
1.1000 - EdgeFilterMap* _edge_filter_map;
1.1001 - SubGraphBase() : Parent(),
1.1002 - _node_filter_map(0), _edge_filter_map(0) { }
1.1003 -
1.1004 - void setNodeFilterMap(NodeFilterMap& node_filter_map) {
1.1005 - _node_filter_map=&node_filter_map;
1.1006 - }
1.1007 - void setEdgeFilterMap(EdgeFilterMap& edge_filter_map) {
1.1008 - _edge_filter_map=&edge_filter_map;
1.1009 + NF* _node_filter;
1.1010 + EF* _edge_filter;
1.1011 + SubGraphBase()
1.1012 + : Parent(), _node_filter(0), _edge_filter(0) { }
1.1013 +
1.1014 + void initialize(GR& graph, NF& node_filter, EF& edge_filter) {
1.1015 + Parent::initialize(graph);
1.1016 + _node_filter = &node_filter;
1.1017 + _edge_filter = &edge_filter;
1.1018 }
1.1019
1.1020 public:
1.1021 @@ -1118,65 +1122,65 @@
1.1022
1.1023 void first(Node& i) const {
1.1024 Parent::first(i);
1.1025 - while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i);
1.1026 + while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
1.1027 }
1.1028
1.1029 void first(Arc& i) const {
1.1030 Parent::first(i);
1.1031 - while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i);
1.1032 + while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
1.1033 }
1.1034
1.1035 void first(Edge& i) const {
1.1036 Parent::first(i);
1.1037 - while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i);
1.1038 + while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
1.1039 }
1.1040
1.1041 void firstIn(Arc& i, const Node& n) const {
1.1042 Parent::firstIn(i, n);
1.1043 - while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextIn(i);
1.1044 + while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextIn(i);
1.1045 }
1.1046
1.1047 void firstOut(Arc& i, const Node& n) const {
1.1048 Parent::firstOut(i, n);
1.1049 - while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextOut(i);
1.1050 + while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextOut(i);
1.1051 }
1.1052
1.1053 void firstInc(Edge& i, bool& d, const Node& n) const {
1.1054 Parent::firstInc(i, d, n);
1.1055 - while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextInc(i, d);
1.1056 + while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextInc(i, d);
1.1057 }
1.1058
1.1059 void next(Node& i) const {
1.1060 Parent::next(i);
1.1061 - while (i!=INVALID && !(*_node_filter_map)[i]) Parent::next(i);
1.1062 + while (i!=INVALID && !(*_node_filter)[i]) Parent::next(i);
1.1063 }
1.1064 void next(Arc& i) const {
1.1065 Parent::next(i);
1.1066 - while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i);
1.1067 + while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
1.1068 }
1.1069 void next(Edge& i) const {
1.1070 Parent::next(i);
1.1071 - while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::next(i);
1.1072 + while (i!=INVALID && !(*_edge_filter)[i]) Parent::next(i);
1.1073 }
1.1074 void nextIn(Arc& i) const {
1.1075 Parent::nextIn(i);
1.1076 - while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextIn(i);
1.1077 + while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextIn(i);
1.1078 }
1.1079
1.1080 void nextOut(Arc& i) const {
1.1081 Parent::nextOut(i);
1.1082 - while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextOut(i);
1.1083 + while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextOut(i);
1.1084 }
1.1085 void nextInc(Edge& i, bool& d) const {
1.1086 Parent::nextInc(i, d);
1.1087 - while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextInc(i, d);
1.1088 + while (i!=INVALID && !(*_edge_filter)[i]) Parent::nextInc(i, d);
1.1089 }
1.1090
1.1091 - void status(const Node& n, bool v) const { _node_filter_map->set(n, v); }
1.1092 - void status(const Edge& e, bool v) const { _edge_filter_map->set(e, v); }
1.1093 -
1.1094 - bool status(const Node& n) const { return (*_node_filter_map)[n]; }
1.1095 - bool status(const Edge& e) const { return (*_edge_filter_map)[e]; }
1.1096 + void status(const Node& n, bool v) const { _node_filter->set(n, v); }
1.1097 + void status(const Edge& e, bool v) const { _edge_filter->set(e, v); }
1.1098 +
1.1099 + bool status(const Node& n) const { return (*_node_filter)[n]; }
1.1100 + bool status(const Edge& e) const { return (*_edge_filter)[e]; }
1.1101
1.1102 typedef False NodeNumTag;
1.1103 typedef False ArcNumTag;
1.1104 @@ -1186,7 +1190,7 @@
1.1105 Arc findArc(const Node& u, const Node& v,
1.1106 const Arc& prev = INVALID) const {
1.1107 Arc arc = Parent::findArc(u, v, prev);
1.1108 - while (arc != INVALID && !(*_edge_filter_map)[arc]) {
1.1109 + while (arc != INVALID && !(*_edge_filter)[arc]) {
1.1110 arc = Parent::findArc(u, v, arc);
1.1111 }
1.1112 return arc;
1.1113 @@ -1196,24 +1200,25 @@
1.1114 Edge findEdge(const Node& u, const Node& v,
1.1115 const Edge& prev = INVALID) const {
1.1116 Edge edge = Parent::findEdge(u, v, prev);
1.1117 - while (edge != INVALID && !(*_edge_filter_map)[edge]) {
1.1118 + while (edge != INVALID && !(*_edge_filter)[edge]) {
1.1119 edge = Parent::findEdge(u, v, edge);
1.1120 }
1.1121 return edge;
1.1122 }
1.1123
1.1124 - template <typename _Value>
1.1125 - class NodeMap : public SubMapExtender<Adaptor,
1.1126 - typename Parent::template NodeMap<_Value> > {
1.1127 + template <typename V>
1.1128 + class NodeMap
1.1129 + : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1.1130 + LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> {
1.1131 public:
1.1132 - typedef _Value Value;
1.1133 - typedef SubMapExtender<Adaptor, typename Parent::
1.1134 - template NodeMap<Value> > MapParent;
1.1135 -
1.1136 - NodeMap(const Adaptor& adaptor)
1.1137 - : MapParent(adaptor) {}
1.1138 - NodeMap(const Adaptor& adaptor, const Value& value)
1.1139 - : MapParent(adaptor, value) {}
1.1140 + typedef V Value;
1.1141 + typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1.1142 + LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, NodeMap<V>)> Parent;
1.1143 +
1.1144 + NodeMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
1.1145 + : Parent(adaptor) {}
1.1146 + NodeMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
1.1147 + : Parent(adaptor, value) {}
1.1148
1.1149 private:
1.1150 NodeMap& operator=(const NodeMap& cmap) {
1.1151 @@ -1222,23 +1227,24 @@
1.1152
1.1153 template <typename CMap>
1.1154 NodeMap& operator=(const CMap& cmap) {
1.1155 - MapParent::operator=(cmap);
1.1156 + Parent::operator=(cmap);
1.1157 return *this;
1.1158 }
1.1159 };
1.1160
1.1161 - template <typename _Value>
1.1162 - class ArcMap : public SubMapExtender<Adaptor,
1.1163 - typename Parent::template ArcMap<_Value> > {
1.1164 + template <typename V>
1.1165 + class ArcMap
1.1166 + : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1.1167 + LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> {
1.1168 public:
1.1169 - typedef _Value Value;
1.1170 - typedef SubMapExtender<Adaptor, typename Parent::
1.1171 - template ArcMap<Value> > MapParent;
1.1172 -
1.1173 - ArcMap(const Adaptor& adaptor)
1.1174 - : MapParent(adaptor) {}
1.1175 - ArcMap(const Adaptor& adaptor, const Value& value)
1.1176 - : MapParent(adaptor, value) {}
1.1177 + typedef V Value;
1.1178 + typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1.1179 + LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, ArcMap<V>)> Parent;
1.1180 +
1.1181 + ArcMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
1.1182 + : Parent(adaptor) {}
1.1183 + ArcMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
1.1184 + : Parent(adaptor, value) {}
1.1185
1.1186 private:
1.1187 ArcMap& operator=(const ArcMap& cmap) {
1.1188 @@ -1247,24 +1253,25 @@
1.1189
1.1190 template <typename CMap>
1.1191 ArcMap& operator=(const CMap& cmap) {
1.1192 - MapParent::operator=(cmap);
1.1193 + Parent::operator=(cmap);
1.1194 return *this;
1.1195 }
1.1196 };
1.1197
1.1198 - template <typename _Value>
1.1199 - class EdgeMap : public SubMapExtender<Adaptor,
1.1200 - typename Parent::template EdgeMap<_Value> > {
1.1201 + template <typename V>
1.1202 + class EdgeMap
1.1203 + : public SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1.1204 + LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> {
1.1205 public:
1.1206 - typedef _Value Value;
1.1207 - typedef SubMapExtender<Adaptor, typename Parent::
1.1208 - template EdgeMap<Value> > MapParent;
1.1209 -
1.1210 - EdgeMap(const Adaptor& adaptor)
1.1211 - : MapParent(adaptor) {}
1.1212 -
1.1213 - EdgeMap(const Adaptor& adaptor, const _Value& value)
1.1214 - : MapParent(adaptor, value) {}
1.1215 + typedef V Value;
1.1216 + typedef SubMapExtender<SubGraphBase<GR, NF, EF, false>,
1.1217 + LEMON_SCOPE_FIX(GraphAdaptorBase<GR>, EdgeMap<V>)> Parent;
1.1218 +
1.1219 + EdgeMap(const SubGraphBase<GR, NF, EF, false>& adaptor)
1.1220 + : Parent(adaptor) {}
1.1221 +
1.1222 + EdgeMap(const SubGraphBase<GR, NF, EF, false>& adaptor, const V& value)
1.1223 + : Parent(adaptor, value) {}
1.1224
1.1225 private:
1.1226 EdgeMap& operator=(const EdgeMap& cmap) {
1.1227 @@ -1273,7 +1280,7 @@
1.1228
1.1229 template <typename CMap>
1.1230 EdgeMap& operator=(const CMap& cmap) {
1.1231 - MapParent::operator=(cmap);
1.1232 + Parent::operator=(cmap);
1.1233 return *this;
1.1234 }
1.1235 };
1.1236 @@ -1332,7 +1339,7 @@
1.1237 /// The type of the edge filter map.
1.1238 typedef EF EdgeFilterMap;
1.1239
1.1240 - typedef GraphAdaptorExtender< SubGraphBase<GR, NF, EF, true> >
1.1241 + typedef GraphAdaptorExtender<SubGraphBase<GR, NF, EF, true> >
1.1242 Parent;
1.1243
1.1244 typedef typename Parent::Node Node;
1.1245 @@ -1346,11 +1353,8 @@
1.1246 ///
1.1247 /// Creates a subgraph for the given graph with the given node
1.1248 /// and edge filter maps.
1.1249 - SubGraph(Graph& graph, NodeFilterMap& node_filter_map,
1.1250 - EdgeFilterMap& edge_filter_map) {
1.1251 - setGraph(graph);
1.1252 - setNodeFilterMap(node_filter_map);
1.1253 - setEdgeFilterMap(edge_filter_map);
1.1254 + SubGraph(GR& graph, NF& node_filter, EF& edge_filter) {
1.1255 + initialize(graph, node_filter, edge_filter);
1.1256 }
1.1257
1.1258 /// \brief Sets the status of the given node
1.1259 @@ -1414,34 +1418,30 @@
1.1260 /// \relates SubGraph
1.1261 template<typename GR, typename NF, typename EF>
1.1262 SubGraph<const GR, NF, EF>
1.1263 - subGraph(const GR& graph,
1.1264 - NF& node_filter_map, EF& edge_filter_map) {
1.1265 + subGraph(const GR& graph, NF& node_filter, EF& edge_filter) {
1.1266 return SubGraph<const GR, NF, EF>
1.1267 - (graph, node_filter_map, edge_filter_map);
1.1268 + (graph, node_filter, edge_filter);
1.1269 }
1.1270
1.1271 template<typename GR, typename NF, typename EF>
1.1272 SubGraph<const GR, const NF, EF>
1.1273 - subGraph(const GR& graph,
1.1274 - const NF& node_filter_map, EF& edge_filter_map) {
1.1275 + subGraph(const GR& graph, const NF& node_filter, EF& edge_filter) {
1.1276 return SubGraph<const GR, const NF, EF>
1.1277 - (graph, node_filter_map, edge_filter_map);
1.1278 + (graph, node_filter, edge_filter);
1.1279 }
1.1280
1.1281 template<typename GR, typename NF, typename EF>
1.1282 SubGraph<const GR, NF, const EF>
1.1283 - subGraph(const GR& graph,
1.1284 - NF& node_filter_map, const EF& edge_filter_map) {
1.1285 + subGraph(const GR& graph, NF& node_filter, const EF& edge_filter) {
1.1286 return SubGraph<const GR, NF, const EF>
1.1287 - (graph, node_filter_map, edge_filter_map);
1.1288 + (graph, node_filter, edge_filter);
1.1289 }
1.1290
1.1291 template<typename GR, typename NF, typename EF>
1.1292 SubGraph<const GR, const NF, const EF>
1.1293 - subGraph(const GR& graph,
1.1294 - const NF& node_filter_map, const EF& edge_filter_map) {
1.1295 + subGraph(const GR& graph, const NF& node_filter, const EF& edge_filter) {
1.1296 return SubGraph<const GR, const NF, const EF>
1.1297 - (graph, node_filter_map, edge_filter_map);
1.1298 + (graph, node_filter, edge_filter);
1.1299 }
1.1300
1.1301
1.1302 @@ -1481,7 +1481,8 @@
1.1303 typename Enable = void>
1.1304 class FilterNodes :
1.1305 public DigraphAdaptorExtender<
1.1306 - SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, bool>, true> > {
1.1307 + SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >,
1.1308 + true> > {
1.1309 #endif
1.1310 public:
1.1311
1.1312 @@ -1489,17 +1490,15 @@
1.1313 typedef NF NodeFilterMap;
1.1314
1.1315 typedef DigraphAdaptorExtender<
1.1316 - SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, bool>, true> >
1.1317 - Parent;
1.1318 + SubDigraphBase<GR, NF, ConstMap<typename GR::Arc, Const<bool, true> >,
1.1319 + true> > Parent;
1.1320
1.1321 typedef typename Parent::Node Node;
1.1322
1.1323 protected:
1.1324 - ConstMap<typename Digraph::Arc, bool> const_true_map;
1.1325 -
1.1326 - FilterNodes() : const_true_map(true) {
1.1327 - Parent::setArcFilterMap(const_true_map);
1.1328 - }
1.1329 + ConstMap<typename Digraph::Arc, Const<bool, true> > const_true_map;
1.1330 +
1.1331 + FilterNodes() : const_true_map() {}
1.1332
1.1333 public:
1.1334
1.1335 @@ -1507,12 +1506,10 @@
1.1336 ///
1.1337 /// Creates a subgraph for the given digraph or graph with the
1.1338 /// given node filter map.
1.1339 - FilterNodes(GR& graph, NodeFilterMap& node_filter) :
1.1340 - Parent(), const_true_map(true)
1.1341 + FilterNodes(GR& graph, NF& node_filter)
1.1342 + : Parent(), const_true_map()
1.1343 {
1.1344 - Parent::setDigraph(graph);
1.1345 - Parent::setNodeFilterMap(node_filter);
1.1346 - Parent::setArcFilterMap(const_true_map);
1.1347 + Parent::initialize(graph, node_filter, const_true_map);
1.1348 }
1.1349
1.1350 /// \brief Sets the status of the given node
1.1351 @@ -1547,30 +1544,27 @@
1.1352 class FilterNodes<GR, NF,
1.1353 typename enable_if<UndirectedTagIndicator<GR> >::type> :
1.1354 public GraphAdaptorExtender<
1.1355 - SubGraphBase<GR, NF, ConstMap<typename GR::Edge, bool>, true> > {
1.1356 + SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >,
1.1357 + true> > {
1.1358
1.1359 public:
1.1360 typedef GR Graph;
1.1361 typedef NF NodeFilterMap;
1.1362 typedef GraphAdaptorExtender<
1.1363 - SubGraphBase<GR, NF, ConstMap<typename GR::Edge, bool>, true> >
1.1364 - Parent;
1.1365 + SubGraphBase<GR, NF, ConstMap<typename GR::Edge, Const<bool, true> >,
1.1366 + true> > Parent;
1.1367
1.1368 typedef typename Parent::Node Node;
1.1369 protected:
1.1370 - ConstMap<typename Graph::Edge, bool> const_true_map;
1.1371 -
1.1372 - FilterNodes() : const_true_map(true) {
1.1373 - Parent::setEdgeFilterMap(const_true_map);
1.1374 - }
1.1375 + ConstMap<typename GR::Edge, Const<bool, true> > const_true_map;
1.1376 +
1.1377 + FilterNodes() : const_true_map() {}
1.1378
1.1379 public:
1.1380
1.1381 - FilterNodes(Graph& _graph, NodeFilterMap& node_filter_map) :
1.1382 - Parent(), const_true_map(true) {
1.1383 - Parent::setGraph(_graph);
1.1384 - Parent::setNodeFilterMap(node_filter_map);
1.1385 - Parent::setEdgeFilterMap(const_true_map);
1.1386 + FilterNodes(GR& graph, NodeFilterMap& node_filter) :
1.1387 + Parent(), const_true_map() {
1.1388 + Parent::initialize(graph, node_filter, const_true_map);
1.1389 }
1.1390
1.1391 void status(const Node& n, bool v) const { Parent::status(n, v); }
1.1392 @@ -1588,14 +1582,14 @@
1.1393 /// \relates FilterNodes
1.1394 template<typename GR, typename NF>
1.1395 FilterNodes<const GR, NF>
1.1396 - filterNodes(const GR& graph, NF& node_filter_map) {
1.1397 - return FilterNodes<const GR, NF>(graph, node_filter_map);
1.1398 + filterNodes(const GR& graph, NF& node_filter) {
1.1399 + return FilterNodes<const GR, NF>(graph, node_filter);
1.1400 }
1.1401
1.1402 template<typename GR, typename NF>
1.1403 FilterNodes<const GR, const NF>
1.1404 - filterNodes(const GR& graph, const NF& node_filter_map) {
1.1405 - return FilterNodes<const GR, const NF>(graph, node_filter_map);
1.1406 + filterNodes(const GR& graph, const NF& node_filter) {
1.1407 + return FilterNodes<const GR, const NF>(graph, node_filter);
1.1408 }
1.1409
1.1410 /// \ingroup graph_adaptors
1.1411 @@ -1612,45 +1606,44 @@
1.1412 /// by adding or removing nodes or arcs, unless the \c GR template
1.1413 /// parameter is set to be \c const.
1.1414 ///
1.1415 - /// \tparam GR The type of the adapted digraph.
1.1416 + /// \tparam DGR The type of the adapted digraph.
1.1417 /// It must conform to the \ref concepts::Digraph "Digraph" concept.
1.1418 /// It can also be specified to be \c const.
1.1419 /// \tparam AF The type of the arc filter map.
1.1420 /// It must be a \c bool (or convertible) arc map of the
1.1421 /// adapted digraph. The default type is
1.1422 - /// \ref concepts::Digraph::ArcMap "GR::ArcMap<bool>".
1.1423 + /// \ref concepts::Digraph::ArcMap "DGR::ArcMap<bool>".
1.1424 ///
1.1425 /// \note The \c Node and \c Arc types of this adaptor and the adapted
1.1426 /// digraph are convertible to each other.
1.1427 #ifdef DOXYGEN
1.1428 - template<typename GR,
1.1429 + template<typename DGR,
1.1430 typename AF>
1.1431 class FilterArcs {
1.1432 #else
1.1433 - template<typename GR,
1.1434 - typename AF = typename GR::template ArcMap<bool> >
1.1435 + template<typename DGR,
1.1436 + typename AF = typename DGR::template ArcMap<bool> >
1.1437 class FilterArcs :
1.1438 public DigraphAdaptorExtender<
1.1439 - SubDigraphBase<GR, ConstMap<typename GR::Node, bool>, AF, false> > {
1.1440 + SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >,
1.1441 + AF, false> > {
1.1442 #endif
1.1443 public:
1.1444 /// The type of the adapted digraph.
1.1445 - typedef GR Digraph;
1.1446 + typedef DGR Digraph;
1.1447 /// The type of the arc filter map.
1.1448 typedef AF ArcFilterMap;
1.1449
1.1450 typedef DigraphAdaptorExtender<
1.1451 - SubDigraphBase<GR, ConstMap<typename GR::Node, bool>, AF, false> >
1.1452 - Parent;
1.1453 + SubDigraphBase<DGR, ConstMap<typename DGR::Node, Const<bool, true> >,
1.1454 + AF, false> > Parent;
1.1455
1.1456 typedef typename Parent::Arc Arc;
1.1457
1.1458 protected:
1.1459 - ConstMap<typename Digraph::Node, bool> const_true_map;
1.1460 -
1.1461 - FilterArcs() : const_true_map(true) {
1.1462 - Parent::setNodeFilterMap(const_true_map);
1.1463 - }
1.1464 + ConstMap<typename DGR::Node, Const<bool, true> > const_true_map;
1.1465 +
1.1466 + FilterArcs() : const_true_map() {}
1.1467
1.1468 public:
1.1469
1.1470 @@ -1658,11 +1651,9 @@
1.1471 ///
1.1472 /// Creates a subdigraph for the given digraph with the given arc
1.1473 /// filter map.
1.1474 - FilterArcs(Digraph& digraph, ArcFilterMap& arc_filter)
1.1475 - : Parent(), const_true_map(true) {
1.1476 - Parent::setDigraph(digraph);
1.1477 - Parent::setNodeFilterMap(const_true_map);
1.1478 - Parent::setArcFilterMap(arc_filter);
1.1479 + FilterArcs(DGR& digraph, ArcFilterMap& arc_filter)
1.1480 + : Parent(), const_true_map() {
1.1481 + Parent::initialize(digraph, const_true_map, arc_filter);
1.1482 }
1.1483
1.1484 /// \brief Sets the status of the given arc
1.1485 @@ -1698,16 +1689,16 @@
1.1486 /// This function just returns a read-only \ref FilterArcs adaptor.
1.1487 /// \ingroup graph_adaptors
1.1488 /// \relates FilterArcs
1.1489 - template<typename GR, typename AF>
1.1490 - FilterArcs<const GR, AF>
1.1491 - filterArcs(const GR& digraph, AF& arc_filter_map) {
1.1492 - return FilterArcs<const GR, AF>(digraph, arc_filter_map);
1.1493 + template<typename DGR, typename AF>
1.1494 + FilterArcs<const DGR, AF>
1.1495 + filterArcs(const DGR& digraph, AF& arc_filter) {
1.1496 + return FilterArcs<const DGR, AF>(digraph, arc_filter);
1.1497 }
1.1498
1.1499 - template<typename GR, typename AF>
1.1500 - FilterArcs<const GR, const AF>
1.1501 - filterArcs(const GR& digraph, const AF& arc_filter_map) {
1.1502 - return FilterArcs<const GR, const AF>(digraph, arc_filter_map);
1.1503 + template<typename DGR, typename AF>
1.1504 + FilterArcs<const DGR, const AF>
1.1505 + filterArcs(const DGR& digraph, const AF& arc_filter) {
1.1506 + return FilterArcs<const DGR, const AF>(digraph, arc_filter);
1.1507 }
1.1508
1.1509 /// \ingroup graph_adaptors
1.1510 @@ -1743,7 +1734,8 @@
1.1511 typename EF = typename GR::template EdgeMap<bool> >
1.1512 class FilterEdges :
1.1513 public GraphAdaptorExtender<
1.1514 - SubGraphBase<GR, ConstMap<typename GR::Node,bool>, EF, false> > {
1.1515 + SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true> >,
1.1516 + EF, false> > {
1.1517 #endif
1.1518 public:
1.1519 /// The type of the adapted graph.
1.1520 @@ -1752,13 +1744,13 @@
1.1521 typedef EF EdgeFilterMap;
1.1522
1.1523 typedef GraphAdaptorExtender<
1.1524 - SubGraphBase<GR, ConstMap<typename GR::Node,bool>, EF, false> >
1.1525 - Parent;
1.1526 + SubGraphBase<GR, ConstMap<typename GR::Node, Const<bool, true > >,
1.1527 + EF, false> > Parent;
1.1528
1.1529 typedef typename Parent::Edge Edge;
1.1530
1.1531 protected:
1.1532 - ConstMap<typename Graph::Node, bool> const_true_map;
1.1533 + ConstMap<typename GR::Node, Const<bool, true> > const_true_map;
1.1534
1.1535 FilterEdges() : const_true_map(true) {
1.1536 Parent::setNodeFilterMap(const_true_map);
1.1537 @@ -1770,11 +1762,9 @@
1.1538 ///
1.1539 /// Creates a subgraph for the given graph with the given edge
1.1540 /// filter map.
1.1541 - FilterEdges(Graph& graph, EdgeFilterMap& edge_filter_map) :
1.1542 - Parent(), const_true_map(true) {
1.1543 - Parent::setGraph(graph);
1.1544 - Parent::setNodeFilterMap(const_true_map);
1.1545 - Parent::setEdgeFilterMap(edge_filter_map);
1.1546 + FilterEdges(GR& graph, EF& edge_filter)
1.1547 + : Parent(), const_true_map() {
1.1548 + Parent::initialize(graph, const_true_map, edge_filter);
1.1549 }
1.1550
1.1551 /// \brief Sets the status of the given edge
1.1552 @@ -1812,21 +1802,21 @@
1.1553 /// \relates FilterEdges
1.1554 template<typename GR, typename EF>
1.1555 FilterEdges<const GR, EF>
1.1556 - filterEdges(const GR& graph, EF& edge_filter_map) {
1.1557 - return FilterEdges<const GR, EF>(graph, edge_filter_map);
1.1558 + filterEdges(const GR& graph, EF& edge_filter) {
1.1559 + return FilterEdges<const GR, EF>(graph, edge_filter);
1.1560 }
1.1561
1.1562 template<typename GR, typename EF>
1.1563 FilterEdges<const GR, const EF>
1.1564 - filterEdges(const GR& graph, const EF& edge_filter_map) {
1.1565 - return FilterEdges<const GR, const EF>(graph, edge_filter_map);
1.1566 + filterEdges(const GR& graph, const EF& edge_filter) {
1.1567 + return FilterEdges<const GR, const EF>(graph, edge_filter);
1.1568 }
1.1569
1.1570
1.1571 - template <typename _Digraph>
1.1572 + template <typename DGR>
1.1573 class UndirectorBase {
1.1574 public:
1.1575 - typedef _Digraph Digraph;
1.1576 + typedef DGR Digraph;
1.1577 typedef UndirectorBase Adaptor;
1.1578
1.1579 typedef True UndirectedTag;
1.1580 @@ -2062,34 +2052,35 @@
1.1581
1.1582 private:
1.1583
1.1584 - template <typename _Value>
1.1585 + template <typename V>
1.1586 class ArcMapBase {
1.1587 private:
1.1588
1.1589 - typedef typename Digraph::template ArcMap<_Value> MapImpl;
1.1590 + typedef typename DGR::template ArcMap<V> MapImpl;
1.1591
1.1592 public:
1.1593
1.1594 typedef typename MapTraits<MapImpl>::ReferenceMapTag ReferenceMapTag;
1.1595
1.1596 - typedef _Value Value;
1.1597 + typedef V Value;
1.1598 typedef Arc Key;
1.1599 typedef typename MapTraits<MapImpl>::ConstReturnValue ConstReturnValue;
1.1600 typedef typename MapTraits<MapImpl>::ReturnValue ReturnValue;
1.1601 typedef typename MapTraits<MapImpl>::ConstReturnValue ConstReference;
1.1602 typedef typename MapTraits<MapImpl>::ReturnValue Reference;
1.1603
1.1604 - ArcMapBase(const Adaptor& adaptor) :
1.1605 + ArcMapBase(const UndirectorBase<DGR>& adaptor) :
1.1606 _forward(*adaptor._digraph), _backward(*adaptor._digraph) {}
1.1607
1.1608 - ArcMapBase(const Adaptor& adaptor, const Value& v)
1.1609 - : _forward(*adaptor._digraph, v), _backward(*adaptor._digraph, v) {}
1.1610 -
1.1611 - void set(const Arc& a, const Value& v) {
1.1612 + ArcMapBase(const UndirectorBase<DGR>& adaptor, const V& value)
1.1613 + : _forward(*adaptor._digraph, value),
1.1614 + _backward(*adaptor._digraph, value) {}
1.1615 +
1.1616 + void set(const Arc& a, const V& value) {
1.1617 if (direction(a)) {
1.1618 - _forward.set(a, v);
1.1619 + _forward.set(a, value);
1.1620 } else {
1.1621 - _backward.set(a, v);
1.1622 + _backward.set(a, value);
1.1623 }
1.1624 }
1.1625
1.1626 @@ -2117,17 +2108,17 @@
1.1627
1.1628 public:
1.1629
1.1630 - template <typename _Value>
1.1631 - class NodeMap : public Digraph::template NodeMap<_Value> {
1.1632 + template <typename V>
1.1633 + class NodeMap : public DGR::template NodeMap<V> {
1.1634 public:
1.1635
1.1636 - typedef _Value Value;
1.1637 - typedef typename Digraph::template NodeMap<Value> Parent;
1.1638 -
1.1639 - explicit NodeMap(const Adaptor& adaptor)
1.1640 + typedef V Value;
1.1641 + typedef typename DGR::template NodeMap<Value> Parent;
1.1642 +
1.1643 + explicit NodeMap(const UndirectorBase<DGR>& adaptor)
1.1644 : Parent(*adaptor._digraph) {}
1.1645
1.1646 - NodeMap(const Adaptor& adaptor, const _Value& value)
1.1647 + NodeMap(const UndirectorBase<DGR>& adaptor, const V& value)
1.1648 : Parent(*adaptor._digraph, value) { }
1.1649
1.1650 private:
1.1651 @@ -2143,18 +2134,18 @@
1.1652
1.1653 };
1.1654
1.1655 - template <typename _Value>
1.1656 + template <typename V>
1.1657 class ArcMap
1.1658 - : public SubMapExtender<Adaptor, ArcMapBase<_Value> >
1.1659 + : public SubMapExtender<UndirectorBase<DGR>, ArcMapBase<V> >
1.1660 {
1.1661 public:
1.1662 - typedef _Value Value;
1.1663 - typedef SubMapExtender<Adaptor, ArcMapBase<Value> > Parent;
1.1664 -
1.1665 - explicit ArcMap(const Adaptor& adaptor)
1.1666 + typedef V Value;
1.1667 + typedef SubMapExtender<Adaptor, ArcMapBase<V> > Parent;
1.1668 +
1.1669 + explicit ArcMap(const UndirectorBase<DGR>& adaptor)
1.1670 : Parent(adaptor) {}
1.1671
1.1672 - ArcMap(const Adaptor& adaptor, const Value& value)
1.1673 + ArcMap(const UndirectorBase<DGR>& adaptor, const V& value)
1.1674 : Parent(adaptor, value) {}
1.1675
1.1676 private:
1.1677 @@ -2169,17 +2160,17 @@
1.1678 }
1.1679 };
1.1680
1.1681 - template <typename _Value>
1.1682 - class EdgeMap : public Digraph::template ArcMap<_Value> {
1.1683 + template <typename V>
1.1684 + class EdgeMap : public Digraph::template ArcMap<V> {
1.1685 public:
1.1686
1.1687 - typedef _Value Value;
1.1688 - typedef typename Digraph::template ArcMap<Value> Parent;
1.1689 -
1.1690 - explicit EdgeMap(const Adaptor& adaptor)
1.1691 + typedef V Value;
1.1692 + typedef typename Digraph::template ArcMap<V> Parent;
1.1693 +
1.1694 + explicit EdgeMap(const UndirectorBase<DGR>& adaptor)
1.1695 : Parent(*adaptor._digraph) {}
1.1696
1.1697 - EdgeMap(const Adaptor& adaptor, const Value& value)
1.1698 + EdgeMap(const UndirectorBase<DGR>& adaptor, const V& value)
1.1699 : Parent(*adaptor._digraph, value) {}
1.1700
1.1701 private:
1.1702 @@ -2195,19 +2186,19 @@
1.1703
1.1704 };
1.1705
1.1706 - typedef typename ItemSetTraits<Digraph, Node>::ItemNotifier NodeNotifier;
1.1707 + typedef typename ItemSetTraits<DGR, Node>::ItemNotifier NodeNotifier;
1.1708 NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
1.1709
1.1710 - typedef typename ItemSetTraits<Digraph, Edge>::ItemNotifier EdgeNotifier;
1.1711 + typedef typename ItemSetTraits<DGR, Edge>::ItemNotifier EdgeNotifier;
1.1712 EdgeNotifier& notifier(Edge) const { return _digraph->notifier(Edge()); }
1.1713
1.1714 protected:
1.1715
1.1716 UndirectorBase() : _digraph(0) {}
1.1717
1.1718 - Digraph* _digraph;
1.1719 -
1.1720 - void setDigraph(Digraph& digraph) {
1.1721 + DGR* _digraph;
1.1722 +
1.1723 + void initialize(DGR& digraph) {
1.1724 _digraph = &digraph;
1.1725 }
1.1726
1.1727 @@ -2226,7 +2217,7 @@
1.1728 /// by adding or removing nodes or edges, unless the \c GR template
1.1729 /// parameter is set to be \c const.
1.1730 ///
1.1731 - /// \tparam GR The type of the adapted digraph.
1.1732 + /// \tparam DGR The type of the adapted digraph.
1.1733 /// It must conform to the \ref concepts::Digraph "Digraph" concept.
1.1734 /// It can also be specified to be \c const.
1.1735 ///
1.1736 @@ -2236,17 +2227,17 @@
1.1737 /// each other.
1.1738 /// (Thus the \c Arc type of the adaptor is convertible to the \c Arc type
1.1739 /// of the adapted digraph.)
1.1740 - template<typename GR>
1.1741 + template<typename DGR>
1.1742 #ifdef DOXYGEN
1.1743 class Undirector {
1.1744 #else
1.1745 class Undirector :
1.1746 - public GraphAdaptorExtender<UndirectorBase<GR> > {
1.1747 + public GraphAdaptorExtender<UndirectorBase<DGR> > {
1.1748 #endif
1.1749 public:
1.1750 /// The type of the adapted digraph.
1.1751 - typedef GR Digraph;
1.1752 - typedef GraphAdaptorExtender<UndirectorBase<GR> > Parent;
1.1753 + typedef DGR Digraph;
1.1754 + typedef GraphAdaptorExtender<UndirectorBase<DGR> > Parent;
1.1755 protected:
1.1756 Undirector() { }
1.1757 public:
1.1758 @@ -2254,8 +2245,8 @@
1.1759 /// \brief Constructor
1.1760 ///
1.1761 /// Creates an undirected graph from the given digraph.
1.1762 - Undirector(Digraph& digraph) {
1.1763 - setDigraph(digraph);
1.1764 + Undirector(DGR& digraph) {
1.1765 + initialize(digraph);
1.1766 }
1.1767
1.1768 /// \brief Arc map combined from two original arc maps
1.1769 @@ -2355,21 +2346,21 @@
1.1770 /// This function just returns a read-only \ref Undirector adaptor.
1.1771 /// \ingroup graph_adaptors
1.1772 /// \relates Undirector
1.1773 - template<typename GR>
1.1774 - Undirector<const GR> undirector(const GR& digraph) {
1.1775 - return Undirector<const GR>(digraph);
1.1776 + template<typename DGR>
1.1777 + Undirector<const DGR> undirector(const DGR& digraph) {
1.1778 + return Undirector<const DGR>(digraph);
1.1779 }
1.1780
1.1781
1.1782 - template <typename _Graph, typename _DirectionMap>
1.1783 + template <typename GR, typename DM>
1.1784 class OrienterBase {
1.1785 public:
1.1786
1.1787 - typedef _Graph Graph;
1.1788 - typedef _DirectionMap DirectionMap;
1.1789 -
1.1790 - typedef typename Graph::Node Node;
1.1791 - typedef typename Graph::Edge Arc;
1.1792 + typedef GR Graph;
1.1793 + typedef DM DirectionMap;
1.1794 +
1.1795 + typedef typename GR::Node Node;
1.1796 + typedef typename GR::Edge Arc;
1.1797
1.1798 void reverseArc(const Arc& arc) {
1.1799 _direction->set(arc, !(*_direction)[arc]);
1.1800 @@ -2448,22 +2439,22 @@
1.1801 int maxNodeId() const { return _graph->maxNodeId(); }
1.1802 int maxArcId() const { return _graph->maxEdgeId(); }
1.1803
1.1804 - typedef typename ItemSetTraits<Graph, Node>::ItemNotifier NodeNotifier;
1.1805 + typedef typename ItemSetTraits<GR, Node>::ItemNotifier NodeNotifier;
1.1806 NodeNotifier& notifier(Node) const { return _graph->notifier(Node()); }
1.1807
1.1808 - typedef typename ItemSetTraits<Graph, Arc>::ItemNotifier ArcNotifier;
1.1809 + typedef typename ItemSetTraits<GR, Arc>::ItemNotifier ArcNotifier;
1.1810 ArcNotifier& notifier(Arc) const { return _graph->notifier(Arc()); }
1.1811
1.1812 - template <typename _Value>
1.1813 - class NodeMap : public _Graph::template NodeMap<_Value> {
1.1814 + template <typename V>
1.1815 + class NodeMap : public GR::template NodeMap<V> {
1.1816 public:
1.1817
1.1818 - typedef typename _Graph::template NodeMap<_Value> Parent;
1.1819 -
1.1820 - explicit NodeMap(const OrienterBase& adapter)
1.1821 + typedef typename GR::template NodeMap<V> Parent;
1.1822 +
1.1823 + explicit NodeMap(const OrienterBase<GR, DM>& adapter)
1.1824 : Parent(*adapter._graph) {}
1.1825
1.1826 - NodeMap(const OrienterBase& adapter, const _Value& value)
1.1827 + NodeMap(const OrienterBase<GR, DM>& adapter, const V& value)
1.1828 : Parent(*adapter._graph, value) {}
1.1829
1.1830 private:
1.1831 @@ -2479,16 +2470,16 @@
1.1832
1.1833 };
1.1834
1.1835 - template <typename _Value>
1.1836 - class ArcMap : public _Graph::template EdgeMap<_Value> {
1.1837 + template <typename V>
1.1838 + class ArcMap : public GR::template EdgeMap<V> {
1.1839 public:
1.1840
1.1841 - typedef typename Graph::template EdgeMap<_Value> Parent;
1.1842 -
1.1843 - explicit ArcMap(const OrienterBase& adapter)
1.1844 + typedef typename Graph::template EdgeMap<V> Parent;
1.1845 +
1.1846 + explicit ArcMap(const OrienterBase<GR, DM>& adapter)
1.1847 : Parent(*adapter._graph) { }
1.1848
1.1849 - ArcMap(const OrienterBase& adapter, const _Value& value)
1.1850 + ArcMap(const OrienterBase<GR, DM>& adapter, const V& value)
1.1851 : Parent(*adapter._graph, value) { }
1.1852
1.1853 private:
1.1854 @@ -2507,16 +2498,13 @@
1.1855
1.1856 protected:
1.1857 Graph* _graph;
1.1858 - DirectionMap* _direction;
1.1859 -
1.1860 - void setDirectionMap(DirectionMap& direction) {
1.1861 + DM* _direction;
1.1862 +
1.1863 + void initialize(GR& graph, DM& direction) {
1.1864 + _graph = &graph;
1.1865 _direction = &direction;
1.1866 }
1.1867
1.1868 - void setGraph(Graph& graph) {
1.1869 - _graph = &graph;
1.1870 - }
1.1871 -
1.1872 };
1.1873
1.1874 /// \ingroup graph_adaptors
1.1875 @@ -2572,9 +2560,8 @@
1.1876 /// \brief Constructor
1.1877 ///
1.1878 /// Constructor of the adaptor.
1.1879 - Orienter(Graph& graph, DirectionMap& direction) {
1.1880 - setGraph(graph);
1.1881 - setDirectionMap(direction);
1.1882 + Orienter(GR& graph, DM& direction) {
1.1883 + Parent::initialize(graph, direction);
1.1884 }
1.1885
1.1886 /// \brief Reverses the given arc
1.1887 @@ -2594,67 +2581,62 @@
1.1888 /// \relates Orienter
1.1889 template<typename GR, typename DM>
1.1890 Orienter<const GR, DM>
1.1891 - orienter(const GR& graph, DM& direction_map) {
1.1892 - return Orienter<const GR, DM>(graph, direction_map);
1.1893 + orienter(const GR& graph, DM& direction) {
1.1894 + return Orienter<const GR, DM>(graph, direction);
1.1895 }
1.1896
1.1897 template<typename GR, typename DM>
1.1898 Orienter<const GR, const DM>
1.1899 - orienter(const GR& graph, const DM& direction_map) {
1.1900 - return Orienter<const GR, const DM>(graph, direction_map);
1.1901 + orienter(const GR& graph, const DM& direction) {
1.1902 + return Orienter<const GR, const DM>(graph, direction);
1.1903 }
1.1904
1.1905 namespace _adaptor_bits {
1.1906
1.1907 - template<typename Digraph,
1.1908 - typename CapacityMap,
1.1909 - typename FlowMap,
1.1910 - typename Tolerance>
1.1911 + template <typename DGR, typename CM, typename FM, typename TL>
1.1912 class ResForwardFilter {
1.1913 public:
1.1914
1.1915 - typedef typename Digraph::Arc Key;
1.1916 + typedef typename DGR::Arc Key;
1.1917 typedef bool Value;
1.1918
1.1919 private:
1.1920
1.1921 - const CapacityMap* _capacity;
1.1922 - const FlowMap* _flow;
1.1923 - Tolerance _tolerance;
1.1924 + const CM* _capacity;
1.1925 + const FM* _flow;
1.1926 + TL _tolerance;
1.1927 +
1.1928 public:
1.1929
1.1930 - ResForwardFilter(const CapacityMap& capacity, const FlowMap& flow,
1.1931 - const Tolerance& tolerance = Tolerance())
1.1932 + ResForwardFilter(const CM& capacity, const FM& flow,
1.1933 + const TL& tolerance = TL())
1.1934 : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
1.1935
1.1936 - bool operator[](const typename Digraph::Arc& a) const {
1.1937 + bool operator[](const typename DGR::Arc& a) const {
1.1938 return _tolerance.positive((*_capacity)[a] - (*_flow)[a]);
1.1939 }
1.1940 };
1.1941
1.1942 - template<typename Digraph,
1.1943 - typename CapacityMap,
1.1944 - typename FlowMap,
1.1945 - typename Tolerance>
1.1946 + template<typename DGR,typename CM, typename FM, typename TL>
1.1947 class ResBackwardFilter {
1.1948 public:
1.1949
1.1950 - typedef typename Digraph::Arc Key;
1.1951 + typedef typename DGR::Arc Key;
1.1952 typedef bool Value;
1.1953
1.1954 private:
1.1955
1.1956 - const CapacityMap* _capacity;
1.1957 - const FlowMap* _flow;
1.1958 - Tolerance _tolerance;
1.1959 + const CM* _capacity;
1.1960 + const FM* _flow;
1.1961 + TL _tolerance;
1.1962
1.1963 public:
1.1964
1.1965 - ResBackwardFilter(const CapacityMap& capacity, const FlowMap& flow,
1.1966 - const Tolerance& tolerance = Tolerance())
1.1967 + ResBackwardFilter(const CM& capacity, const FM& flow,
1.1968 + const TL& tolerance = TL())
1.1969 : _capacity(&capacity), _flow(&flow), _tolerance(tolerance) { }
1.1970
1.1971 - bool operator[](const typename Digraph::Arc& a) const {
1.1972 + bool operator[](const typename DGR::Arc& a) const {
1.1973 return _tolerance.positive((*_flow)[a]);
1.1974 }
1.1975 };
1.1976 @@ -2681,7 +2663,7 @@
1.1977 /// arcs).
1.1978 /// This class conforms to the \ref concepts::Digraph "Digraph" concept.
1.1979 ///
1.1980 - /// \tparam GR The type of the adapted digraph.
1.1981 + /// \tparam DGR The type of the adapted digraph.
1.1982 /// It must conform to the \ref concepts::Digraph "Digraph" concept.
1.1983 /// It is implicitly \c const.
1.1984 /// \tparam CM The type of the capacity map.
1.1985 @@ -2703,25 +2685,26 @@
1.1986 /// convertible to each other, moreover the \c Arc type of the adaptor
1.1987 /// is convertible to the \c Arc type of the adapted digraph.
1.1988 #ifdef DOXYGEN
1.1989 - template<typename GR, typename CM, typename FM, typename TL>
1.1990 + template<typename DGR, typename CM, typename FM, typename TL>
1.1991 class ResidualDigraph
1.1992 #else
1.1993 - template<typename GR,
1.1994 - typename CM = typename GR::template ArcMap<int>,
1.1995 + template<typename DGR,
1.1996 + typename CM = typename DGR::template ArcMap<int>,
1.1997 typename FM = CM,
1.1998 typename TL = Tolerance<typename CM::Value> >
1.1999 - class ResidualDigraph :
1.2000 - public FilterArcs<
1.2001 - Undirector<const GR>,
1.2002 - typename Undirector<const GR>::template CombinedArcMap<
1.2003 - _adaptor_bits::ResForwardFilter<const GR, CM, FM, TL>,
1.2004 - _adaptor_bits::ResBackwardFilter<const GR, CM, FM, TL> > >
1.2005 + class ResidualDigraph
1.2006 + : public SubDigraph<
1.2007 + Undirector<const DGR>,
1.2008 + ConstMap<typename DGR::Node, Const<bool, true> >,
1.2009 + typename Undirector<const DGR>::template CombinedArcMap<
1.2010 + _adaptor_bits::ResForwardFilter<const DGR, CM, FM, TL>,
1.2011 + _adaptor_bits::ResBackwardFilter<const DGR, CM, FM, TL> > >
1.2012 #endif
1.2013 {
1.2014 public:
1.2015
1.2016 /// The type of the underlying digraph.
1.2017 - typedef GR Digraph;
1.2018 + typedef DGR Digraph;
1.2019 /// The type of the capacity map.
1.2020 typedef CM CapacityMap;
1.2021 /// The type of the flow map.
1.2022 @@ -2736,21 +2719,24 @@
1.2023
1.2024 typedef Undirector<const Digraph> Undirected;
1.2025
1.2026 - typedef _adaptor_bits::ResForwardFilter<const Digraph, CapacityMap,
1.2027 - FlowMap, Tolerance> ForwardFilter;
1.2028 -
1.2029 - typedef _adaptor_bits::ResBackwardFilter<const Digraph, CapacityMap,
1.2030 - FlowMap, Tolerance> BackwardFilter;
1.2031 + typedef ConstMap<typename DGR::Node, Const<bool, true> > NodeFilter;
1.2032 +
1.2033 + typedef _adaptor_bits::ResForwardFilter<const DGR, CM,
1.2034 + FM, TL> ForwardFilter;
1.2035 +
1.2036 + typedef _adaptor_bits::ResBackwardFilter<const DGR, CM,
1.2037 + FM, TL> BackwardFilter;
1.2038
1.2039 typedef typename Undirected::
1.2040 template CombinedArcMap<ForwardFilter, BackwardFilter> ArcFilter;
1.2041
1.2042 - typedef FilterArcs<Undirected, ArcFilter> Parent;
1.2043 + typedef SubDigraph<Undirected, NodeFilter, ArcFilter> Parent;
1.2044
1.2045 const CapacityMap* _capacity;
1.2046 FlowMap* _flow;
1.2047
1.2048 Undirected _graph;
1.2049 + NodeFilter _node_filter;
1.2050 ForwardFilter _forward_filter;
1.2051 BackwardFilter _backward_filter;
1.2052 ArcFilter _arc_filter;
1.2053 @@ -2761,15 +2747,15 @@
1.2054 ///
1.2055 /// Constructor of the residual digraph adaptor. The parameters are the
1.2056 /// digraph, the capacity map, the flow map, and a tolerance object.
1.2057 - ResidualDigraph(const Digraph& digraph, const CapacityMap& capacity,
1.2058 - FlowMap& flow, const Tolerance& tolerance = Tolerance())
1.2059 - : Parent(), _capacity(&capacity), _flow(&flow), _graph(digraph),
1.2060 + ResidualDigraph(const DGR& digraph, const CM& capacity,
1.2061 + FM& flow, const TL& tolerance = Tolerance())
1.2062 + : Parent(), _capacity(&capacity), _flow(&flow),
1.2063 + _graph(digraph), _node_filter(),
1.2064 _forward_filter(capacity, flow, tolerance),
1.2065 _backward_filter(capacity, flow, tolerance),
1.2066 _arc_filter(_forward_filter, _backward_filter)
1.2067 {
1.2068 - Parent::setDigraph(_graph);
1.2069 - Parent::setArcFilterMap(_arc_filter);
1.2070 + Parent::initialize(_graph, _node_filter, _arc_filter);
1.2071 }
1.2072
1.2073 typedef typename Parent::Arc Arc;
1.2074 @@ -2845,7 +2831,8 @@
1.2075 typedef typename CapacityMap::Value Value;
1.2076
1.2077 /// Constructor
1.2078 - ResidualCapacity(const Adaptor& adaptor) : _adaptor(&adaptor) {}
1.2079 + ResidualCapacity(const ResidualDigraph<DGR, CM, FM, TL>& adaptor)
1.2080 + : _adaptor(&adaptor) {}
1.2081
1.2082 /// Returns the value associated with the given residual arc
1.2083 Value operator[](const Arc& a) const {
1.2084 @@ -2865,26 +2852,26 @@
1.2085
1.2086 /// \brief Returns a (read-only) Residual adaptor
1.2087 ///
1.2088 - /// This function just returns a (read-only) \ref Residual adaptor.
1.2089 + /// This function just returns a (read-only) \ref ResidualDigraph adaptor.
1.2090 /// \ingroup graph_adaptors
1.2091 - /// \relates Residual
1.2092 - template<typename GR, typename CM, typename FM>
1.2093 - ResidualDigraph<GR, CM, FM>
1.2094 - residualDigraph(const GR& digraph, const CM& capacity_map, FM& flow_map) {
1.2095 - return ResidualDigraph<GR, CM, FM> (digraph, capacity_map, flow_map);
1.2096 + /// \relates ResidualDigraph
1.2097 + template<typename DGR, typename CM, typename FM>
1.2098 + ResidualDigraph<DGR, CM, FM>
1.2099 + residualDigraph(const DGR& digraph, const CM& capacity_map, FM& flow_map) {
1.2100 + return ResidualDigraph<DGR, CM, FM> (digraph, capacity_map, flow_map);
1.2101 }
1.2102
1.2103
1.2104 - template <typename _Digraph>
1.2105 + template <typename DGR>
1.2106 class SplitNodesBase {
1.2107 public:
1.2108
1.2109 - typedef _Digraph Digraph;
1.2110 - typedef DigraphAdaptorBase<const _Digraph> Parent;
1.2111 + typedef DGR Digraph;
1.2112 + typedef DigraphAdaptorBase<const DGR> Parent;
1.2113 typedef SplitNodesBase Adaptor;
1.2114
1.2115 - typedef typename Digraph::Node DigraphNode;
1.2116 - typedef typename Digraph::Arc DigraphArc;
1.2117 + typedef typename DGR::Node DigraphNode;
1.2118 + typedef typename DGR::Arc DigraphArc;
1.2119
1.2120 class Node;
1.2121 class Arc;
1.2122 @@ -3148,32 +3135,32 @@
1.2123
1.2124 private:
1.2125
1.2126 - template <typename _Value>
1.2127 + template <typename V>
1.2128 class NodeMapBase
1.2129 - : public MapTraits<typename Parent::template NodeMap<_Value> > {
1.2130 - typedef typename Parent::template NodeMap<_Value> NodeImpl;
1.2131 + : public MapTraits<typename Parent::template NodeMap<V> > {
1.2132 + typedef typename Parent::template NodeMap<V> NodeImpl;
1.2133 public:
1.2134 typedef Node Key;
1.2135 - typedef _Value Value;
1.2136 + typedef V Value;
1.2137 typedef typename MapTraits<NodeImpl>::ReferenceMapTag ReferenceMapTag;
1.2138 typedef typename MapTraits<NodeImpl>::ReturnValue ReturnValue;
1.2139 typedef typename MapTraits<NodeImpl>::ConstReturnValue ConstReturnValue;
1.2140 typedef typename MapTraits<NodeImpl>::ReturnValue Reference;
1.2141 typedef typename MapTraits<NodeImpl>::ConstReturnValue ConstReference;
1.2142
1.2143 - NodeMapBase(const Adaptor& adaptor)
1.2144 + NodeMapBase(const SplitNodesBase<DGR>& adaptor)
1.2145 : _in_map(*adaptor._digraph), _out_map(*adaptor._digraph) {}
1.2146 - NodeMapBase(const Adaptor& adaptor, const Value& value)
1.2147 + NodeMapBase(const SplitNodesBase<DGR>& adaptor, const V& value)
1.2148 : _in_map(*adaptor._digraph, value),
1.2149 _out_map(*adaptor._digraph, value) {}
1.2150
1.2151 - void set(const Node& key, const Value& val) {
1.2152 - if (Adaptor::inNode(key)) { _in_map.set(key, val); }
1.2153 + void set(const Node& key, const V& val) {
1.2154 + if (SplitNodesBase<DGR>::inNode(key)) { _in_map.set(key, val); }
1.2155 else {_out_map.set(key, val); }
1.2156 }
1.2157
1.2158 ReturnValue operator[](const Node& key) {
1.2159 - if (Adaptor::inNode(key)) { return _in_map[key]; }
1.2160 + if (SplitNodesBase<DGR>::inNode(key)) { return _in_map[key]; }
1.2161 else { return _out_map[key]; }
1.2162 }
1.2163
1.2164 @@ -3186,28 +3173,28 @@
1.2165 NodeImpl _in_map, _out_map;
1.2166 };
1.2167
1.2168 - template <typename _Value>
1.2169 + template <typename V>
1.2170 class ArcMapBase
1.2171 - : public MapTraits<typename Parent::template ArcMap<_Value> > {
1.2172 - typedef typename Parent::template ArcMap<_Value> ArcImpl;
1.2173 - typedef typename Parent::template NodeMap<_Value> NodeImpl;
1.2174 + : public MapTraits<typename Parent::template ArcMap<V> > {
1.2175 + typedef typename Parent::template ArcMap<V> ArcImpl;
1.2176 + typedef typename Parent::template NodeMap<V> NodeImpl;
1.2177 public:
1.2178 typedef Arc Key;
1.2179 - typedef _Value Value;
1.2180 + typedef V Value;
1.2181 typedef typename MapTraits<ArcImpl>::ReferenceMapTag ReferenceMapTag;
1.2182 typedef typename MapTraits<ArcImpl>::ReturnValue ReturnValue;
1.2183 typedef typename MapTraits<ArcImpl>::ConstReturnValue ConstReturnValue;
1.2184 typedef typename MapTraits<ArcImpl>::ReturnValue Reference;
1.2185 typedef typename MapTraits<ArcImpl>::ConstReturnValue ConstReference;
1.2186
1.2187 - ArcMapBase(const Adaptor& adaptor)
1.2188 + ArcMapBase(const SplitNodesBase<DGR>& adaptor)
1.2189 : _arc_map(*adaptor._digraph), _node_map(*adaptor._digraph) {}
1.2190 - ArcMapBase(const Adaptor& adaptor, const Value& value)
1.2191 + ArcMapBase(const SplitNodesBase<DGR>& adaptor, const V& value)
1.2192 : _arc_map(*adaptor._digraph, value),
1.2193 _node_map(*adaptor._digraph, value) {}
1.2194
1.2195 - void set(const Arc& key, const Value& val) {
1.2196 - if (Adaptor::origArc(key)) {
1.2197 + void set(const Arc& key, const V& val) {
1.2198 + if (SplitNodesBase<DGR>::origArc(key)) {
1.2199 _arc_map.set(key._item.first(), val);
1.2200 } else {
1.2201 _node_map.set(key._item.second(), val);
1.2202 @@ -3215,7 +3202,7 @@
1.2203 }
1.2204
1.2205 ReturnValue operator[](const Arc& key) {
1.2206 - if (Adaptor::origArc(key)) {
1.2207 + if (SplitNodesBase<DGR>::origArc(key)) {
1.2208 return _arc_map[key._item.first()];
1.2209 } else {
1.2210 return _node_map[key._item.second()];
1.2211 @@ -3223,7 +3210,7 @@
1.2212 }
1.2213
1.2214 ConstReturnValue operator[](const Arc& key) const {
1.2215 - if (Adaptor::origArc(key)) {
1.2216 + if (SplitNodesBase<DGR>::origArc(key)) {
1.2217 return _arc_map[key._item.first()];
1.2218 } else {
1.2219 return _node_map[key._item.second()];
1.2220 @@ -3237,18 +3224,18 @@
1.2221
1.2222 public:
1.2223
1.2224 - template <typename _Value>
1.2225 + template <typename V>
1.2226 class NodeMap
1.2227 - : public SubMapExtender<Adaptor, NodeMapBase<_Value> >
1.2228 + : public SubMapExtender<SplitNodesBase<DGR>, NodeMapBase<V> >
1.2229 {
1.2230 public:
1.2231 - typedef _Value Value;
1.2232 - typedef SubMapExtender<Adaptor, NodeMapBase<Value> > Parent;
1.2233 -
1.2234 - NodeMap(const Adaptor& adaptor)
1.2235 + typedef V Value;
1.2236 + typedef SubMapExtender<SplitNodesBase<DGR>, NodeMapBase<Value> > Parent;
1.2237 +
1.2238 + NodeMap(const SplitNodesBase<DGR>& adaptor)
1.2239 : Parent(adaptor) {}
1.2240
1.2241 - NodeMap(const Adaptor& adaptor, const Value& value)
1.2242 + NodeMap(const SplitNodesBase<DGR>& adaptor, const V& value)
1.2243 : Parent(adaptor, value) {}
1.2244
1.2245 private:
1.2246 @@ -3263,18 +3250,18 @@
1.2247 }
1.2248 };
1.2249
1.2250 - template <typename _Value>
1.2251 + template <typename V>
1.2252 class ArcMap
1.2253 - : public SubMapExtender<Adaptor, ArcMapBase<_Value> >
1.2254 + : public SubMapExtender<SplitNodesBase<DGR>, ArcMapBase<V> >
1.2255 {
1.2256 public:
1.2257 - typedef _Value Value;
1.2258 - typedef SubMapExtender<Adaptor, ArcMapBase<Value> > Parent;
1.2259 -
1.2260 - ArcMap(const Adaptor& adaptor)
1.2261 + typedef V Value;
1.2262 + typedef SubMapExtender<SplitNodesBase<DGR>, ArcMapBase<Value> > Parent;
1.2263 +
1.2264 + ArcMap(const SplitNodesBase<DGR>& adaptor)
1.2265 : Parent(adaptor) {}
1.2266
1.2267 - ArcMap(const Adaptor& adaptor, const Value& value)
1.2268 + ArcMap(const SplitNodesBase<DGR>& adaptor, const V& value)
1.2269 : Parent(adaptor, value) {}
1.2270
1.2271 private:
1.2272 @@ -3293,9 +3280,9 @@
1.2273
1.2274 SplitNodesBase() : _digraph(0) {}
1.2275
1.2276 - Digraph* _digraph;
1.2277 -
1.2278 - void setDigraph(Digraph& digraph) {
1.2279 + DGR* _digraph;
1.2280 +
1.2281 + void initialize(Digraph& digraph) {
1.2282 _digraph = &digraph;
1.2283 }
1.2284
1.2285 @@ -3322,25 +3309,25 @@
1.2286 /// costs/capacities of the original digraph to the \e bind \e arcs
1.2287 /// in the adaptor.
1.2288 ///
1.2289 - /// \tparam GR The type of the adapted digraph.
1.2290 + /// \tparam DGR The type of the adapted digraph.
1.2291 /// It must conform to the \ref concepts::Digraph "Digraph" concept.
1.2292 /// It is implicitly \c const.
1.2293 ///
1.2294 /// \note The \c Node type of this adaptor is converible to the \c Node
1.2295 /// type of the adapted digraph.
1.2296 - template <typename GR>
1.2297 + template <typename DGR>
1.2298 #ifdef DOXYGEN
1.2299 class SplitNodes {
1.2300 #else
1.2301 class SplitNodes
1.2302 - : public DigraphAdaptorExtender<SplitNodesBase<const GR> > {
1.2303 + : public DigraphAdaptorExtender<SplitNodesBase<const DGR> > {
1.2304 #endif
1.2305 public:
1.2306 - typedef GR Digraph;
1.2307 - typedef DigraphAdaptorExtender<SplitNodesBase<const GR> > Parent;
1.2308 -
1.2309 - typedef typename Digraph::Node DigraphNode;
1.2310 - typedef typename Digraph::Arc DigraphArc;
1.2311 + typedef DGR Digraph;
1.2312 + typedef DigraphAdaptorExtender<SplitNodesBase<const DGR> > Parent;
1.2313 +
1.2314 + typedef typename DGR::Node DigraphNode;
1.2315 + typedef typename DGR::Arc DigraphArc;
1.2316
1.2317 typedef typename Parent::Node Node;
1.2318 typedef typename Parent::Arc Arc;
1.2319 @@ -3348,8 +3335,8 @@
1.2320 /// \brief Constructor
1.2321 ///
1.2322 /// Constructor of the adaptor.
1.2323 - SplitNodes(const Digraph& g) {
1.2324 - Parent::setDigraph(g);
1.2325 + SplitNodes(const DGR& g) {
1.2326 + Parent::initialize(g);
1.2327 }
1.2328
1.2329 /// \brief Returns \c true if the given node is an in-node.
1.2330 @@ -3441,7 +3428,7 @@
1.2331
1.2332 /// Returns the value associated with the given key.
1.2333 Value operator[](const Key& key) const {
1.2334 - if (Parent::inNode(key)) {
1.2335 + if (SplitNodesBase<const DGR>::inNode(key)) {
1.2336 return _in_map[key];
1.2337 } else {
1.2338 return _out_map[key];
1.2339 @@ -3450,7 +3437,7 @@
1.2340
1.2341 /// Returns a reference to the value associated with the given key.
1.2342 Value& operator[](const Key& key) {
1.2343 - if (Parent::inNode(key)) {
1.2344 + if (SplitNodesBase<const DGR>::inNode(key)) {
1.2345 return _in_map[key];
1.2346 } else {
1.2347 return _out_map[key];
1.2348 @@ -3459,7 +3446,7 @@
1.2349
1.2350 /// Sets the value associated with the given key.
1.2351 void set(const Key& key, const Value& value) {
1.2352 - if (Parent::inNode(key)) {
1.2353 + if (SplitNodesBase<const DGR>::inNode(key)) {
1.2354 _in_map.set(key, value);
1.2355 } else {
1.2356 _out_map.set(key, value);
1.2357 @@ -3530,7 +3517,7 @@
1.2358
1.2359 /// Returns the value associated with the given key.
1.2360 Value operator[](const Key& arc) const {
1.2361 - if (Parent::origArc(arc)) {
1.2362 + if (SplitNodesBase<const DGR>::origArc(arc)) {
1.2363 return _arc_map[arc];
1.2364 } else {
1.2365 return _node_map[arc];
1.2366 @@ -3539,7 +3526,7 @@
1.2367
1.2368 /// Returns a reference to the value associated with the given key.
1.2369 Value& operator[](const Key& arc) {
1.2370 - if (Parent::origArc(arc)) {
1.2371 + if (SplitNodesBase<const DGR>::origArc(arc)) {
1.2372 return _arc_map[arc];
1.2373 } else {
1.2374 return _node_map[arc];
1.2375 @@ -3548,7 +3535,7 @@
1.2376
1.2377 /// Sets the value associated with the given key.
1.2378 void set(const Arc& arc, const Value& val) {
1.2379 - if (Parent::origArc(arc)) {
1.2380 + if (SplitNodesBase<const DGR>::origArc(arc)) {
1.2381 _arc_map.set(arc, val);
1.2382 } else {
1.2383 _node_map.set(arc, val);
1.2384 @@ -3594,12 +3581,14 @@
1.2385 /// This function just returns a (read-only) \ref SplitNodes adaptor.
1.2386 /// \ingroup graph_adaptors
1.2387 /// \relates SplitNodes
1.2388 - template<typename GR>
1.2389 - SplitNodes<GR>
1.2390 - splitNodes(const GR& digraph) {
1.2391 - return SplitNodes<GR>(digraph);
1.2392 + template<typename DGR>
1.2393 + SplitNodes<DGR>
1.2394 + splitNodes(const DGR& digraph) {
1.2395 + return SplitNodes<DGR>(digraph);
1.2396 }
1.2397
1.2398 +#undef LEMON_SCOPE_FIX
1.2399 +
1.2400 } //namespace lemon
1.2401
1.2402 #endif //LEMON_ADAPTORS_H