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