|
1 /* -*- C++ -*- |
|
2 * |
|
3 * This file is a part of LEMON, a generic C++ optimization library |
|
4 * |
|
5 * Copyright (C) 2003-2006 |
|
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
|
7 * (Egervary Research Group on Combinatorial Optimization, EGRES). |
|
8 * |
|
9 * Permission to use, modify and distribute this software is granted |
|
10 * provided that this copyright notice appears in all copies. For |
|
11 * precise terms see the accompanying LICENSE file. |
|
12 * |
|
13 * This software is provided "AS IS" with no warranty of any kind, |
|
14 * express or implied, and with no claim as to its suitability for any |
|
15 * purpose. |
|
16 * |
|
17 */ |
|
18 |
|
19 ///\ingroup graph_concepts |
|
20 ///\file |
|
21 ///\brief The concept of the graph components. |
|
22 |
|
23 |
|
24 #ifndef LEMON_CONCEPT_GRAPH_COMPONENTS_H |
|
25 #define LEMON_CONCEPT_GRAPH_COMPONENTS_H |
|
26 |
|
27 #include <lemon/bits/invalid.h> |
|
28 #include <lemon/concept/maps.h> |
|
29 |
|
30 #include <lemon/bits/alteration_notifier.h> |
|
31 |
|
32 namespace lemon { |
|
33 namespace concept { |
|
34 |
|
35 /// \brief Skeleton class for graph Node and Edge types |
|
36 /// |
|
37 /// This class describes the interface of Node and Edge (and UEdge |
|
38 /// in undirected graphs) subtypes of graph types. |
|
39 /// |
|
40 /// \note This class is a template class so that we can use it to |
|
41 /// create graph skeleton classes. The reason for this is than Node |
|
42 /// and Edge types should \em not derive from the same base class. |
|
43 /// For Node you should instantiate it with character 'n' and for Edge |
|
44 /// with 'e'. |
|
45 |
|
46 #ifndef DOXYGEN |
|
47 template <char _selector = '0'> |
|
48 #endif |
|
49 class GraphItem { |
|
50 public: |
|
51 /// \brief Default constructor. |
|
52 /// |
|
53 /// \warning The default constructor is not required to set |
|
54 /// the item to some well-defined value. So you should consider it |
|
55 /// as uninitialized. |
|
56 GraphItem() {} |
|
57 /// \brief Copy constructor. |
|
58 /// |
|
59 /// Copy constructor. |
|
60 /// |
|
61 GraphItem(const GraphItem &) {} |
|
62 /// \brief Invalid constructor \& conversion. |
|
63 /// |
|
64 /// This constructor initializes the item to be invalid. |
|
65 /// \sa Invalid for more details. |
|
66 GraphItem(Invalid) {} |
|
67 /// \brief Assign operator for nodes. |
|
68 /// |
|
69 /// The nodes are assignable. |
|
70 /// |
|
71 GraphItem& operator=(GraphItem const&) { return *this; } |
|
72 /// \brief Equality operator. |
|
73 /// |
|
74 /// Two iterators are equal if and only if they represents the |
|
75 /// same node in the graph or both are invalid. |
|
76 bool operator==(GraphItem) const { return false; } |
|
77 /// \brief Inequality operator. |
|
78 /// |
|
79 /// \sa operator==(const Node& n) |
|
80 /// |
|
81 bool operator!=(GraphItem) const { return false; } |
|
82 |
|
83 /// \brief Artificial ordering operator. |
|
84 /// |
|
85 /// To allow the use of graph descriptors as key type in std::map or |
|
86 /// similar associative container we require this. |
|
87 /// |
|
88 /// \note This operator only have to define some strict ordering of |
|
89 /// the items; this order has nothing to do with the iteration |
|
90 /// ordering of the items. |
|
91 bool operator<(GraphItem) const { return false; } |
|
92 |
|
93 template<typename _GraphItem> |
|
94 struct Constraints { |
|
95 void constraints() { |
|
96 _GraphItem i1; |
|
97 _GraphItem i2 = i1; |
|
98 _GraphItem i3 = INVALID; |
|
99 |
|
100 i1 = i2 = i3; |
|
101 |
|
102 bool b; |
|
103 // b = (ia == ib) && (ia != ib) && (ia < ib); |
|
104 b = (ia == ib) && (ia != ib); |
|
105 b = (ia == INVALID) && (ib != INVALID); |
|
106 b = (ia < ib); |
|
107 } |
|
108 |
|
109 const _GraphItem &ia; |
|
110 const _GraphItem &ib; |
|
111 }; |
|
112 }; |
|
113 |
|
114 /// \brief An empty base graph class. |
|
115 /// |
|
116 /// This class provides the minimal set of features needed for a graph |
|
117 /// structure. All graph concepts have to be conform to this base |
|
118 /// graph. It just provides types for nodes and edges and functions to |
|
119 /// get the source and the target of the edges. |
|
120 class BaseGraphComponent { |
|
121 public: |
|
122 |
|
123 typedef BaseGraphComponent Graph; |
|
124 |
|
125 /// \brief Node class of the graph. |
|
126 /// |
|
127 /// This class represents the Nodes of the graph. |
|
128 /// |
|
129 typedef GraphItem<'n'> Node; |
|
130 |
|
131 /// \brief Edge class of the graph. |
|
132 /// |
|
133 /// This class represents the Edges of the graph. |
|
134 /// |
|
135 typedef GraphItem<'e'> Edge; |
|
136 |
|
137 /// \brief Gives back the target node of an edge. |
|
138 /// |
|
139 /// Gives back the target node of an edge. |
|
140 /// |
|
141 Node target(const Edge&) const { return INVALID;} |
|
142 |
|
143 /// \brief Gives back the source node of an edge. |
|
144 /// |
|
145 /// Gives back the source node of an edge. |
|
146 /// |
|
147 Node source(const Edge&) const { return INVALID;} |
|
148 |
|
149 /// \brief Gives back the opposite node on the given edge. |
|
150 /// |
|
151 /// Gives back the opposite node on the given edge. |
|
152 Node oppositeNode(const Node&, const Edge&) const { |
|
153 return INVALID; |
|
154 } |
|
155 |
|
156 template <typename _Graph> |
|
157 struct Constraints { |
|
158 typedef typename _Graph::Node Node; |
|
159 typedef typename _Graph::Edge Edge; |
|
160 |
|
161 void constraints() { |
|
162 checkConcept<GraphItem<'n'>, Node>(); |
|
163 checkConcept<GraphItem<'e'>, Edge>(); |
|
164 { |
|
165 Node n; |
|
166 Edge e(INVALID); |
|
167 n = graph.source(e); |
|
168 n = graph.target(e); |
|
169 n = graph.oppositeNode(n, e); |
|
170 } |
|
171 } |
|
172 |
|
173 const _Graph& graph; |
|
174 }; |
|
175 }; |
|
176 |
|
177 /// \brief An empty base undirected graph class. |
|
178 /// |
|
179 /// This class provides the minimal set of features needed for an |
|
180 /// undirected graph structure. All undirected graph concepts have |
|
181 /// to be conform to this base graph. It just provides types for |
|
182 /// nodes, edges and undirected edges and functions to get the |
|
183 /// source and the target of the edges and undirected edges, |
|
184 /// conversion from edges to undirected edges and function to get |
|
185 /// both direction of the undirected edges. |
|
186 class BaseUGraphComponent : public BaseGraphComponent { |
|
187 public: |
|
188 typedef BaseGraphComponent::Node Node; |
|
189 typedef BaseGraphComponent::Edge Edge; |
|
190 /// \brief Undirected edge class of the graph. |
|
191 /// |
|
192 /// This class represents the undirected edges of the graph. |
|
193 /// The undirected graphs can be used as a directed graph which |
|
194 /// for each edge contains the opposite edge too so the graph is |
|
195 /// bidirected. The undirected edge represents two opposite |
|
196 /// directed edges. |
|
197 class UEdge : public GraphItem<'u'> { |
|
198 public: |
|
199 typedef GraphItem<'u'> Parent; |
|
200 /// \brief Default constructor. |
|
201 /// |
|
202 /// \warning The default constructor is not required to set |
|
203 /// the item to some well-defined value. So you should consider it |
|
204 /// as uninitialized. |
|
205 UEdge() {} |
|
206 /// \brief Copy constructor. |
|
207 /// |
|
208 /// Copy constructor. |
|
209 /// |
|
210 UEdge(const UEdge &) : Parent() {} |
|
211 /// \brief Invalid constructor \& conversion. |
|
212 /// |
|
213 /// This constructor initializes the item to be invalid. |
|
214 /// \sa Invalid for more details. |
|
215 UEdge(Invalid) {} |
|
216 /// \brief Converter from edge to undirected edge. |
|
217 /// |
|
218 /// Besides the core graph item functionality each edge should |
|
219 /// be convertible to the represented undirected edge. |
|
220 UEdge(const Edge&) {} |
|
221 }; |
|
222 |
|
223 /// \brief Returns the direction of the edge. |
|
224 /// |
|
225 /// Returns the direction of the edge. Each edge represents an |
|
226 /// undirected edge with a direction. It gives back the |
|
227 /// direction. |
|
228 bool direction(const Edge&) const { return true; } |
|
229 |
|
230 /// \brief Returns the directed edge. |
|
231 /// |
|
232 /// Returns the directed edge from its direction and the |
|
233 /// represented undirected edge. |
|
234 Edge direct(const UEdge&, bool) const { return INVALID;} |
|
235 |
|
236 /// \brief Returns the directed edge. |
|
237 /// |
|
238 /// Returns the directed edge from its source and the |
|
239 /// represented undirected edge. |
|
240 Edge direct(const UEdge&, const Node&) const { return INVALID;} |
|
241 |
|
242 /// \brief Returns the opposite edge. |
|
243 /// |
|
244 /// Returns the opposite edge. It is the edge representing the |
|
245 /// same undirected edge and has opposite direction. |
|
246 Edge oppositeEdge(const Edge&) const { return INVALID;} |
|
247 |
|
248 /// \brief Gives back the target node of an undirected edge. |
|
249 /// |
|
250 /// Gives back the target node of an undirected edge. The name |
|
251 /// target is a little confusing because the undirected edge |
|
252 /// does not have target but it just means that one of the end |
|
253 /// node. |
|
254 Node target(const UEdge&) const { return INVALID;} |
|
255 |
|
256 /// \brief Gives back the source node of an undirected edge. |
|
257 /// |
|
258 /// Gives back the source node of an undirected edge. The name |
|
259 /// source is a little confusing because the undirected edge |
|
260 /// does not have source but it just means that one of the end |
|
261 /// node. |
|
262 Node source(const UEdge&) const { return INVALID;} |
|
263 |
|
264 template <typename _Graph> |
|
265 struct Constraints { |
|
266 typedef typename _Graph::Node Node; |
|
267 typedef typename _Graph::Edge Edge; |
|
268 typedef typename _Graph::UEdge UEdge; |
|
269 |
|
270 void constraints() { |
|
271 checkConcept<BaseGraphComponent, _Graph>(); |
|
272 checkConcept<GraphItem<'u'>, UEdge>(); |
|
273 { |
|
274 Node n; |
|
275 UEdge ue(INVALID); |
|
276 Edge e; |
|
277 n = graph.source(ue); |
|
278 n = graph.target(ue); |
|
279 e = graph.direct(ue, true); |
|
280 e = graph.direct(ue, n); |
|
281 e = graph.oppositeEdge(e); |
|
282 ue = e; |
|
283 bool d = graph.direction(e); |
|
284 ignore_unused_variable_warning(d); |
|
285 } |
|
286 } |
|
287 |
|
288 const _Graph& graph; |
|
289 }; |
|
290 |
|
291 }; |
|
292 |
|
293 /// \brief An empty iterable base graph class. |
|
294 /// |
|
295 /// This class provides beside the core graph features |
|
296 /// core iterable interface for the graph structure. |
|
297 /// Most of the base graphs should be conform to this concept. |
|
298 template <typename _Base = BaseGraphComponent> |
|
299 class BaseIterableGraphComponent : public _Base { |
|
300 public: |
|
301 |
|
302 typedef _Base Base; |
|
303 typedef typename Base::Node Node; |
|
304 typedef typename Base::Edge Edge; |
|
305 |
|
306 /// \brief Gives back the first node in the iterating order. |
|
307 /// |
|
308 /// Gives back the first node in the iterating order. |
|
309 /// |
|
310 void first(Node&) const {} |
|
311 |
|
312 /// \brief Gives back the next node in the iterating order. |
|
313 /// |
|
314 /// Gives back the next node in the iterating order. |
|
315 /// |
|
316 void next(Node&) const {} |
|
317 |
|
318 /// \brief Gives back the first edge in the iterating order. |
|
319 /// |
|
320 /// Gives back the first edge in the iterating order. |
|
321 /// |
|
322 void first(Edge&) const {} |
|
323 |
|
324 /// \brief Gives back the next edge in the iterating order. |
|
325 /// |
|
326 /// Gives back the next edge in the iterating order. |
|
327 /// |
|
328 void next(Edge&) const {} |
|
329 |
|
330 |
|
331 /// \brief Gives back the first of the edges point to the given |
|
332 /// node. |
|
333 /// |
|
334 /// Gives back the first of the edges point to the given node. |
|
335 /// |
|
336 void firstIn(Edge&, const Node&) const {} |
|
337 |
|
338 /// \brief Gives back the next of the edges points to the given |
|
339 /// node. |
|
340 /// |
|
341 /// Gives back the next of the edges points to the given node. |
|
342 /// |
|
343 void nextIn(Edge&) const {} |
|
344 |
|
345 /// \brief Gives back the first of the edges start from the |
|
346 /// given node. |
|
347 /// |
|
348 /// Gives back the first of the edges start from the given node. |
|
349 /// |
|
350 void firstOut(Edge&, const Node&) const {} |
|
351 |
|
352 /// \brief Gives back the next of the edges start from the given |
|
353 /// node. |
|
354 /// |
|
355 /// Gives back the next of the edges start from the given node. |
|
356 /// |
|
357 void nextOut(Edge&) const {} |
|
358 |
|
359 |
|
360 template <typename _Graph> |
|
361 struct Constraints { |
|
362 |
|
363 void constraints() { |
|
364 checkConcept< BaseGraphComponent, _Graph >(); |
|
365 typename _Graph::Node node; |
|
366 typename _Graph::Edge edge; |
|
367 { |
|
368 graph.first(node); |
|
369 graph.next(node); |
|
370 } |
|
371 { |
|
372 graph.first(edge); |
|
373 graph.next(edge); |
|
374 } |
|
375 { |
|
376 graph.firstIn(edge, node); |
|
377 graph.nextIn(edge); |
|
378 } |
|
379 { |
|
380 graph.firstOut(edge, node); |
|
381 graph.nextOut(edge); |
|
382 } |
|
383 } |
|
384 |
|
385 const _Graph& graph; |
|
386 }; |
|
387 }; |
|
388 |
|
389 /// \brief An empty iterable base undirected graph class. |
|
390 /// |
|
391 /// This class provides beside the core undirceted graph features |
|
392 /// core iterable interface for the undirected graph structure. |
|
393 /// Most of the base undirected graphs should be conform to this |
|
394 /// concept. |
|
395 template <typename _Base = BaseUGraphComponent> |
|
396 class BaseIterableUGraphComponent |
|
397 : public BaseIterableGraphComponent<_Base> { |
|
398 public: |
|
399 |
|
400 typedef _Base Base; |
|
401 typedef typename Base::UEdge UEdge; |
|
402 typedef typename Base::Node Node; |
|
403 |
|
404 using BaseIterableGraphComponent<_Base>::first; |
|
405 using BaseIterableGraphComponent<_Base>::next; |
|
406 |
|
407 /// \brief Gives back the first undirected edge in the iterating |
|
408 /// order. |
|
409 /// |
|
410 /// Gives back the first undirected edge in the iterating order. |
|
411 /// |
|
412 void first(UEdge&) const {} |
|
413 |
|
414 /// \brief Gives back the next undirected edge in the iterating |
|
415 /// order. |
|
416 /// |
|
417 /// Gives back the next undirected edge in the iterating order. |
|
418 /// |
|
419 void next(UEdge&) const {} |
|
420 |
|
421 |
|
422 /// \brief Gives back the first of the undirected edges from the |
|
423 /// given node. |
|
424 /// |
|
425 /// Gives back the first of the undirected edges from the given |
|
426 /// node. The bool parameter gives back that direction which |
|
427 /// gives a good direction of the uedge so the source of the |
|
428 /// directed edge is the given node. |
|
429 void firstInc(UEdge&, bool&, const Node&) const {} |
|
430 |
|
431 /// \brief Gives back the next of the undirected edges from the |
|
432 /// given node. |
|
433 /// |
|
434 /// Gives back the next of the undirected edges from the given |
|
435 /// node. The bool parameter should be used as the \c firstInc() |
|
436 /// use it. |
|
437 void nextInc(UEdge&, bool&) const {} |
|
438 |
|
439 template <typename _Graph> |
|
440 struct Constraints { |
|
441 |
|
442 void constraints() { |
|
443 checkConcept<Base, _Graph >(); |
|
444 checkConcept<BaseIterableGraphComponent<Base>, _Graph>(); |
|
445 typename _Graph::Node node; |
|
446 typename _Graph::UEdge uedge; |
|
447 bool dir; |
|
448 { |
|
449 graph.first(uedge); |
|
450 graph.next(uedge); |
|
451 } |
|
452 { |
|
453 graph.firstInc(uedge, dir, node); |
|
454 graph.nextInc(uedge, dir); |
|
455 } |
|
456 } |
|
457 |
|
458 const _Graph& graph; |
|
459 }; |
|
460 }; |
|
461 |
|
462 /// \brief An empty idable base graph class. |
|
463 /// |
|
464 /// This class provides beside the core graph features |
|
465 /// core id functions for the graph structure. |
|
466 /// The most of the base graphs should be conform to this concept. |
|
467 /// The id's are unique and immutable. |
|
468 template <typename _Base = BaseGraphComponent> |
|
469 class IDableGraphComponent : public _Base { |
|
470 public: |
|
471 |
|
472 typedef _Base Base; |
|
473 typedef typename Base::Node Node; |
|
474 typedef typename Base::Edge Edge; |
|
475 |
|
476 /// \brief Gives back an unique integer id for the Node. |
|
477 /// |
|
478 /// Gives back an unique integer id for the Node. |
|
479 /// |
|
480 int id(const Node&) const { return -1;} |
|
481 |
|
482 /// \brief Gives back the node by the unique id. |
|
483 /// |
|
484 /// Gives back the node by the unique id. |
|
485 /// If the graph does not contain node with the given id |
|
486 /// then the result of the function is undetermined. |
|
487 Node nodeFromId(int) const { return INVALID;} |
|
488 |
|
489 /// \brief Gives back an unique integer id for the Edge. |
|
490 /// |
|
491 /// Gives back an unique integer id for the Edge. |
|
492 /// |
|
493 int id(const Edge&) const { return -1;} |
|
494 |
|
495 /// \brief Gives back the edge by the unique id. |
|
496 /// |
|
497 /// Gives back the edge by the unique id. |
|
498 /// If the graph does not contain edge with the given id |
|
499 /// then the result of the function is undetermined. |
|
500 Edge edgeFromId(int) const { return INVALID;} |
|
501 |
|
502 /// \brief Gives back an integer greater or equal to the maximum |
|
503 /// Node id. |
|
504 /// |
|
505 /// Gives back an integer greater or equal to the maximum Node |
|
506 /// id. |
|
507 int maxNodeId() const { return -1;} |
|
508 |
|
509 /// \brief Gives back an integer greater or equal to the maximum |
|
510 /// Edge id. |
|
511 /// |
|
512 /// Gives back an integer greater or equal to the maximum Edge |
|
513 /// id. |
|
514 int maxEdgeId() const { return -1;} |
|
515 |
|
516 template <typename _Graph> |
|
517 struct Constraints { |
|
518 |
|
519 void constraints() { |
|
520 checkConcept< BaseGraphComponent, _Graph >(); |
|
521 typename _Graph::Node node; |
|
522 int nid = graph.id(node); |
|
523 nid = graph.id(node); |
|
524 node = graph.nodeFromId(nid); |
|
525 typename _Graph::Edge edge; |
|
526 int eid = graph.id(edge); |
|
527 eid = graph.id(edge); |
|
528 edge = graph.edgeFromId(eid); |
|
529 |
|
530 nid = graph.maxNodeId(); |
|
531 ignore_unused_variable_warning(nid); |
|
532 eid = graph.maxEdgeId(); |
|
533 ignore_unused_variable_warning(eid); |
|
534 } |
|
535 |
|
536 const _Graph& graph; |
|
537 }; |
|
538 }; |
|
539 |
|
540 /// \brief An empty idable base undirected graph class. |
|
541 /// |
|
542 /// This class provides beside the core undirected graph features |
|
543 /// core id functions for the undirected graph structure. The |
|
544 /// most of the base undirected graphs should be conform to this |
|
545 /// concept. The id's are unique and immutable. |
|
546 template <typename _Base = BaseUGraphComponent> |
|
547 class IDableUGraphComponent : public IDableGraphComponent<_Base> { |
|
548 public: |
|
549 |
|
550 typedef _Base Base; |
|
551 typedef typename Base::UEdge UEdge; |
|
552 |
|
553 using IDableGraphComponent<_Base>::id; |
|
554 |
|
555 /// \brief Gives back an unique integer id for the UEdge. |
|
556 /// |
|
557 /// Gives back an unique integer id for the UEdge. |
|
558 /// |
|
559 int id(const UEdge&) const { return -1;} |
|
560 |
|
561 /// \brief Gives back the undirected edge by the unique id. |
|
562 /// |
|
563 /// Gives back the undirected edge by the unique id. If the |
|
564 /// graph does not contain edge with the given id then the |
|
565 /// result of the function is undetermined. |
|
566 UEdge uEdgeFromId(int) const { return INVALID;} |
|
567 |
|
568 /// \brief Gives back an integer greater or equal to the maximum |
|
569 /// UEdge id. |
|
570 /// |
|
571 /// Gives back an integer greater or equal to the maximum UEdge |
|
572 /// id. |
|
573 int maxUEdgeId() const { return -1;} |
|
574 |
|
575 template <typename _Graph> |
|
576 struct Constraints { |
|
577 |
|
578 void constraints() { |
|
579 checkConcept<Base, _Graph >(); |
|
580 checkConcept<IDableGraphComponent<Base>, _Graph >(); |
|
581 typename _Graph::UEdge uedge; |
|
582 int ueid = graph.id(uedge); |
|
583 ueid = graph.id(uedge); |
|
584 uedge = graph.uEdgeFromId(ueid); |
|
585 ueid = graph.maxUEdgeId(); |
|
586 ignore_unused_variable_warning(ueid); |
|
587 } |
|
588 |
|
589 const _Graph& graph; |
|
590 }; |
|
591 }; |
|
592 |
|
593 /// \brief An empty extendable base graph class. |
|
594 /// |
|
595 /// This class provides beside the core graph features |
|
596 /// core graph extend interface for the graph structure. |
|
597 /// The most of the base graphs should be conform to this concept. |
|
598 template <typename _Base = BaseGraphComponent> |
|
599 class BaseExtendableGraphComponent : public _Base { |
|
600 public: |
|
601 |
|
602 typedef typename _Base::Node Node; |
|
603 typedef typename _Base::Edge Edge; |
|
604 |
|
605 /// \brief Adds a new node to the graph. |
|
606 /// |
|
607 /// Adds a new node to the graph. |
|
608 /// |
|
609 Node addNode() { |
|
610 return INVALID; |
|
611 } |
|
612 |
|
613 /// \brief Adds a new edge connects the given two nodes. |
|
614 /// |
|
615 /// Adds a new edge connects the the given two nodes. |
|
616 Edge addEdge(const Node&, const Node&) { |
|
617 return INVALID; |
|
618 } |
|
619 |
|
620 template <typename _Graph> |
|
621 struct Constraints { |
|
622 void constraints() { |
|
623 typename _Graph::Node node_a, node_b; |
|
624 node_a = graph.addNode(); |
|
625 node_b = graph.addNode(); |
|
626 typename _Graph::Edge edge; |
|
627 edge = graph.addEdge(node_a, node_b); |
|
628 } |
|
629 |
|
630 _Graph& graph; |
|
631 }; |
|
632 }; |
|
633 |
|
634 /// \brief An empty extendable base undirected graph class. |
|
635 /// |
|
636 /// This class provides beside the core undirected graph features |
|
637 /// core undircted graph extend interface for the graph structure. |
|
638 /// The most of the base graphs should be conform to this concept. |
|
639 template <typename _Base = BaseUGraphComponent> |
|
640 class BaseExtendableUGraphComponent : public _Base { |
|
641 public: |
|
642 |
|
643 typedef typename _Base::Node Node; |
|
644 typedef typename _Base::UEdge UEdge; |
|
645 |
|
646 /// \brief Adds a new node to the graph. |
|
647 /// |
|
648 /// Adds a new node to the graph. |
|
649 /// |
|
650 Node addNode() { |
|
651 return INVALID; |
|
652 } |
|
653 |
|
654 /// \brief Adds a new edge connects the given two nodes. |
|
655 /// |
|
656 /// Adds a new edge connects the the given two nodes. |
|
657 UEdge addEdge(const Node&, const Node&) { |
|
658 return INVALID; |
|
659 } |
|
660 |
|
661 template <typename _Graph> |
|
662 struct Constraints { |
|
663 void constraints() { |
|
664 typename _Graph::Node node_a, node_b; |
|
665 node_a = graph.addNode(); |
|
666 node_b = graph.addNode(); |
|
667 typename _Graph::UEdge uedge; |
|
668 uedge = graph.addUEdge(node_a, node_b); |
|
669 } |
|
670 |
|
671 _Graph& graph; |
|
672 }; |
|
673 }; |
|
674 |
|
675 /// \brief An empty erasable base graph class. |
|
676 /// |
|
677 /// This class provides beside the core graph features |
|
678 /// core erase functions for the graph structure. |
|
679 /// The most of the base graphs should be conform to this concept. |
|
680 template <typename _Base = BaseGraphComponent> |
|
681 class BaseErasableGraphComponent : public _Base { |
|
682 public: |
|
683 |
|
684 typedef _Base Base; |
|
685 typedef typename Base::Node Node; |
|
686 typedef typename Base::Edge Edge; |
|
687 |
|
688 /// \brief Erase a node from the graph. |
|
689 /// |
|
690 /// Erase a node from the graph. This function should not |
|
691 /// erase edges connecting to the Node. |
|
692 void erase(const Node&) {} |
|
693 |
|
694 /// \brief Erase an edge from the graph. |
|
695 /// |
|
696 /// Erase an edge from the graph. |
|
697 /// |
|
698 void erase(const Edge&) {} |
|
699 |
|
700 template <typename _Graph> |
|
701 struct Constraints { |
|
702 void constraints() { |
|
703 typename _Graph::Node node; |
|
704 graph.erase(node); |
|
705 typename _Graph::Edge edge; |
|
706 graph.erase(edge); |
|
707 } |
|
708 |
|
709 _Graph& graph; |
|
710 }; |
|
711 }; |
|
712 |
|
713 /// \brief An empty erasable base undirected graph class. |
|
714 /// |
|
715 /// This class provides beside the core undirected graph features |
|
716 /// core erase functions for the undirceted graph structure. |
|
717 template <typename _Base = BaseUGraphComponent> |
|
718 class BaseErasableUGraphComponent : public _Base { |
|
719 public: |
|
720 |
|
721 typedef _Base Base; |
|
722 typedef typename Base::Node Node; |
|
723 typedef typename Base::UEdge UEdge; |
|
724 |
|
725 /// \brief Erase a node from the graph. |
|
726 /// |
|
727 /// Erase a node from the graph. This function should not |
|
728 /// erase edges connecting to the Node. |
|
729 void erase(const Node&) {} |
|
730 |
|
731 /// \brief Erase an edge from the graph. |
|
732 /// |
|
733 /// Erase an edge from the graph. |
|
734 /// |
|
735 void erase(const UEdge&) {} |
|
736 |
|
737 template <typename _Graph> |
|
738 struct Constraints { |
|
739 void constraints() { |
|
740 typename _Graph::Node node; |
|
741 graph.erase(node); |
|
742 typename _Graph::Edge edge; |
|
743 graph.erase(edge); |
|
744 } |
|
745 |
|
746 _Graph& graph; |
|
747 }; |
|
748 }; |
|
749 |
|
750 /// \brief An empty clearable base graph class. |
|
751 /// |
|
752 /// This class provides beside the core graph features |
|
753 /// core clear functions for the graph structure. |
|
754 /// The most of the base graphs should be conform to this concept. |
|
755 template <typename _Base = BaseGraphComponent> |
|
756 class BaseClearableGraphComponent : public _Base { |
|
757 public: |
|
758 |
|
759 /// \brief Erase all the nodes and edges from the graph. |
|
760 /// |
|
761 /// Erase all the nodes and edges from the graph. |
|
762 /// |
|
763 void clear() {} |
|
764 |
|
765 template <typename _Graph> |
|
766 struct Constraints { |
|
767 void constraints() { |
|
768 graph.clear(); |
|
769 } |
|
770 |
|
771 _Graph graph; |
|
772 }; |
|
773 }; |
|
774 |
|
775 /// \brief An empty clearable base undirected graph class. |
|
776 /// |
|
777 /// This class provides beside the core undirected graph features |
|
778 /// core clear functions for the undirected graph structure. |
|
779 /// The most of the base graphs should be conform to this concept. |
|
780 template <typename _Base = BaseUGraphComponent> |
|
781 class BaseClearableUGraphComponent : public _Base { |
|
782 public: |
|
783 |
|
784 /// \brief Erase all the nodes and undirected edges from the graph. |
|
785 /// |
|
786 /// Erase all the nodes and undirected edges from the graph. |
|
787 /// |
|
788 void clear() {} |
|
789 |
|
790 template <typename _Graph> |
|
791 struct Constraints { |
|
792 void constraints() { |
|
793 graph.clear(); |
|
794 } |
|
795 |
|
796 _Graph graph; |
|
797 }; |
|
798 }; |
|
799 |
|
800 |
|
801 /// \brief Skeleton class for graph NodeIt and EdgeIt |
|
802 /// |
|
803 /// Skeleton class for graph NodeIt and EdgeIt. |
|
804 /// |
|
805 template <typename _Graph, typename _Item> |
|
806 class GraphItemIt : public _Item { |
|
807 public: |
|
808 /// \brief Default constructor. |
|
809 /// |
|
810 /// @warning The default constructor sets the iterator |
|
811 /// to an undefined value. |
|
812 GraphItemIt() {} |
|
813 /// \brief Copy constructor. |
|
814 /// |
|
815 /// Copy constructor. |
|
816 /// |
|
817 GraphItemIt(const GraphItemIt& ) {} |
|
818 /// \brief Sets the iterator to the first item. |
|
819 /// |
|
820 /// Sets the iterator to the first item of \c the graph. |
|
821 /// |
|
822 explicit GraphItemIt(const _Graph&) {} |
|
823 /// \brief Invalid constructor \& conversion. |
|
824 /// |
|
825 /// This constructor initializes the item to be invalid. |
|
826 /// \sa Invalid for more details. |
|
827 GraphItemIt(Invalid) {} |
|
828 /// \brief Assign operator for items. |
|
829 /// |
|
830 /// The items are assignable. |
|
831 /// |
|
832 GraphItemIt& operator=(const GraphItemIt&) { return *this; } |
|
833 /// \brief Next item. |
|
834 /// |
|
835 /// Assign the iterator to the next item. |
|
836 /// |
|
837 GraphItemIt& operator++() { return *this; } |
|
838 /// \brief Equality operator |
|
839 /// |
|
840 /// Two iterators are equal if and only if they point to the |
|
841 /// same object or both are invalid. |
|
842 bool operator==(const GraphItemIt&) const { return true;} |
|
843 /// \brief Inequality operator |
|
844 /// |
|
845 /// \sa operator==(Node n) |
|
846 /// |
|
847 bool operator!=(const GraphItemIt&) const { return true;} |
|
848 |
|
849 template<typename _GraphItemIt> |
|
850 struct Constraints { |
|
851 void constraints() { |
|
852 _GraphItemIt it1(g); |
|
853 _GraphItemIt it2; |
|
854 |
|
855 it2 = ++it1; |
|
856 ++it2 = it1; |
|
857 ++(++it1); |
|
858 |
|
859 _Item bi = it1; |
|
860 bi = it2; |
|
861 } |
|
862 _Graph& g; |
|
863 }; |
|
864 }; |
|
865 |
|
866 /// \brief Skeleton class for graph InEdgeIt and OutEdgeIt |
|
867 /// |
|
868 /// \note Because InEdgeIt and OutEdgeIt may not inherit from the same |
|
869 /// base class, the _selector is a additional template parameter. For |
|
870 /// InEdgeIt you should instantiate it with character 'i' and for |
|
871 /// OutEdgeIt with 'o'. |
|
872 template <typename _Graph, |
|
873 typename _Item = typename _Graph::Edge, |
|
874 typename _Base = typename _Graph::Node, |
|
875 char _selector = '0'> |
|
876 class GraphIncIt : public _Item { |
|
877 public: |
|
878 /// \brief Default constructor. |
|
879 /// |
|
880 /// @warning The default constructor sets the iterator |
|
881 /// to an undefined value. |
|
882 GraphIncIt() {} |
|
883 /// \brief Copy constructor. |
|
884 /// |
|
885 /// Copy constructor. |
|
886 /// |
|
887 GraphIncIt(GraphIncIt const& gi) : _Item(gi) {} |
|
888 /// \brief Sets the iterator to the first edge incoming into or outgoing |
|
889 /// from the node. |
|
890 /// |
|
891 /// Sets the iterator to the first edge incoming into or outgoing |
|
892 /// from the node. |
|
893 /// |
|
894 explicit GraphIncIt(const _Graph&, const _Base&) {} |
|
895 /// \brief Invalid constructor \& conversion. |
|
896 /// |
|
897 /// This constructor initializes the item to be invalid. |
|
898 /// \sa Invalid for more details. |
|
899 GraphIncIt(Invalid) {} |
|
900 /// \brief Assign operator for iterators. |
|
901 /// |
|
902 /// The iterators are assignable. |
|
903 /// |
|
904 GraphIncIt& operator=(GraphIncIt const&) { return *this; } |
|
905 /// \brief Next item. |
|
906 /// |
|
907 /// Assign the iterator to the next item. |
|
908 /// |
|
909 GraphIncIt& operator++() { return *this; } |
|
910 |
|
911 /// \brief Equality operator |
|
912 /// |
|
913 /// Two iterators are equal if and only if they point to the |
|
914 /// same object or both are invalid. |
|
915 bool operator==(const GraphIncIt&) const { return true;} |
|
916 |
|
917 /// \brief Inequality operator |
|
918 /// |
|
919 /// \sa operator==(Node n) |
|
920 /// |
|
921 bool operator!=(const GraphIncIt&) const { return true;} |
|
922 |
|
923 template <typename _GraphIncIt> |
|
924 struct Constraints { |
|
925 void constraints() { |
|
926 checkConcept<GraphItem<_selector>, _GraphIncIt>(); |
|
927 _GraphIncIt it1(graph, node); |
|
928 _GraphIncIt it2; |
|
929 |
|
930 it2 = ++it1; |
|
931 ++it2 = it1; |
|
932 ++(++it1); |
|
933 _Item e = it1; |
|
934 e = it2; |
|
935 |
|
936 } |
|
937 |
|
938 _Item edge; |
|
939 _Base node; |
|
940 _Graph graph; |
|
941 _GraphIncIt it; |
|
942 }; |
|
943 }; |
|
944 |
|
945 |
|
946 /// \brief An empty iterable graph class. |
|
947 /// |
|
948 /// This class provides beside the core graph features |
|
949 /// iterator based iterable interface for the graph structure. |
|
950 /// This concept is part of the GraphConcept. |
|
951 template <typename _Base = BaseGraphComponent> |
|
952 class IterableGraphComponent : public _Base { |
|
953 |
|
954 public: |
|
955 |
|
956 typedef _Base Base; |
|
957 typedef typename Base::Node Node; |
|
958 typedef typename Base::Edge Edge; |
|
959 |
|
960 typedef IterableGraphComponent Graph; |
|
961 |
|
962 |
|
963 /// \brief This iterator goes through each node. |
|
964 /// |
|
965 /// This iterator goes through each node. |
|
966 /// |
|
967 typedef GraphItemIt<Graph, Node> NodeIt; |
|
968 |
|
969 /// \brief This iterator goes through each node. |
|
970 /// |
|
971 /// This iterator goes through each node. |
|
972 /// |
|
973 typedef GraphItemIt<Graph, Edge> EdgeIt; |
|
974 |
|
975 /// \brief This iterator goes trough the incoming edges of a node. |
|
976 /// |
|
977 /// This iterator goes trough the \e inccoming edges of a certain node |
|
978 /// of a graph. |
|
979 typedef GraphIncIt<Graph, Edge, Node, 'i'> InEdgeIt; |
|
980 |
|
981 /// \brief This iterator goes trough the outgoing edges of a node. |
|
982 /// |
|
983 /// This iterator goes trough the \e outgoing edges of a certain node |
|
984 /// of a graph. |
|
985 typedef GraphIncIt<Graph, Edge, Node, 'o'> OutEdgeIt; |
|
986 |
|
987 /// \brief The base node of the iterator. |
|
988 /// |
|
989 /// Gives back the base node of the iterator. |
|
990 /// It is always the target of the pointed edge. |
|
991 Node baseNode(const InEdgeIt&) const { return INVALID; } |
|
992 |
|
993 /// \brief The running node of the iterator. |
|
994 /// |
|
995 /// Gives back the running node of the iterator. |
|
996 /// It is always the source of the pointed edge. |
|
997 Node runningNode(const InEdgeIt&) const { return INVALID; } |
|
998 |
|
999 /// \brief The base node of the iterator. |
|
1000 /// |
|
1001 /// Gives back the base node of the iterator. |
|
1002 /// It is always the source of the pointed edge. |
|
1003 Node baseNode(const OutEdgeIt&) const { return INVALID; } |
|
1004 |
|
1005 /// \brief The running node of the iterator. |
|
1006 /// |
|
1007 /// Gives back the running node of the iterator. |
|
1008 /// It is always the target of the pointed edge. |
|
1009 Node runningNode(const OutEdgeIt&) const { return INVALID; } |
|
1010 |
|
1011 /// \brief The opposite node on the given edge. |
|
1012 /// |
|
1013 /// Gives back the opposite on the given edge. |
|
1014 /// \todo It should not be here. |
|
1015 Node oppositeNode(const Node&, const Edge&) const { return INVALID; } |
|
1016 |
|
1017 |
|
1018 template <typename _Graph> |
|
1019 struct Constraints { |
|
1020 void constraints() { |
|
1021 checkConcept<Base, _Graph>(); |
|
1022 |
|
1023 checkConcept<GraphItemIt<_Graph, typename _Graph::Edge>, |
|
1024 typename _Graph::EdgeIt >(); |
|
1025 checkConcept<GraphItemIt<_Graph, typename _Graph::Node>, |
|
1026 typename _Graph::NodeIt >(); |
|
1027 checkConcept<GraphIncIt<_Graph, typename _Graph::Edge, |
|
1028 typename _Graph::Node, 'i'>, typename _Graph::InEdgeIt>(); |
|
1029 checkConcept<GraphIncIt<_Graph, typename _Graph::Edge, |
|
1030 typename _Graph::Node, 'o'>, typename _Graph::OutEdgeIt>(); |
|
1031 |
|
1032 typename _Graph::Node n; |
|
1033 typename _Graph::InEdgeIt ieit(INVALID); |
|
1034 typename _Graph::OutEdgeIt oeit(INVALID); |
|
1035 n = graph.baseNode(ieit); |
|
1036 n = graph.runningNode(ieit); |
|
1037 n = graph.baseNode(oeit); |
|
1038 n = graph.runningNode(oeit); |
|
1039 ignore_unused_variable_warning(n); |
|
1040 } |
|
1041 |
|
1042 const _Graph& graph; |
|
1043 |
|
1044 }; |
|
1045 }; |
|
1046 |
|
1047 /// \brief An empty iterable undirected graph class. |
|
1048 /// |
|
1049 /// This class provides beside the core graph features iterator |
|
1050 /// based iterable interface for the undirected graph structure. |
|
1051 /// This concept is part of the GraphConcept. |
|
1052 template <typename _Base = BaseUGraphComponent> |
|
1053 class IterableUGraphComponent : public IterableGraphComponent<_Base> { |
|
1054 public: |
|
1055 |
|
1056 typedef _Base Base; |
|
1057 typedef typename Base::Node Node; |
|
1058 typedef typename Base::Edge Edge; |
|
1059 typedef typename Base::UEdge UEdge; |
|
1060 |
|
1061 |
|
1062 typedef IterableUGraphComponent Graph; |
|
1063 using IterableGraphComponent<_Base>::baseNode; |
|
1064 using IterableGraphComponent<_Base>::runningNode; |
|
1065 |
|
1066 |
|
1067 /// \brief This iterator goes through each node. |
|
1068 /// |
|
1069 /// This iterator goes through each node. |
|
1070 typedef GraphItemIt<Graph, UEdge> UEdgeIt; |
|
1071 /// \brief This iterator goes trough the incident edges of a |
|
1072 /// node. |
|
1073 /// |
|
1074 /// This iterator goes trough the incident edges of a certain |
|
1075 /// node of a graph. |
|
1076 typedef GraphIncIt<Graph, UEdge, Node, 'u'> IncEdgeIt; |
|
1077 /// \brief The base node of the iterator. |
|
1078 /// |
|
1079 /// Gives back the base node of the iterator. |
|
1080 Node baseNode(const IncEdgeIt&) const { return INVALID; } |
|
1081 |
|
1082 /// \brief The running node of the iterator. |
|
1083 /// |
|
1084 /// Gives back the running node of the iterator. |
|
1085 Node runningNode(const IncEdgeIt&) const { return INVALID; } |
|
1086 |
|
1087 template <typename _Graph> |
|
1088 struct Constraints { |
|
1089 void constraints() { |
|
1090 checkConcept<Base, _Graph>(); |
|
1091 checkConcept<IterableGraphComponent<Base>, _Graph>(); |
|
1092 |
|
1093 checkConcept<GraphItemIt<_Graph, typename _Graph::UEdge>, |
|
1094 typename _Graph::UEdgeIt >(); |
|
1095 checkConcept<GraphIncIt<_Graph, typename _Graph::UEdge, |
|
1096 typename _Graph::Node, 'u'>, typename _Graph::IncEdgeIt>(); |
|
1097 |
|
1098 typename _Graph::Node n; |
|
1099 typename _Graph::IncEdgeIt ueit(INVALID); |
|
1100 n = graph.baseNode(ueit); |
|
1101 n = graph.runningNode(ueit); |
|
1102 } |
|
1103 |
|
1104 const _Graph& graph; |
|
1105 |
|
1106 }; |
|
1107 }; |
|
1108 |
|
1109 /// \brief An empty alteration notifier graph class. |
|
1110 /// |
|
1111 /// This class provides beside the core graph features alteration |
|
1112 /// notifier interface for the graph structure. This implements |
|
1113 /// an observer-notifier pattern for each graph item. More |
|
1114 /// obsevers can be registered into the notifier and whenever an |
|
1115 /// alteration occured in the graph all the observers will |
|
1116 /// notified about it. |
|
1117 template <typename _Base = BaseGraphComponent> |
|
1118 class AlterableGraphComponent : public _Base { |
|
1119 public: |
|
1120 |
|
1121 typedef _Base Base; |
|
1122 typedef typename Base::Node Node; |
|
1123 typedef typename Base::Edge Edge; |
|
1124 |
|
1125 |
|
1126 /// The node observer registry. |
|
1127 typedef AlterationNotifier<AlterableGraphComponent, Node> |
|
1128 NodeNotifier; |
|
1129 /// The edge observer registry. |
|
1130 typedef AlterationNotifier<AlterableGraphComponent, Edge> |
|
1131 EdgeNotifier; |
|
1132 |
|
1133 /// \brief Gives back the node alteration notifier. |
|
1134 /// |
|
1135 /// Gives back the node alteration notifier. |
|
1136 NodeNotifier& getNotifier(Node) const { |
|
1137 return NodeNotifier(); |
|
1138 } |
|
1139 |
|
1140 /// \brief Gives back the edge alteration notifier. |
|
1141 /// |
|
1142 /// Gives back the edge alteration notifier. |
|
1143 EdgeNotifier& getNotifier(Edge) const { |
|
1144 return EdgeNotifier(); |
|
1145 } |
|
1146 |
|
1147 template <typename _Graph> |
|
1148 struct Constraints { |
|
1149 void constraints() { |
|
1150 checkConcept<Base, _Graph>(); |
|
1151 typename _Graph::NodeNotifier& nn |
|
1152 = graph.getNotifier(typename _Graph::Node()); |
|
1153 |
|
1154 typename _Graph::EdgeNotifier& en |
|
1155 = graph.getNotifier(typename _Graph::Edge()); |
|
1156 |
|
1157 ignore_unused_variable_warning(nn); |
|
1158 ignore_unused_variable_warning(en); |
|
1159 } |
|
1160 |
|
1161 const _Graph& graph; |
|
1162 |
|
1163 }; |
|
1164 |
|
1165 }; |
|
1166 |
|
1167 /// \brief An empty alteration notifier undirected graph class. |
|
1168 /// |
|
1169 /// This class provides beside the core graph features alteration |
|
1170 /// notifier interface for the graph structure. This implements |
|
1171 /// an observer-notifier pattern for each graph item. More |
|
1172 /// obsevers can be registered into the notifier and whenever an |
|
1173 /// alteration occured in the graph all the observers will |
|
1174 /// notified about it. |
|
1175 template <typename _Base = BaseUGraphComponent> |
|
1176 class AlterableUGraphComponent : public AlterableGraphComponent<_Base> { |
|
1177 public: |
|
1178 |
|
1179 typedef _Base Base; |
|
1180 typedef typename Base::UEdge UEdge; |
|
1181 |
|
1182 |
|
1183 /// The edge observer registry. |
|
1184 typedef AlterationNotifier<AlterableUGraphComponent, UEdge> |
|
1185 UEdgeNotifier; |
|
1186 |
|
1187 /// \brief Gives back the edge alteration notifier. |
|
1188 /// |
|
1189 /// Gives back the edge alteration notifier. |
|
1190 UEdgeNotifier& getNotifier(UEdge) const { |
|
1191 return UEdgeNotifier(); |
|
1192 } |
|
1193 |
|
1194 template <typename _Graph> |
|
1195 struct Constraints { |
|
1196 void constraints() { |
|
1197 checkConcept<Base, _Graph>(); |
|
1198 checkConcept<AlterableGraphComponent, _Graph>(); |
|
1199 typename _Graph::UEdgeNotifier& uen |
|
1200 = graph.getNotifier(typename _Graph::UEdge()); |
|
1201 ignore_unused_variable_warning(uen); |
|
1202 } |
|
1203 |
|
1204 const _Graph& graph; |
|
1205 |
|
1206 }; |
|
1207 |
|
1208 }; |
|
1209 |
|
1210 |
|
1211 /// \brief Class describing the concept of graph maps |
|
1212 /// |
|
1213 /// This class describes the common interface of the graph maps |
|
1214 /// (NodeMap, EdgeMap), that is \ref maps-page "maps" which can be used to |
|
1215 /// associate data to graph descriptors (nodes or edges). |
|
1216 template <typename _Graph, typename _Item, typename _Value> |
|
1217 class GraphMap : public ReadWriteMap<_Item, _Value> { |
|
1218 public: |
|
1219 |
|
1220 typedef ReadWriteMap<_Item, _Value> Parent; |
|
1221 |
|
1222 /// The graph type of the map. |
|
1223 typedef _Graph Graph; |
|
1224 /// The key type of the map. |
|
1225 typedef _Item Key; |
|
1226 /// The value type of the map. |
|
1227 typedef _Value Value; |
|
1228 |
|
1229 /// \brief Construct a new map. |
|
1230 /// |
|
1231 /// Construct a new map for the graph. |
|
1232 explicit GraphMap(const Graph&) {} |
|
1233 /// \brief Construct a new map with default value. |
|
1234 /// |
|
1235 /// Construct a new map for the graph and initalise the values. |
|
1236 GraphMap(const Graph&, const Value&) {} |
|
1237 /// \brief Copy constructor. |
|
1238 /// |
|
1239 /// Copy Constructor. |
|
1240 GraphMap(const GraphMap&) : Parent() {} |
|
1241 |
|
1242 /// \brief Assign operator. |
|
1243 /// |
|
1244 /// Assign operator. It does not mofify the underlying graph, |
|
1245 /// it just iterates on the current item set and set the map |
|
1246 /// with the value returned by the assigned map. |
|
1247 template <typename CMap> |
|
1248 GraphMap& operator=(const CMap&) { |
|
1249 checkConcept<ReadMap<Key, Value>, CMap>(); |
|
1250 return *this; |
|
1251 } |
|
1252 |
|
1253 template<typename _Map> |
|
1254 struct Constraints { |
|
1255 void constraints() { |
|
1256 checkConcept<ReadWriteMap<Key, Value>, _Map >(); |
|
1257 // Construction with a graph parameter |
|
1258 _Map a(g); |
|
1259 // Constructor with a graph and a default value parameter |
|
1260 _Map a2(g,t); |
|
1261 // Copy constructor. |
|
1262 _Map b(c); |
|
1263 |
|
1264 ReadMap<Key, Value> cmap; |
|
1265 b = cmap; |
|
1266 |
|
1267 ignore_unused_variable_warning(a2); |
|
1268 ignore_unused_variable_warning(b); |
|
1269 } |
|
1270 |
|
1271 const _Map &c; |
|
1272 const Graph &g; |
|
1273 const typename GraphMap::Value &t; |
|
1274 }; |
|
1275 |
|
1276 }; |
|
1277 |
|
1278 /// \brief An empty mappable graph class. |
|
1279 /// |
|
1280 /// This class provides beside the core graph features |
|
1281 /// map interface for the graph structure. |
|
1282 /// This concept is part of the Graph concept. |
|
1283 template <typename _Base = BaseGraphComponent> |
|
1284 class MappableGraphComponent : public _Base { |
|
1285 public: |
|
1286 |
|
1287 typedef _Base Base; |
|
1288 typedef typename Base::Node Node; |
|
1289 typedef typename Base::Edge Edge; |
|
1290 |
|
1291 typedef MappableGraphComponent Graph; |
|
1292 |
|
1293 /// \brief ReadWrite map of the nodes. |
|
1294 /// |
|
1295 /// ReadWrite map of the nodes. |
|
1296 /// |
|
1297 template <typename Value> |
|
1298 class NodeMap : public GraphMap<Graph, Node, Value> { |
|
1299 private: |
|
1300 NodeMap(); |
|
1301 public: |
|
1302 typedef GraphMap<Graph, Node, Value> Parent; |
|
1303 |
|
1304 /// \brief Construct a new map. |
|
1305 /// |
|
1306 /// Construct a new map for the graph. |
|
1307 /// \todo call the right parent class constructor |
|
1308 explicit NodeMap(const Graph& graph) : Parent(graph) {} |
|
1309 |
|
1310 /// \brief Construct a new map with default value. |
|
1311 /// |
|
1312 /// Construct a new map for the graph and initalise the values. |
|
1313 NodeMap(const Graph& graph, const Value& value) |
|
1314 : Parent(graph, value) {} |
|
1315 |
|
1316 /// \brief Copy constructor. |
|
1317 /// |
|
1318 /// Copy Constructor. |
|
1319 NodeMap(const NodeMap& nm) : Parent(nm) {} |
|
1320 |
|
1321 /// \brief Assign operator. |
|
1322 /// |
|
1323 /// Assign operator. |
|
1324 template <typename CMap> |
|
1325 NodeMap& operator=(const CMap&) { |
|
1326 checkConcept<ReadMap<Node, Value>, CMap>(); |
|
1327 return *this; |
|
1328 } |
|
1329 |
|
1330 }; |
|
1331 |
|
1332 /// \brief ReadWrite map of the edges. |
|
1333 /// |
|
1334 /// ReadWrite map of the edges. |
|
1335 /// |
|
1336 template <typename Value> |
|
1337 class EdgeMap : public GraphMap<Graph, Edge, Value> { |
|
1338 private: |
|
1339 EdgeMap(); |
|
1340 public: |
|
1341 typedef GraphMap<Graph, Edge, Value> Parent; |
|
1342 |
|
1343 /// \brief Construct a new map. |
|
1344 /// |
|
1345 /// Construct a new map for the graph. |
|
1346 /// \todo call the right parent class constructor |
|
1347 explicit EdgeMap(const Graph& graph) : Parent(graph) {} |
|
1348 |
|
1349 /// \brief Construct a new map with default value. |
|
1350 /// |
|
1351 /// Construct a new map for the graph and initalise the values. |
|
1352 EdgeMap(const Graph& graph, const Value& value) |
|
1353 : Parent(graph, value) {} |
|
1354 |
|
1355 /// \brief Copy constructor. |
|
1356 /// |
|
1357 /// Copy Constructor. |
|
1358 EdgeMap(const EdgeMap& nm) : Parent(nm) {} |
|
1359 |
|
1360 /// \brief Assign operator. |
|
1361 /// |
|
1362 /// Assign operator. |
|
1363 template <typename CMap> |
|
1364 EdgeMap& operator=(const CMap&) { |
|
1365 checkConcept<ReadMap<Edge, Value>, CMap>(); |
|
1366 return *this; |
|
1367 } |
|
1368 |
|
1369 }; |
|
1370 |
|
1371 |
|
1372 template <typename _Graph> |
|
1373 struct Constraints { |
|
1374 |
|
1375 struct Dummy { |
|
1376 int value; |
|
1377 Dummy() : value(0) {} |
|
1378 Dummy(int _v) : value(_v) {} |
|
1379 }; |
|
1380 |
|
1381 void constraints() { |
|
1382 checkConcept<Base, _Graph>(); |
|
1383 { // int map test |
|
1384 typedef typename _Graph::template NodeMap<int> IntNodeMap; |
|
1385 checkConcept<GraphMap<_Graph, typename _Graph::Node, int>, |
|
1386 IntNodeMap >(); |
|
1387 } { // bool map test |
|
1388 typedef typename _Graph::template NodeMap<bool> BoolNodeMap; |
|
1389 checkConcept<GraphMap<_Graph, typename _Graph::Node, bool>, |
|
1390 BoolNodeMap >(); |
|
1391 } { // Dummy map test |
|
1392 typedef typename _Graph::template NodeMap<Dummy> DummyNodeMap; |
|
1393 checkConcept<GraphMap<_Graph, typename _Graph::Node, Dummy>, |
|
1394 DummyNodeMap >(); |
|
1395 } |
|
1396 |
|
1397 { // int map test |
|
1398 typedef typename _Graph::template EdgeMap<int> IntEdgeMap; |
|
1399 checkConcept<GraphMap<_Graph, typename _Graph::Edge, int>, |
|
1400 IntEdgeMap >(); |
|
1401 } { // bool map test |
|
1402 typedef typename _Graph::template EdgeMap<bool> BoolEdgeMap; |
|
1403 checkConcept<GraphMap<_Graph, typename _Graph::Edge, bool>, |
|
1404 BoolEdgeMap >(); |
|
1405 } { // Dummy map test |
|
1406 typedef typename _Graph::template EdgeMap<Dummy> DummyEdgeMap; |
|
1407 checkConcept<GraphMap<_Graph, typename _Graph::Edge, Dummy>, |
|
1408 DummyEdgeMap >(); |
|
1409 } |
|
1410 } |
|
1411 |
|
1412 _Graph& graph; |
|
1413 }; |
|
1414 }; |
|
1415 |
|
1416 /// \brief An empty mappable base graph class. |
|
1417 /// |
|
1418 /// This class provides beside the core graph features |
|
1419 /// map interface for the graph structure. |
|
1420 /// This concept is part of the UGraph concept. |
|
1421 template <typename _Base = BaseUGraphComponent> |
|
1422 class MappableUGraphComponent : public MappableGraphComponent<_Base> { |
|
1423 public: |
|
1424 |
|
1425 typedef _Base Base; |
|
1426 typedef typename Base::UEdge UEdge; |
|
1427 |
|
1428 typedef MappableUGraphComponent Graph; |
|
1429 |
|
1430 /// \brief ReadWrite map of the uedges. |
|
1431 /// |
|
1432 /// ReadWrite map of the uedges. |
|
1433 /// |
|
1434 template <typename Value> |
|
1435 class UEdgeMap : public GraphMap<Graph, UEdge, Value> { |
|
1436 public: |
|
1437 typedef GraphMap<Graph, UEdge, Value> Parent; |
|
1438 |
|
1439 /// \brief Construct a new map. |
|
1440 /// |
|
1441 /// Construct a new map for the graph. |
|
1442 /// \todo call the right parent class constructor |
|
1443 explicit UEdgeMap(const Graph& graph) : Parent(graph) {} |
|
1444 |
|
1445 /// \brief Construct a new map with default value. |
|
1446 /// |
|
1447 /// Construct a new map for the graph and initalise the values. |
|
1448 UEdgeMap(const Graph& graph, const Value& value) |
|
1449 : Parent(graph, value) {} |
|
1450 |
|
1451 /// \brief Copy constructor. |
|
1452 /// |
|
1453 /// Copy Constructor. |
|
1454 UEdgeMap(const UEdgeMap& nm) : Parent(nm) {} |
|
1455 |
|
1456 /// \brief Assign operator. |
|
1457 /// |
|
1458 /// Assign operator. |
|
1459 template <typename CMap> |
|
1460 UEdgeMap& operator=(const CMap&) { |
|
1461 checkConcept<ReadMap<UEdge, Value>, CMap>(); |
|
1462 return *this; |
|
1463 } |
|
1464 |
|
1465 }; |
|
1466 |
|
1467 |
|
1468 template <typename _Graph> |
|
1469 struct Constraints { |
|
1470 |
|
1471 struct Dummy { |
|
1472 int value; |
|
1473 Dummy() : value(0) {} |
|
1474 Dummy(int _v) : value(_v) {} |
|
1475 }; |
|
1476 |
|
1477 void constraints() { |
|
1478 checkConcept<Base, _Graph>(); |
|
1479 checkConcept<MappableGraphComponent<Base>, _Graph>(); |
|
1480 |
|
1481 { // int map test |
|
1482 typedef typename _Graph::template UEdgeMap<int> IntUEdgeMap; |
|
1483 checkConcept<GraphMap<_Graph, typename _Graph::UEdge, int>, |
|
1484 IntUEdgeMap >(); |
|
1485 } { // bool map test |
|
1486 typedef typename _Graph::template UEdgeMap<bool> BoolUEdgeMap; |
|
1487 checkConcept<GraphMap<_Graph, typename _Graph::UEdge, bool>, |
|
1488 BoolUEdgeMap >(); |
|
1489 } { // Dummy map test |
|
1490 typedef typename _Graph::template UEdgeMap<Dummy> DummyUEdgeMap; |
|
1491 checkConcept<GraphMap<_Graph, typename _Graph::UEdge, Dummy>, |
|
1492 DummyUEdgeMap >(); |
|
1493 } |
|
1494 } |
|
1495 |
|
1496 _Graph& graph; |
|
1497 }; |
|
1498 }; |
|
1499 |
|
1500 |
|
1501 /// \brief An empty extendable graph class. |
|
1502 /// |
|
1503 /// This class provides beside the core graph features graph |
|
1504 /// extendable interface for the graph structure. The main |
|
1505 /// difference between the base and this interface is that the |
|
1506 /// graph alterations should handled already on this level. |
|
1507 template <typename _Base = BaseGraphComponent> |
|
1508 class ExtendableGraphComponent : public _Base { |
|
1509 public: |
|
1510 |
|
1511 typedef typename _Base::Node Node; |
|
1512 typedef typename _Base::Edge Edge; |
|
1513 |
|
1514 /// \brief Adds a new node to the graph. |
|
1515 /// |
|
1516 /// Adds a new node to the graph. |
|
1517 /// |
|
1518 Node addNode() { |
|
1519 return INVALID; |
|
1520 } |
|
1521 |
|
1522 /// \brief Adds a new edge connects the given two nodes. |
|
1523 /// |
|
1524 /// Adds a new edge connects the the given two nodes. |
|
1525 Edge addEdge(const Node&, const Node&) { |
|
1526 return INVALID; |
|
1527 } |
|
1528 |
|
1529 template <typename _Graph> |
|
1530 struct Constraints { |
|
1531 void constraints() { |
|
1532 typename _Graph::Node node_a, node_b; |
|
1533 node_a = graph.addNode(); |
|
1534 node_b = graph.addNode(); |
|
1535 typename _Graph::Edge edge; |
|
1536 edge = graph.addEdge(node_a, node_b); |
|
1537 } |
|
1538 |
|
1539 _Graph& graph; |
|
1540 }; |
|
1541 }; |
|
1542 |
|
1543 /// \brief An empty extendable base undirected graph class. |
|
1544 /// |
|
1545 /// This class provides beside the core undirected graph features |
|
1546 /// core undircted graph extend interface for the graph structure. |
|
1547 /// The main difference between the base and this interface is |
|
1548 /// that the graph alterations should handled already on this |
|
1549 /// level. |
|
1550 template <typename _Base = BaseUGraphComponent> |
|
1551 class ExtendableUGraphComponent : public _Base { |
|
1552 public: |
|
1553 |
|
1554 typedef typename _Base::Node Node; |
|
1555 typedef typename _Base::UEdge UEdge; |
|
1556 |
|
1557 /// \brief Adds a new node to the graph. |
|
1558 /// |
|
1559 /// Adds a new node to the graph. |
|
1560 /// |
|
1561 Node addNode() { |
|
1562 return INVALID; |
|
1563 } |
|
1564 |
|
1565 /// \brief Adds a new edge connects the given two nodes. |
|
1566 /// |
|
1567 /// Adds a new edge connects the the given two nodes. |
|
1568 UEdge addEdge(const Node&, const Node&) { |
|
1569 return INVALID; |
|
1570 } |
|
1571 |
|
1572 template <typename _Graph> |
|
1573 struct Constraints { |
|
1574 void constraints() { |
|
1575 typename _Graph::Node node_a, node_b; |
|
1576 node_a = graph.addNode(); |
|
1577 node_b = graph.addNode(); |
|
1578 typename _Graph::UEdge uedge; |
|
1579 uedge = graph.addUEdge(node_a, node_b); |
|
1580 } |
|
1581 |
|
1582 _Graph& graph; |
|
1583 }; |
|
1584 }; |
|
1585 |
|
1586 /// \brief An empty erasable graph class. |
|
1587 /// |
|
1588 /// This class provides beside the core graph features core erase |
|
1589 /// functions for the graph structure. The main difference between |
|
1590 /// the base and this interface is that the graph alterations |
|
1591 /// should handled already on this level. |
|
1592 template <typename _Base = BaseGraphComponent> |
|
1593 class ErasableGraphComponent : public _Base { |
|
1594 public: |
|
1595 |
|
1596 typedef _Base Base; |
|
1597 typedef typename Base::Node Node; |
|
1598 typedef typename Base::Edge Edge; |
|
1599 |
|
1600 /// \brief Erase a node from the graph. |
|
1601 /// |
|
1602 /// Erase a node from the graph. This function should |
|
1603 /// erase all edges connecting to the node. |
|
1604 void erase(const Node&) {} |
|
1605 |
|
1606 /// \brief Erase an edge from the graph. |
|
1607 /// |
|
1608 /// Erase an edge from the graph. |
|
1609 /// |
|
1610 void erase(const Edge&) {} |
|
1611 |
|
1612 template <typename _Graph> |
|
1613 struct Constraints { |
|
1614 void constraints() { |
|
1615 typename _Graph::Node node; |
|
1616 graph.erase(node); |
|
1617 typename _Graph::Edge edge; |
|
1618 graph.erase(edge); |
|
1619 } |
|
1620 |
|
1621 _Graph& graph; |
|
1622 }; |
|
1623 }; |
|
1624 |
|
1625 /// \brief An empty erasable base undirected graph class. |
|
1626 /// |
|
1627 /// This class provides beside the core undirected graph features |
|
1628 /// core erase functions for the undirceted graph structure. The |
|
1629 /// main difference between the base and this interface is that |
|
1630 /// the graph alterations should handled already on this level. |
|
1631 template <typename _Base = BaseUGraphComponent> |
|
1632 class ErasableUGraphComponent : public _Base { |
|
1633 public: |
|
1634 |
|
1635 typedef _Base Base; |
|
1636 typedef typename Base::Node Node; |
|
1637 typedef typename Base::UEdge UEdge; |
|
1638 |
|
1639 /// \brief Erase a node from the graph. |
|
1640 /// |
|
1641 /// Erase a node from the graph. This function should erase |
|
1642 /// edges connecting to the node. |
|
1643 void erase(const Node&) {} |
|
1644 |
|
1645 /// \brief Erase an edge from the graph. |
|
1646 /// |
|
1647 /// Erase an edge from the graph. |
|
1648 /// |
|
1649 void erase(const UEdge&) {} |
|
1650 |
|
1651 template <typename _Graph> |
|
1652 struct Constraints { |
|
1653 void constraints() { |
|
1654 typename _Graph::Node node; |
|
1655 graph.erase(node); |
|
1656 typename _Graph::Edge edge; |
|
1657 graph.erase(edge); |
|
1658 } |
|
1659 |
|
1660 _Graph& graph; |
|
1661 }; |
|
1662 }; |
|
1663 |
|
1664 /// \brief An empty clearable base graph class. |
|
1665 /// |
|
1666 /// This class provides beside the core graph features core clear |
|
1667 /// functions for the graph structure. The main difference between |
|
1668 /// the base and this interface is that the graph alterations |
|
1669 /// should handled already on this level. |
|
1670 template <typename _Base = BaseGraphComponent> |
|
1671 class ClearableGraphComponent : public _Base { |
|
1672 public: |
|
1673 |
|
1674 /// \brief Erase all nodes and edges from the graph. |
|
1675 /// |
|
1676 /// Erase all nodes and edges from the graph. |
|
1677 /// |
|
1678 void clear() {} |
|
1679 |
|
1680 template <typename _Graph> |
|
1681 struct Constraints { |
|
1682 void constraints() { |
|
1683 graph.clear(); |
|
1684 } |
|
1685 |
|
1686 _Graph graph; |
|
1687 }; |
|
1688 }; |
|
1689 |
|
1690 /// \brief An empty clearable base undirected graph class. |
|
1691 /// |
|
1692 /// This class provides beside the core undirected graph features |
|
1693 /// core clear functions for the undirected graph structure. The |
|
1694 /// main difference between the base and this interface is that |
|
1695 /// the graph alterations should handled already on this level. |
|
1696 template <typename _Base = BaseUGraphComponent> |
|
1697 class ClearableUGraphComponent : public _Base { |
|
1698 public: |
|
1699 |
|
1700 /// \brief Erase all nodes and undirected edges from the graph. |
|
1701 /// |
|
1702 /// Erase all nodes and undirected edges from the graph. |
|
1703 /// |
|
1704 void clear() {} |
|
1705 |
|
1706 template <typename _Graph> |
|
1707 struct Constraints { |
|
1708 void constraints() { |
|
1709 graph.clear(); |
|
1710 } |
|
1711 |
|
1712 _Graph graph; |
|
1713 }; |
|
1714 }; |
|
1715 |
|
1716 } |
|
1717 |
|
1718 } |
|
1719 |
|
1720 #endif |