180 { |
164 { |
181 Node n; |
165 Node n; |
182 Edge e(INVALID); |
166 Edge e(INVALID); |
183 n = graph.source(e); |
167 n = graph.source(e); |
184 n = graph.target(e); |
168 n = graph.target(e); |
|
169 n = graph.oppositeNode(n, e); |
185 } |
170 } |
186 } |
171 } |
187 |
172 |
188 const _Graph& graph; |
173 const _Graph& graph; |
189 }; |
174 }; |
190 }; |
175 }; |
191 |
176 |
192 /// An empty iterable base graph class. |
177 /// \brief An empty base undirected graph class. |
193 |
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 /// |
194 /// This class provides beside the core graph features |
295 /// This class provides beside the core graph features |
195 /// core iterable interface for the graph structure. |
296 /// core iterable interface for the graph structure. |
196 /// Most of the base graphs should be conform to this concept. |
297 /// Most of the base graphs should be conform to this concept. |
197 |
298 template <typename _Base = BaseGraphComponent> |
198 class BaseIterableGraphComponent : virtual public BaseGraphComponent { |
299 class BaseIterableGraphComponent : public _Base { |
199 public: |
300 public: |
200 |
301 |
201 typedef BaseGraphComponent::Node Node; |
302 typedef _Base Base; |
202 typedef BaseGraphComponent::Edge Edge; |
303 typedef typename Base::Node Node; |
203 |
304 typedef typename Base::Edge Edge; |
204 /// Gives back the first Node in the iterating order. |
305 |
205 |
306 /// \brief Gives back the first node in the iterating order. |
206 /// Gives back the first Node in the iterating order. |
307 /// |
|
308 /// Gives back the first node in the iterating order. |
207 /// |
309 /// |
208 void first(Node&) const {} |
310 void first(Node&) const {} |
209 |
311 |
210 /// Gives back the next Node in the iterating order. |
312 /// \brief Gives back the next node in the iterating order. |
211 |
313 /// |
212 /// Gives back the next Node in the iterating order. |
314 /// Gives back the next node in the iterating order. |
213 /// |
315 /// |
214 void next(Node&) const {} |
316 void next(Node&) const {} |
215 |
317 |
216 /// Gives back the first Edge in the iterating order. |
318 /// \brief Gives back the first edge in the iterating order. |
217 |
319 /// |
218 /// Gives back the first Edge in the iterating order. |
320 /// Gives back the first edge in the iterating order. |
219 /// |
321 /// |
220 void first(Edge&) const {} |
322 void first(Edge&) const {} |
221 /// Gives back the next Edge in the iterating order. |
323 |
222 |
324 /// \brief Gives back the next edge in the iterating order. |
223 /// Gives back the next Edge in the iterating order. |
325 /// |
|
326 /// Gives back the next edge in the iterating order. |
224 /// |
327 /// |
225 void next(Edge&) const {} |
328 void next(Edge&) const {} |
226 |
329 |
227 |
330 |
228 /// Gives back the first of the Edges point to the given Node. |
331 /// \brief Gives back the first of the edges point to the given |
229 |
332 /// node. |
230 /// Gives back the first of the Edges point to the given Node. |
333 /// |
|
334 /// Gives back the first of the edges point to the given node. |
231 /// |
335 /// |
232 void firstIn(Edge&, const Node&) const {} |
336 void firstIn(Edge&, const Node&) const {} |
233 |
337 |
234 /// Gives back the next of the Edges points to the given Node. |
338 /// \brief Gives back the next of the edges points to the given |
235 |
339 /// node. |
236 |
340 /// |
237 /// Gives back the next of the Edges points to the given Node. |
341 /// Gives back the next of the edges points to the given node. |
238 /// |
342 /// |
239 void nextIn(Edge&) const {} |
343 void nextIn(Edge&) const {} |
240 |
344 |
241 /// Gives back the first of the Edges start from the given Node. |
345 /// \brief Gives back the first of the edges start from the |
242 |
346 /// given node. |
243 /// Gives back the first of the Edges start from the given Node. |
347 /// |
|
348 /// Gives back the first of the edges start from the given node. |
244 /// |
349 /// |
245 void firstOut(Edge&, const Node&) const {} |
350 void firstOut(Edge&, const Node&) const {} |
246 |
351 |
247 /// Gives back the next of the Edges start from the given Node. |
352 /// \brief Gives back the next of the edges start from the given |
248 |
353 /// node. |
249 /// Gives back the next of the Edges start from the given Node. |
354 /// |
|
355 /// Gives back the next of the edges start from the given node. |
250 /// |
356 /// |
251 void nextOut(Edge&) const {} |
357 void nextOut(Edge&) const {} |
252 |
358 |
253 |
359 |
254 template <typename _Graph> |
360 template <typename _Graph> |
314 /// \brief Gives back the edge by the unique id. |
495 /// \brief Gives back the edge by the unique id. |
315 /// |
496 /// |
316 /// Gives back the edge by the unique id. |
497 /// Gives back the edge by the unique id. |
317 /// If the graph does not contain edge with the given id |
498 /// If the graph does not contain edge with the given id |
318 /// then the result of the function is undetermined. |
499 /// then the result of the function is undetermined. |
319 Edge fromId(int, Edge) const { return INVALID;} |
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;} |
320 |
515 |
321 template <typename _Graph> |
516 template <typename _Graph> |
322 struct Constraints { |
517 struct Constraints { |
323 |
518 |
324 void constraints() { |
519 void constraints() { |
325 checkConcept< BaseGraphComponent, _Graph >(); |
520 checkConcept< BaseGraphComponent, _Graph >(); |
326 typename _Graph::Node node; |
521 typename _Graph::Node node; |
327 int nid = graph.id(node); |
522 int nid = graph.id(node); |
328 nid = graph.id(node); |
523 nid = graph.id(node); |
329 node = graph.fromId(nid, Node()); |
524 node = graph.nodeFromId(nid); |
330 typename _Graph::Edge edge; |
525 typename _Graph::Edge edge; |
331 int eid = graph.id(edge); |
526 int eid = graph.id(edge); |
332 eid = graph.id(edge); |
527 eid = graph.id(edge); |
333 edge = graph.fromId(eid, 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); |
334 } |
534 } |
335 |
535 |
336 const _Graph& graph; |
536 const _Graph& graph; |
337 }; |
537 }; |
338 }; |
538 }; |
339 |
539 |
340 |
540 /// \brief An empty idable base undirected graph class. |
341 /// An empty max-idable base graph class. |
541 /// |
342 |
542 /// This class provides beside the core undirected graph features |
343 /// This class provides beside the core graph features |
543 /// core id functions for the undirected graph structure. The |
344 /// core max id functions for the graph structure. |
544 /// most of the base undirected graphs should be conform to this |
345 /// The most of the base graphs should be conform to this concept. |
545 /// concept. The id's are unique and immutable. |
346 /// The id's are unique and immutable. |
546 template <typename _Base = BaseUGraphComponent> |
347 class MaxIDableGraphComponent : virtual public BaseGraphComponent { |
547 class IDableUGraphComponent : public IDableGraphComponent<_Base> { |
348 public: |
548 public: |
349 |
549 |
350 /// Gives back an integer greater or equal to the maximum Node id. |
550 typedef _Base Base; |
351 |
551 typedef typename Base::UEdge UEdge; |
352 /// Gives back an integer greater or equal to the maximum Node id. |
552 |
353 /// |
553 using IDableGraphComponent<_Base>::id; |
354 int maxId(Node = INVALID) const { return -1;} |
554 |
355 |
555 /// \brief Gives back an unique integer id for the UEdge. |
356 /// Gives back an integer greater or equal to the maximum Edge id. |
556 /// |
357 |
557 /// Gives back an unique integer id for the UEdge. |
358 /// Gives back an integer greater or equal to the maximum Edge id. |
558 /// |
359 /// |
559 int id(const UEdge&) const { return -1;} |
360 int maxId(Edge = INVALID) const { return -1;} |
560 |
361 |
561 /// \brief Gives back the undirected edge by the unique id. |
362 template <typename _Graph> |
562 /// |
363 struct Constraints { |
563 /// Gives back the undirected edge by the unique id. If the |
364 |
564 /// graph does not contain edge with the given id then the |
365 void constraints() { |
565 /// result of the function is undetermined. |
366 checkConcept<BaseGraphComponent, _Graph>(); |
566 UEdge uEdgeFromId(int) const { return INVALID;} |
367 int nid = graph.maxId(typename _Graph::Node()); |
567 |
368 ignore_unused_variable_warning(nid); |
568 /// \brief Gives back an integer greater or equal to the maximum |
369 int eid = graph.maxId(typename _Graph::Edge()); |
569 /// UEdge id. |
370 ignore_unused_variable_warning(eid); |
570 /// |
371 } |
571 /// Gives back an integer greater or equal to the maximum UEdge |
372 |
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 |
373 const _Graph& graph; |
589 const _Graph& graph; |
374 }; |
590 }; |
375 }; |
591 }; |
376 |
592 |
377 /// An empty extendable base graph class. |
593 /// \brief An empty extendable base graph class. |
378 |
594 /// |
379 /// This class provides beside the core graph features |
595 /// This class provides beside the core graph features |
380 /// core graph extend interface for the graph structure. |
596 /// core graph extend interface for the graph structure. |
381 /// The most of the base graphs should be conform to this concept. |
597 /// The most of the base graphs should be conform to this concept. |
382 class BaseExtendableGraphComponent : virtual public BaseGraphComponent { |
598 template <typename _Base = BaseGraphComponent> |
383 public: |
599 class BaseExtendableGraphComponent : public _Base { |
384 |
600 public: |
385 typedef BaseGraphComponent::Node Node; |
601 |
386 typedef BaseGraphComponent::Edge Edge; |
602 typedef typename _Base::Node Node; |
387 |
603 typedef typename _Base::Edge Edge; |
388 /// Adds a new Node to the graph. |
604 |
389 |
605 /// \brief Adds a new node to the graph. |
390 /// Adds a new Node to the graph. |
606 /// |
|
607 /// Adds a new node to the graph. |
391 /// |
608 /// |
392 Node addNode() { |
609 Node addNode() { |
393 return INVALID; |
610 return INVALID; |
394 } |
611 } |
395 |
612 |
396 /// Adds a new Edge connects the two Nodes to the graph. |
613 /// \brief Adds a new edge connects the given two nodes. |
397 |
614 /// |
398 /// Adds a new Edge connects the two Nodes to the graph. |
615 /// Adds a new edge connects the the given two nodes. |
399 /// |
|
400 Edge addEdge(const Node&, const Node&) { |
616 Edge addEdge(const Node&, const Node&) { |
401 return INVALID; |
617 return INVALID; |
402 } |
618 } |
403 |
619 |
404 template <typename _Graph> |
620 template <typename _Graph> |
405 struct Constraints { |
621 struct Constraints { |
406 void constraints() { |
622 void constraints() { |
407 checkConcept<BaseGraphComponent, _Graph >(); |
|
408 typename _Graph::Node node_a, node_b; |
623 typename _Graph::Node node_a, node_b; |
409 node_a = graph.addNode(); |
624 node_a = graph.addNode(); |
410 node_b = graph.addNode(); |
625 node_b = graph.addNode(); |
411 typename _Graph::Edge edge; |
626 typename _Graph::Edge edge; |
412 edge = graph.addEdge(node_a, node_b); |
627 edge = graph.addEdge(node_a, node_b); |
414 |
629 |
415 _Graph& graph; |
630 _Graph& graph; |
416 }; |
631 }; |
417 }; |
632 }; |
418 |
633 |
419 /// An empty erasable base graph class. |
634 /// \brief An empty extendable base undirected graph class. |
420 |
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 /// |
421 /// This class provides beside the core graph features |
677 /// This class provides beside the core graph features |
422 /// core erase functions for the graph structure. |
678 /// core erase functions for the graph structure. |
423 /// The most of the base graphs should be conform to this concept. |
679 /// The most of the base graphs should be conform to this concept. |
424 class BaseErasableGraphComponent : virtual public BaseGraphComponent { |
680 template <typename _Base = BaseGraphComponent> |
425 public: |
681 class BaseErasableGraphComponent : public _Base { |
426 |
682 public: |
427 typedef BaseGraphComponent::Node Node; |
683 |
428 typedef BaseGraphComponent::Edge Edge; |
684 typedef _Base Base; |
429 |
685 typedef typename Base::Node Node; |
430 /// Erase a Node from the graph. |
686 typedef typename Base::Edge Edge; |
431 |
687 |
432 /// Erase a Node from the graph. This function should not |
688 /// \brief Erase a node from the graph. |
|
689 /// |
|
690 /// Erase a node from the graph. This function should not |
433 /// erase edges connecting to the Node. |
691 /// erase edges connecting to the Node. |
434 void erase(const Node&) {} |
692 void erase(const Node&) {} |
435 |
693 |
436 /// Erase an Edge from the graph. |
694 /// \brief Erase an edge from the graph. |
437 |
695 /// |
438 /// Erase an Edge from the graph. |
696 /// Erase an edge from the graph. |
439 /// |
697 /// |
440 void erase(const Edge&) {} |
698 void erase(const Edge&) {} |
441 |
699 |
442 template <typename _Graph> |
700 template <typename _Graph> |
443 struct Constraints { |
701 struct Constraints { |
444 void constraints() { |
702 void constraints() { |
445 checkConcept<BaseGraphComponent, _Graph>(); |
|
446 typename _Graph::Node node; |
703 typename _Graph::Node node; |
447 graph.erase(node); |
704 graph.erase(node); |
448 typename _Graph::Edge edge; |
705 typename _Graph::Edge edge; |
449 graph.erase(edge); |
706 graph.erase(edge); |
450 } |
707 } |
451 |
708 |
452 _Graph& graph; |
709 _Graph& graph; |
453 }; |
710 }; |
454 }; |
711 }; |
455 |
712 |
456 /// An empty clearable base graph class. |
713 /// \brief An empty erasable base undirected graph class. |
457 |
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 /// |
458 /// This class provides beside the core graph features |
752 /// This class provides beside the core graph features |
459 /// core clear functions for the graph structure. |
753 /// core clear functions for the graph structure. |
460 /// The most of the base graphs should be conform to this concept. |
754 /// The most of the base graphs should be conform to this concept. |
461 class BaseClearableGraphComponent : virtual public BaseGraphComponent { |
755 template <typename _Base = BaseGraphComponent> |
462 public: |
756 class BaseClearableGraphComponent : public _Base { |
463 |
757 public: |
464 /// Erase all the Nodes and Edges from the graph. |
758 |
465 |
759 /// \brief Erase all the nodes and edges from the graph. |
466 /// Erase all the Nodes and Edges from the graph. |
760 /// |
|
761 /// Erase all the nodes and edges from the graph. |
467 /// |
762 /// |
468 void clear() {} |
763 void clear() {} |
469 |
764 |
470 template <typename _Graph> |
765 template <typename _Graph> |
471 struct Constraints { |
766 struct Constraints { |
472 void constraints() { |
767 void constraints() { |
473 checkConcept<BaseGraphComponent, _Graph>(); |
|
474 graph.clear(); |
768 graph.clear(); |
475 } |
769 } |
476 |
770 |
477 _Graph graph; |
771 _Graph graph; |
478 }; |
772 }; |
479 }; |
773 }; |
480 |
774 |
481 |
775 /// \brief An empty clearable base undirected graph class. |
482 /// Skeleton class for graph NodeIt and EdgeIt |
776 /// |
483 |
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 /// |
484 /// Skeleton class for graph NodeIt and EdgeIt. |
803 /// Skeleton class for graph NodeIt and EdgeIt. |
485 /// |
804 /// |
486 template <typename _Graph, typename _Item> |
805 template <typename _Graph, typename _Item> |
487 class GraphIterator : public _Item { |
806 class GraphItemIt : public _Item { |
488 public: |
807 public: |
489 /// \todo Don't we need the Item type as typedef? |
808 /// \brief Default constructor. |
490 |
809 /// |
491 /// Default constructor. |
|
492 |
|
493 /// @warning The default constructor sets the iterator |
810 /// @warning The default constructor sets the iterator |
494 /// to an undefined value. |
811 /// to an undefined value. |
495 GraphIterator() {} |
812 GraphItemIt() {} |
|
813 /// \brief Copy constructor. |
|
814 /// |
496 /// Copy constructor. |
815 /// Copy constructor. |
497 |
816 /// |
498 /// Copy constructor. |
817 GraphItemIt(const GraphItemIt& ) {} |
499 /// |
818 /// \brief Sets the iterator to the first item. |
500 GraphIterator(GraphIterator const&) {} |
819 /// |
501 /// Sets the iterator to the first item. |
|
502 |
|
503 /// Sets the iterator to the first item of \c the graph. |
820 /// Sets the iterator to the first item of \c the graph. |
504 /// |
821 /// |
505 explicit GraphIterator(const _Graph&) {} |
822 explicit GraphItemIt(const _Graph&) {} |
506 /// Invalid constructor \& conversion. |
823 /// \brief Invalid constructor \& conversion. |
507 |
824 /// |
508 /// This constructor initializes the item to be invalid. |
825 /// This constructor initializes the item to be invalid. |
509 /// \sa Invalid for more details. |
826 /// \sa Invalid for more details. |
510 GraphIterator(Invalid) {} |
827 GraphItemIt(Invalid) {} |
511 /// Assign operator for items. |
828 /// \brief Assign operator for items. |
512 |
829 /// |
513 /// The items are assignable. |
830 /// The items are assignable. |
514 /// |
831 /// |
515 GraphIterator& operator=(GraphIterator const&) { return *this; } |
832 GraphItemIt& operator=(const GraphItemIt&) { return *this; } |
516 /// Next item. |
833 /// \brief Next item. |
517 |
834 /// |
518 /// Assign the iterator to the next item. |
835 /// Assign the iterator to the next item. |
519 /// |
836 /// |
520 GraphIterator& operator++() { return *this; } |
837 GraphItemIt& operator++() { return *this; } |
521 // Node operator*() const { return INVALID; } |
838 /// \brief Equality operator |
522 /// Equality operator |
839 /// |
523 |
|
524 /// Two iterators are equal if and only if they point to the |
840 /// Two iterators are equal if and only if they point to the |
525 /// same object or both are invalid. |
841 /// same object or both are invalid. |
526 bool operator==(const GraphIterator&) const { return true;} |
842 bool operator==(const GraphItemIt&) const { return true;} |
527 /// Inequality operator |
843 /// \brief Inequality operator |
528 |
844 /// |
529 /// \sa operator==(Node n) |
845 /// \sa operator==(Node n) |
530 /// |
846 /// |
531 bool operator!=(const GraphIterator&) const { return true;} |
847 bool operator!=(const GraphItemIt&) const { return true;} |
532 |
848 |
533 template<typename _GraphIterator> |
849 template<typename _GraphItemIt> |
534 struct Constraints { |
850 struct Constraints { |
535 void constraints() { |
851 void constraints() { |
536 // checkConcept< Item, _GraphIterator >(); |
852 _GraphItemIt it1(g); |
537 _GraphIterator it1(g); |
853 _GraphItemIt it2; |
538 |
|
539 /// \todo Do we need NodeIt(Node) kind of constructor? |
|
540 // _GraphIterator it2(bj); |
|
541 _GraphIterator it2; |
|
542 |
854 |
543 it2 = ++it1; |
855 it2 = ++it1; |
544 ++it2 = it1; |
856 ++it2 = it1; |
545 ++(++it1); |
857 ++(++it1); |
546 /// \bug This should be: is_base_and_derived<BaseItem, _GraphIterator> |
858 |
547 _Item bi = it1; |
859 _Item bi = it1; |
548 bi = it2; |
860 bi = it2; |
549 } |
861 } |
550 _Graph& g; |
862 _Graph& g; |
551 }; |
863 }; |
552 }; |
864 }; |
553 |
865 |
554 /// Skeleton class for graph InEdgeIt and OutEdgeIt |
866 /// \brief Skeleton class for graph InEdgeIt and OutEdgeIt |
555 |
867 /// |
556 /// \note Because InEdgeIt and OutEdgeIt may not inherit from the same |
868 /// \note Because InEdgeIt and OutEdgeIt may not inherit from the same |
557 /// base class, the _selector is a additional template parameter. For |
869 /// base class, the _selector is a additional template parameter. For |
558 /// InEdgeIt you should instantiate it with character 'i' and for |
870 /// InEdgeIt you should instantiate it with character 'i' and for |
559 /// OutEdgeIt with 'o'. |
871 /// OutEdgeIt with 'o'. |
560 /// \todo Is this a good name for this concept? |
872 template <typename _Graph, |
561 template <typename Graph, |
873 typename _Item = typename _Graph::Edge, |
562 typename Edge = typename Graph::Edge, |
874 typename _Base = typename _Graph::Node, |
563 char _selector = '0'> |
875 char _selector = '0'> |
564 class GraphIncIterator : public Edge { |
876 class GraphIncIt : public _Item { |
565 public: |
877 public: |
566 /// Default constructor. |
878 /// \brief Default constructor. |
567 |
879 /// |
568 /// @warning The default constructor sets the iterator |
880 /// @warning The default constructor sets the iterator |
569 /// to an undefined value. |
881 /// to an undefined value. |
570 GraphIncIterator() {} |
882 GraphIncIt() {} |
|
883 /// \brief Copy constructor. |
|
884 /// |
571 /// Copy constructor. |
885 /// Copy constructor. |
572 |
886 /// |
573 /// Copy constructor. |
887 GraphIncIt(GraphIncIt const& gi) : _Item(gi) {} |
574 /// |
888 /// \brief Sets the iterator to the first edge incoming into or outgoing |
575 GraphIncIterator(GraphIncIterator const& gi) :Edge(gi) {} |
889 /// from the node. |
|
890 /// |
576 /// Sets the iterator to the first edge incoming into or outgoing |
891 /// Sets the iterator to the first edge incoming into or outgoing |
577 /// from the node. |
892 /// from the node. |
578 |
893 /// |
579 /// Sets the iterator to the first edge incoming into or outgoing |
894 explicit GraphIncIt(const _Graph&, const _Base&) {} |
580 /// from the node. |
895 /// \brief Invalid constructor \& conversion. |
581 /// |
896 /// |
582 explicit GraphIncIterator(const Graph&, const typename Graph::Node&) {} |
|
583 /// Invalid constructor \& conversion. |
|
584 |
|
585 /// This constructor initializes the item to be invalid. |
897 /// This constructor initializes the item to be invalid. |
586 /// \sa Invalid for more details. |
898 /// \sa Invalid for more details. |
587 GraphIncIterator(Invalid) {} |
899 GraphIncIt(Invalid) {} |
588 /// Assign operator for nodes. |
900 /// \brief Assign operator for iterators. |
589 |
901 /// |
590 /// The nodes are assignable. |
902 /// The iterators are assignable. |
591 /// |
903 /// |
592 GraphIncIterator& operator=(GraphIncIterator const&) { return *this; } |
904 GraphIncIt& operator=(GraphIncIt const&) { return *this; } |
593 /// Next edge. |
905 /// \brief Next item. |
594 |
906 /// |
595 /// Assign the iterator to the next node. |
907 /// Assign the iterator to the next item. |
596 /// |
908 /// |
597 GraphIncIterator& operator++() { return *this; } |
909 GraphIncIt& operator++() { return *this; } |
598 |
910 |
599 // Node operator*() const { return INVALID; } |
911 /// \brief Equality operator |
600 |
912 /// |
601 /// Equality operator |
|
602 |
|
603 /// Two iterators are equal if and only if they point to the |
913 /// Two iterators are equal if and only if they point to the |
604 /// same object or both are invalid. |
914 /// same object or both are invalid. |
605 bool operator==(const GraphIncIterator&) const { return true;} |
915 bool operator==(const GraphIncIt&) const { return true;} |
606 |
916 |
607 /// Inequality operator |
917 /// \brief Inequality operator |
608 |
918 /// |
609 /// \sa operator==(Node n) |
919 /// \sa operator==(Node n) |
610 /// |
920 /// |
611 bool operator!=(const GraphIncIterator&) const { return true;} |
921 bool operator!=(const GraphIncIt&) const { return true;} |
612 |
922 |
613 template <typename _GraphIncIterator> |
923 template <typename _GraphIncIt> |
614 struct Constraints { |
924 struct Constraints { |
615 typedef typename Graph::Node Node; |
925 void constraints() { |
616 void constraints() { |
926 checkConcept<GraphItem<_selector>, _GraphIncIt>(); |
617 checkConcept<GraphItem<'e'>, _GraphIncIterator>(); |
927 _GraphIncIt it1(graph, node); |
618 _GraphIncIterator it1(graph, node); |
928 _GraphIncIt it2; |
619 /// \todo Do we need OutEdgeIt(Edge) kind of constructor? |
|
620 // _GraphIncIterator it2(edge); |
|
621 _GraphIncIterator it2; |
|
622 |
929 |
623 it2 = ++it1; |
930 it2 = ++it1; |
624 ++it2 = it1; |
931 ++it2 = it1; |
625 ++(++it1); |
932 ++(++it1); |
626 Edge e = it1; |
933 _Item e = it1; |
627 e = it2; |
934 e = it2; |
628 |
935 |
629 const_constraits(); |
936 } |
630 } |
937 |
631 |
938 _Item edge; |
632 void const_constraits() { |
939 _Base node; |
633 Node n = graph.baseNode(it); |
940 _Graph graph; |
634 n = graph.runningNode(it); |
941 _GraphIncIt it; |
635 } |
942 }; |
636 |
943 }; |
637 Edge edge; |
944 |
638 Node node; |
945 |
639 Graph graph; |
946 /// \brief An empty iterable graph class. |
640 _GraphIncIterator it; |
947 /// |
641 }; |
|
642 }; |
|
643 |
|
644 |
|
645 /// An empty iterable base graph class. |
|
646 |
|
647 /// This class provides beside the core graph features |
948 /// This class provides beside the core graph features |
648 /// iterator based iterable interface for the graph structure. |
949 /// iterator based iterable interface for the graph structure. |
649 /// This concept is part of the GraphConcept. |
950 /// This concept is part of the GraphConcept. |
650 class IterableGraphComponent : virtual public BaseGraphComponent { |
951 template <typename _Base = BaseGraphComponent> |
|
952 class IterableGraphComponent : public _Base { |
651 |
953 |
652 public: |
954 public: |
653 |
955 |
|
956 typedef _Base Base; |
|
957 typedef typename Base::Node Node; |
|
958 typedef typename Base::Edge Edge; |
|
959 |
654 typedef IterableGraphComponent Graph; |
960 typedef IterableGraphComponent Graph; |
655 |
961 |
656 typedef BaseGraphComponent::Node Node; |
962 |
657 typedef BaseGraphComponent::Edge Edge; |
963 /// \brief This iterator goes through each node. |
658 |
964 /// |
659 /// This iterator goes through each node. |
965 /// This iterator goes through each node. |
660 |
966 /// |
|
967 typedef GraphItemIt<Graph, Node> NodeIt; |
|
968 |
|
969 /// \brief This iterator goes through each node. |
|
970 /// |
661 /// This iterator goes through each node. |
971 /// This iterator goes through each node. |
662 /// |
972 /// |
663 typedef GraphIterator<Graph, Node> NodeIt; |
973 typedef GraphItemIt<Graph, Edge> EdgeIt; |
664 /// This iterator goes through each node. |
974 |
665 |
975 /// \brief This iterator goes trough the incoming edges of a node. |
666 /// This iterator goes through each node. |
976 /// |
667 /// |
|
668 typedef GraphIterator<Graph, Edge> EdgeIt; |
|
669 /// This iterator goes trough the incoming edges of a node. |
|
670 |
|
671 /// This iterator goes trough the \e inccoming edges of a certain node |
977 /// This iterator goes trough the \e inccoming edges of a certain node |
672 /// of a graph. |
978 /// of a graph. |
673 typedef GraphIncIterator<Graph, Edge, 'i'> InEdgeIt; |
979 typedef GraphIncIt<Graph, Edge, Node, 'i'> InEdgeIt; |
674 /// This iterator goes trough the outgoing edges of a node. |
980 |
675 |
981 /// \brief This iterator goes trough the outgoing edges of a node. |
|
982 /// |
676 /// This iterator goes trough the \e outgoing edges of a certain node |
983 /// This iterator goes trough the \e outgoing edges of a certain node |
677 /// of a graph. |
984 /// of a graph. |
678 typedef GraphIncIterator<Graph, Edge, 'o'> OutEdgeIt; |
985 typedef GraphIncIt<Graph, Edge, Node, 'o'> OutEdgeIt; |
679 |
986 |
680 /// \brief The base node of the iterator. |
987 /// \brief The base node of the iterator. |
681 /// |
988 /// |
682 /// Gives back the base node of the iterator. |
989 /// Gives back the base node of the iterator. |
683 /// It is always the target of the pointed edge. |
990 /// It is always the target of the pointed edge. |
709 |
1016 |
710 |
1017 |
711 template <typename _Graph> |
1018 template <typename _Graph> |
712 struct Constraints { |
1019 struct Constraints { |
713 void constraints() { |
1020 void constraints() { |
714 checkConcept< BaseGraphComponent, _Graph>(); |
1021 checkConcept<Base, _Graph>(); |
715 |
1022 |
716 checkConcept<GraphIterator<_Graph, typename _Graph::Edge>, |
1023 checkConcept<GraphItemIt<_Graph, typename _Graph::Edge>, |
717 typename _Graph::EdgeIt >(); |
1024 typename _Graph::EdgeIt >(); |
718 checkConcept<GraphIterator<_Graph, typename _Graph::Node>, |
1025 checkConcept<GraphItemIt<_Graph, typename _Graph::Node>, |
719 typename _Graph::NodeIt >(); |
1026 typename _Graph::NodeIt >(); |
720 checkConcept<GraphIncIterator<_Graph>, typename _Graph::InEdgeIt>(); |
1027 checkConcept<GraphIncIt<_Graph, typename _Graph::Edge, |
721 checkConcept<GraphIncIterator<_Graph>, typename _Graph::OutEdgeIt>(); |
1028 typename _Graph::Node, 'i'>, typename _Graph::InEdgeIt>(); |
722 |
1029 checkConcept<GraphIncIt<_Graph, typename _Graph::Edge, |
723 typename _Graph::Node n(INVALID); |
1030 typename _Graph::Node, 'o'>, typename _Graph::OutEdgeIt>(); |
724 typename _Graph::Edge e(INVALID); |
1031 |
725 n = graph.oppositeNode(n, e); |
1032 typename _Graph::Node n; |
726 } |
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 } |
727 |
1041 |
728 const _Graph& graph; |
1042 const _Graph& graph; |
729 |
1043 |
730 }; |
1044 }; |
731 }; |
1045 }; |
732 |
1046 |
733 /// An empty alteration notifier base graph class. |
1047 /// \brief An empty iterable undirected graph class. |
734 |
1048 /// |
735 /// This class provides beside the core graph features |
1049 /// This class provides beside the core graph features iterator |
736 /// alteration notifier interface for the graph structure. |
1050 /// based iterable interface for the undirected graph structure. |
737 /// This is an observer-notifier pattern. More Obsevers can |
1051 /// This concept is part of the GraphConcept. |
738 /// be registered into the notifier and whenever an alteration |
1052 template <typename _Base = BaseUGraphComponent> |
739 /// occured in the graph all the observers will notified about it. |
1053 class IterableUGraphComponent : public IterableGraphComponent<_Base> { |
740 class AlterableGraphComponent : virtual public BaseIterableGraphComponent { |
1054 public: |
741 public: |
1055 |
742 |
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; |
743 /// The edge observer registry. |
1129 /// The edge observer registry. |
744 typedef AlterationNotifier<AlterableGraphComponent, Edge> |
1130 typedef AlterationNotifier<AlterableGraphComponent, Edge> |
745 EdgeNotifier; |
1131 EdgeNotifier; |
746 /// The node observer registry. |
|
747 typedef AlterationNotifier<AlterableGraphComponent, Node> |
|
748 NodeNotifier; |
|
749 |
|
750 /// \brief Gives back the edge alteration notifier. |
|
751 /// |
|
752 /// Gives back the edge alteration notifier. |
|
753 EdgeNotifier getNotifier(Edge) const { |
|
754 return EdgeNotifier(); |
|
755 } |
|
756 |
1132 |
757 /// \brief Gives back the node alteration notifier. |
1133 /// \brief Gives back the node alteration notifier. |
758 /// |
1134 /// |
759 /// Gives back the node alteration notifier. |
1135 /// Gives back the node alteration notifier. |
760 NodeNotifier getNotifier(Node) const { |
1136 NodeNotifier& getNotifier(Node) const { |
761 return NodeNotifier(); |
1137 return NodeNotifier(); |
762 } |
1138 } |
763 |
1139 |
764 }; |
1140 /// \brief Gives back the edge alteration notifier. |
765 |
1141 /// |
766 |
1142 /// Gives back the edge alteration notifier. |
767 /// Class describing the concept of graph maps |
1143 EdgeNotifier& getNotifier(Edge) const { |
768 |
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 /// |
769 /// This class describes the common interface of the graph maps |
1213 /// This class describes the common interface of the graph maps |
770 /// (NodeMap, EdgeMap), that is \ref maps-page "maps" which can be used to |
1214 /// (NodeMap, EdgeMap), that is \ref maps-page "maps" which can be used to |
771 /// associate data to graph descriptors (nodes or edges). |
1215 /// associate data to graph descriptors (nodes or edges). |
772 template <typename Graph, typename Item, typename _Value> |
1216 template <typename _Graph, typename _Item, typename _Value> |
773 class GraphMap : public ReadWriteMap<Item, _Value> { |
1217 class GraphMap : public ReadWriteMap<_Item, _Value> { |
774 protected: |
1218 public: |
775 GraphMap() {} |
1219 |
776 public: |
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 |
777 /// \brief Construct a new map. |
1229 /// \brief Construct a new map. |
778 /// |
1230 /// |
779 /// Construct a new map for the graph. |
1231 /// Construct a new map for the graph. |
780 explicit GraphMap(const Graph&) {} |
1232 explicit GraphMap(const Graph&) {} |
781 /// \brief Construct a new map with default value. |
1233 /// \brief Construct a new map with default value. |
782 /// |
1234 /// |
783 /// Construct a new map for the graph and initalise the values. |
1235 /// Construct a new map for the graph and initalise the values. |
784 GraphMap(const Graph&, const _Value&) {} |
1236 GraphMap(const Graph&, const Value&) {} |
785 /// \brief Copy constructor. |
1237 /// \brief Copy constructor. |
786 /// |
1238 /// |
787 /// Copy Constructor. |
1239 /// Copy Constructor. |
788 GraphMap(const GraphMap& gm) :ReadWriteMap<Item, _Value>(gm) {} |
1240 GraphMap(const GraphMap&) : Parent() {} |
789 |
1241 |
790 /// \brief Assign operator. |
1242 /// \brief Assign operator. |
791 /// |
1243 /// |
792 /// Assign operator. |
1244 /// Assign operator. It does not mofify the underlying graph, |
793 GraphMap& operator=(const GraphMap&) { return *this;} |
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 } |
794 |
1252 |
795 template<typename _Map> |
1253 template<typename _Map> |
796 struct Constraints { |
1254 struct Constraints { |
797 void constraints() { |
1255 void constraints() { |
798 checkConcept<ReadWriteMap<Item, _Value>, _Map >(); |
1256 checkConcept<ReadWriteMap<Key, Value>, _Map >(); |
799 // Construction with a graph parameter |
1257 // Construction with a graph parameter |
800 _Map a(g); |
1258 _Map a(g); |
801 // Constructor with a graph and a default value parameter |
1259 // Constructor with a graph and a default value parameter |
802 _Map a2(g,t); |
1260 _Map a2(g,t); |
803 // Copy constructor. Do we need it? |
1261 // Copy constructor. |
804 _Map b=c; |
1262 _Map b(c); |
|
1263 |
|
1264 ReadMap<Key, Value> cmap; |
|
1265 b = cmap; |
805 |
1266 |
806 ignore_unused_variable_warning(a2); |
1267 ignore_unused_variable_warning(a2); |
|
1268 ignore_unused_variable_warning(b); |
807 } |
1269 } |
808 |
1270 |
809 const _Map &c; |
1271 const _Map &c; |
810 const Graph &g; |
1272 const Graph &g; |
811 const typename GraphMap::Value &t; |
1273 const typename GraphMap::Value &t; |
812 }; |
1274 }; |
813 |
1275 |
814 }; |
1276 }; |
815 |
1277 |
816 /// An empty mappable base graph class. |
1278 /// \brief An empty mappable graph class. |
817 |
1279 /// |
818 /// This class provides beside the core graph features |
1280 /// This class provides beside the core graph features |
819 /// map interface for the graph structure. |
1281 /// map interface for the graph structure. |
820 /// This concept is part of the GraphConcept. |
1282 /// This concept is part of the Graph concept. |
821 class MappableGraphComponent : virtual public BaseGraphComponent { |
1283 template <typename _Base = BaseGraphComponent> |
822 public: |
1284 class MappableGraphComponent : public _Base { |
|
1285 public: |
|
1286 |
|
1287 typedef _Base Base; |
|
1288 typedef typename Base::Node Node; |
|
1289 typedef typename Base::Edge Edge; |
823 |
1290 |
824 typedef MappableGraphComponent Graph; |
1291 typedef MappableGraphComponent Graph; |
825 |
1292 |
826 typedef BaseGraphComponent::Node Node; |
1293 /// \brief ReadWrite map of the nodes. |
827 typedef BaseGraphComponent::Edge Edge; |
1294 /// |
828 |
|
829 /// ReadWrite map of the nodes. |
1295 /// ReadWrite map of the nodes. |
830 |
1296 /// |
831 /// ReadWrite map of the nodes. |
1297 template <typename Value> |
832 /// |
1298 class NodeMap : public GraphMap<Graph, Node, Value> { |
833 template <typename _Value> |
|
834 class NodeMap : public GraphMap<Graph, Node, _Value> { |
|
835 private: |
1299 private: |
836 NodeMap(); |
1300 NodeMap(); |
837 public: |
1301 public: |
|
1302 typedef GraphMap<Graph, Node, Value> Parent; |
|
1303 |
838 /// \brief Construct a new map. |
1304 /// \brief Construct a new map. |
839 /// |
1305 /// |
840 /// Construct a new map for the graph. |
1306 /// Construct a new map for the graph. |
841 /// \todo call the right parent class constructor |
1307 /// \todo call the right parent class constructor |
842 explicit NodeMap(const Graph&) {} |
1308 explicit NodeMap(const Graph& graph) : Parent(graph) {} |
|
1309 |
843 /// \brief Construct a new map with default value. |
1310 /// \brief Construct a new map with default value. |
844 /// |
1311 /// |
845 /// Construct a new map for the graph and initalise the values. |
1312 /// Construct a new map for the graph and initalise the values. |
846 NodeMap(const Graph&, const _Value&) {} |
1313 NodeMap(const Graph& graph, const Value& value) |
|
1314 : Parent(graph, value) {} |
|
1315 |
847 /// \brief Copy constructor. |
1316 /// \brief Copy constructor. |
848 /// |
1317 /// |
849 /// Copy Constructor. |
1318 /// Copy Constructor. |
850 NodeMap(const NodeMap& nm) : GraphMap<Graph, Node, _Value>(nm) {} |
1319 NodeMap(const NodeMap& nm) : Parent(nm) {} |
851 |
1320 |
852 /// \brief Assign operator. |
1321 /// \brief Assign operator. |
853 /// |
1322 /// |
854 /// Assign operator. |
1323 /// Assign operator. |
855 NodeMap& operator=(const NodeMap&) { return *this;} |
1324 template <typename CMap> |
856 |
1325 NodeMap& operator=(const CMap&) { |
857 }; |
1326 checkConcept<ReadMap<Node, Value>, CMap>(); |
858 |
1327 return *this; |
|
1328 } |
|
1329 |
|
1330 }; |
|
1331 |
|
1332 /// \brief ReadWrite map of the edges. |
|
1333 /// |
859 /// ReadWrite map of the edges. |
1334 /// ReadWrite map of the edges. |
860 |
1335 /// |
861 /// ReadWrite map of the edges. |
1336 template <typename Value> |
862 /// |
1337 class EdgeMap : public GraphMap<Graph, Edge, Value> { |
863 template <typename _Value> |
|
864 class EdgeMap : public GraphMap<Graph, Edge, _Value> { |
|
865 private: |
1338 private: |
866 EdgeMap(); |
1339 EdgeMap(); |
867 public: |
1340 public: |
|
1341 typedef GraphMap<Graph, Edge, Value> Parent; |
|
1342 |
868 /// \brief Construct a new map. |
1343 /// \brief Construct a new map. |
869 /// |
1344 /// |
870 /// Construct a new map for the graph. |
1345 /// Construct a new map for the graph. |
871 /// \todo call the right parent class constructor |
1346 /// \todo call the right parent class constructor |
872 explicit EdgeMap(const Graph&) {} |
1347 explicit EdgeMap(const Graph& graph) : Parent(graph) {} |
|
1348 |
873 /// \brief Construct a new map with default value. |
1349 /// \brief Construct a new map with default value. |
874 /// |
1350 /// |
875 /// Construct a new map for the graph and initalise the values. |
1351 /// Construct a new map for the graph and initalise the values. |
876 EdgeMap(const Graph&, const _Value&) {} |
1352 EdgeMap(const Graph& graph, const Value& value) |
|
1353 : Parent(graph, value) {} |
|
1354 |
877 /// \brief Copy constructor. |
1355 /// \brief Copy constructor. |
878 /// |
1356 /// |
879 /// Copy Constructor. |
1357 /// Copy Constructor. |
880 EdgeMap(const EdgeMap& em) :GraphMap<Graph, Edge, _Value>(em) {} |
1358 EdgeMap(const EdgeMap& nm) : Parent(nm) {} |
881 |
1359 |
882 /// \brief Assign operator. |
1360 /// \brief Assign operator. |
883 /// |
1361 /// |
884 /// Assign operator. |
1362 /// Assign operator. |
885 EdgeMap& operator=(const EdgeMap&) { return *this;} |
1363 template <typename CMap> |
886 |
1364 EdgeMap& operator=(const CMap&) { |
887 }; |
1365 checkConcept<ReadMap<Edge, Value>, CMap>(); |
888 |
1366 return *this; |
889 template <typename _Graph> |
1367 } |
890 struct Constraints { |
1368 |
891 |
1369 }; |
892 struct Type { |
1370 |
|
1371 |
|
1372 template <typename _Graph> |
|
1373 struct Constraints { |
|
1374 |
|
1375 struct Dummy { |
893 int value; |
1376 int value; |
894 Type() : value(0) {} |
1377 Dummy() : value(0) {} |
895 Type(int _v) : value(_v) {} |
1378 Dummy(int _v) : value(_v) {} |
896 }; |
1379 }; |
897 |
1380 |
898 void constraints() { |
1381 void constraints() { |
899 checkConcept<BaseGraphComponent, _Graph>(); |
1382 checkConcept<Base, _Graph>(); |
900 { // int map test |
1383 { // int map test |
901 typedef typename _Graph::template NodeMap<int> IntNodeMap; |
1384 typedef typename _Graph::template NodeMap<int> IntNodeMap; |
902 checkConcept<GraphMap<_Graph, typename _Graph::Node, int>, |
1385 checkConcept<GraphMap<_Graph, typename _Graph::Node, int>, |
903 IntNodeMap >(); |
1386 IntNodeMap >(); |
904 } { // bool map test |
1387 } { // bool map test |
905 typedef typename _Graph::template NodeMap<bool> BoolNodeMap; |
1388 typedef typename _Graph::template NodeMap<bool> BoolNodeMap; |
906 checkConcept<GraphMap<_Graph, typename _Graph::Node, bool>, |
1389 checkConcept<GraphMap<_Graph, typename _Graph::Node, bool>, |
907 BoolNodeMap >(); |
1390 BoolNodeMap >(); |
908 } { // Type map test |
1391 } { // Dummy map test |
909 typedef typename _Graph::template NodeMap<Type> TypeNodeMap; |
1392 typedef typename _Graph::template NodeMap<Dummy> DummyNodeMap; |
910 checkConcept<GraphMap<_Graph, typename _Graph::Node, Type>, |
1393 checkConcept<GraphMap<_Graph, typename _Graph::Node, Dummy>, |
911 TypeNodeMap >(); |
1394 DummyNodeMap >(); |
912 } |
1395 } |
913 |
1396 |
914 { // int map test |
1397 { // int map test |
915 typedef typename _Graph::template EdgeMap<int> IntEdgeMap; |
1398 typedef typename _Graph::template EdgeMap<int> IntEdgeMap; |
916 checkConcept<GraphMap<_Graph, typename _Graph::Edge, int>, |
1399 checkConcept<GraphMap<_Graph, typename _Graph::Edge, int>, |
917 IntEdgeMap >(); |
1400 IntEdgeMap >(); |
918 } { // bool map test |
1401 } { // bool map test |
919 typedef typename _Graph::template EdgeMap<bool> BoolEdgeMap; |
1402 typedef typename _Graph::template EdgeMap<bool> BoolEdgeMap; |
920 checkConcept<GraphMap<_Graph, typename _Graph::Edge, bool>, |
1403 checkConcept<GraphMap<_Graph, typename _Graph::Edge, bool>, |
921 BoolEdgeMap >(); |
1404 BoolEdgeMap >(); |
922 } { // Type map test |
1405 } { // Dummy map test |
923 typedef typename _Graph::template EdgeMap<Type> TypeEdgeMap; |
1406 typedef typename _Graph::template EdgeMap<Dummy> DummyEdgeMap; |
924 checkConcept<GraphMap<_Graph, typename _Graph::Edge, Type>, |
1407 checkConcept<GraphMap<_Graph, typename _Graph::Edge, Dummy>, |
925 TypeEdgeMap >(); |
1408 DummyEdgeMap >(); |
926 } |
1409 } |
927 } |
1410 } |
928 |
1411 |
929 _Graph& graph; |
1412 _Graph& graph; |
930 }; |
1413 }; |
931 }; |
1414 }; |
932 |
1415 |
933 |
1416 /// \brief An empty mappable base graph class. |
934 // /// Skeleton class which describes an edge with direction in \ref |
1417 /// |
935 // /// UGraph "undirected graph". |
1418 /// This class provides beside the core graph features |
936 template <typename UGraph> |
1419 /// map interface for the graph structure. |
937 class UGraphEdge : public UGraph::UEdge { |
1420 /// This concept is part of the UGraph concept. |
938 typedef typename UGraph::UEdge UEdge; |
1421 template <typename _Base = BaseUGraphComponent> |
939 typedef typename UGraph::Node Node; |
1422 class MappableUGraphComponent : public MappableGraphComponent<_Base> { |
940 public: |
1423 public: |
941 |
1424 |
942 /// \e |
1425 typedef _Base Base; |
943 UGraphEdge() {} |
1426 typedef typename Base::UEdge UEdge; |
944 |
1427 |
945 /// \e |
1428 typedef MappableUGraphComponent Graph; |
946 UGraphEdge(const UGraphEdge& e) : UGraph::UEdge(e) {} |
1429 |
947 |
1430 /// \brief ReadWrite map of the uedges. |
948 /// \e |
1431 /// |
949 UGraphEdge(Invalid) {} |
1432 /// ReadWrite map of the uedges. |
950 |
1433 /// |
951 /// \brief Directed edge from undirected edge and a source node. |
1434 template <typename Value> |
952 /// |
1435 class UEdgeMap : public GraphMap<Graph, UEdge, Value> { |
953 /// Constructs a directed edge from undirected edge and a source node. |
1436 public: |
954 /// |
1437 typedef GraphMap<Graph, UEdge, Value> Parent; |
955 /// \note You have to specify the graph for this constructor. |
1438 |
956 UGraphEdge(const UGraph &g, |
1439 /// \brief Construct a new map. |
957 UEdge u_edge, Node n) { |
1440 /// |
958 ignore_unused_variable_warning(u_edge); |
1441 /// Construct a new map for the graph. |
959 ignore_unused_variable_warning(g); |
1442 /// \todo call the right parent class constructor |
960 ignore_unused_variable_warning(n); |
1443 explicit UEdgeMap(const Graph& graph) : Parent(graph) {} |
961 } |
1444 |
962 |
1445 /// \brief Construct a new map with default value. |
963 /// \e |
1446 /// |
964 UGraphEdge& operator=(UGraphEdge) { return *this; } |
1447 /// Construct a new map for the graph and initalise the values. |
965 |
1448 UEdgeMap(const Graph& graph, const Value& value) |
966 /// \e |
1449 : Parent(graph, value) {} |
967 bool operator==(UGraphEdge) const { return true; } |
1450 |
968 /// \e |
1451 /// \brief Copy constructor. |
969 bool operator!=(UGraphEdge) const { return false; } |
1452 /// |
970 |
1453 /// Copy Constructor. |
971 /// \e |
1454 UEdgeMap(const UEdgeMap& nm) : Parent(nm) {} |
972 bool operator<(UGraphEdge) const { return false; } |
1455 |
973 |
1456 /// \brief Assign operator. |
974 template <typename Edge> |
1457 /// |
975 struct Constraints { |
1458 /// Assign operator. |
976 void constraints() { |
1459 template <typename CMap> |
977 const_constraints(); |
1460 UEdgeMap& operator=(const CMap&) { |
978 } |
1461 checkConcept<ReadMap<UEdge, Value>, CMap>(); |
979 void const_constraints() const { |
1462 return *this; |
980 /// \bug This should be is_base_and_derived ... |
1463 } |
981 UEdge ue = e; |
1464 |
982 ue = e; |
1465 }; |
983 |
1466 |
984 Edge e_with_source(graph,ue,n); |
1467 |
985 ignore_unused_variable_warning(e_with_source); |
1468 template <typename _Graph> |
986 } |
|
987 Edge e; |
|
988 UEdge ue; |
|
989 UGraph graph; |
|
990 Node n; |
|
991 }; |
|
992 }; |
|
993 |
|
994 |
|
995 struct BaseIterableUGraphConcept { |
|
996 |
|
997 template <typename Graph> |
|
998 struct Constraints { |
|
999 |
|
1000 typedef typename Graph::UEdge UEdge; |
|
1001 typedef typename Graph::Edge Edge; |
|
1002 typedef typename Graph::Node Node; |
|
1003 |
|
1004 void constraints() { |
|
1005 checkConcept<BaseIterableGraphComponent, Graph>(); |
|
1006 checkConcept<GraphItem<>, UEdge>(); |
|
1007 //checkConcept<UGraphEdge<Graph>, Edge>(); |
|
1008 |
|
1009 graph.first(ue); |
|
1010 graph.next(ue); |
|
1011 |
|
1012 const_constraints(); |
|
1013 } |
|
1014 void const_constraints() { |
|
1015 Node n; |
|
1016 n = graph.target(ue); |
|
1017 n = graph.source(ue); |
|
1018 n = graph.oppositeNode(n0, ue); |
|
1019 |
|
1020 bool b; |
|
1021 b = graph.direction(e); |
|
1022 Edge e = graph.direct(UEdge(), true); |
|
1023 e = graph.direct(UEdge(), n); |
|
1024 |
|
1025 ignore_unused_variable_warning(b); |
|
1026 } |
|
1027 |
|
1028 Graph graph; |
|
1029 Edge e; |
|
1030 Node n0; |
|
1031 UEdge ue; |
|
1032 }; |
|
1033 |
|
1034 }; |
|
1035 |
|
1036 |
|
1037 struct IterableUGraphConcept { |
|
1038 |
|
1039 template <typename Graph> |
|
1040 struct Constraints { |
|
1041 void constraints() { |
|
1042 /// \todo we don't need the iterable component to be base iterable |
|
1043 /// Don't we really??? |
|
1044 //checkConcept< BaseIterableUGraphConcept, Graph > (); |
|
1045 |
|
1046 checkConcept<IterableGraphComponent, Graph> (); |
|
1047 |
|
1048 typedef typename Graph::UEdge UEdge; |
|
1049 typedef typename Graph::UEdgeIt UEdgeIt; |
|
1050 typedef typename Graph::IncEdgeIt IncEdgeIt; |
|
1051 |
|
1052 checkConcept<GraphIterator<Graph, UEdge>, UEdgeIt>(); |
|
1053 checkConcept<GraphIncIterator<Graph, UEdge>, IncEdgeIt>(); |
|
1054 } |
|
1055 }; |
|
1056 |
|
1057 }; |
|
1058 |
|
1059 struct MappableUGraphConcept { |
|
1060 |
|
1061 template <typename Graph> |
|
1062 struct Constraints { |
1469 struct Constraints { |
1063 |
1470 |
1064 struct Dummy { |
1471 struct Dummy { |
1065 int value; |
1472 int value; |
1066 Dummy() : value(0) {} |
1473 Dummy() : value(0) {} |
1067 Dummy(int _v) : value(_v) {} |
1474 Dummy(int _v) : value(_v) {} |
1068 }; |
1475 }; |
1069 |
1476 |
1070 void constraints() { |
1477 void constraints() { |
1071 checkConcept<MappableGraphComponent, Graph>(); |
1478 checkConcept<Base, _Graph>(); |
1072 |
1479 checkConcept<MappableGraphComponent<Base>, _Graph>(); |
1073 typedef typename Graph::template UEdgeMap<int> IntMap; |
1480 |
1074 checkConcept<GraphMap<Graph, typename Graph::UEdge, int>, |
1481 { // int map test |
1075 IntMap >(); |
1482 typedef typename _Graph::template UEdgeMap<int> IntUEdgeMap; |
1076 |
1483 checkConcept<GraphMap<_Graph, typename _Graph::UEdge, int>, |
1077 typedef typename Graph::template UEdgeMap<bool> BoolMap; |
1484 IntUEdgeMap >(); |
1078 checkConcept<GraphMap<Graph, typename Graph::UEdge, bool>, |
1485 } { // bool map test |
1079 BoolMap >(); |
1486 typedef typename _Graph::template UEdgeMap<bool> BoolUEdgeMap; |
1080 |
1487 checkConcept<GraphMap<_Graph, typename _Graph::UEdge, bool>, |
1081 typedef typename Graph::template UEdgeMap<Dummy> DummyMap; |
1488 BoolUEdgeMap >(); |
1082 checkConcept<GraphMap<Graph, typename Graph::UEdge, Dummy>, |
1489 } { // Dummy map test |
1083 DummyMap >(); |
1490 typedef typename _Graph::template UEdgeMap<Dummy> DummyUEdgeMap; |
1084 } |
1491 checkConcept<GraphMap<_Graph, typename _Graph::UEdge, Dummy>, |
1085 }; |
1492 DummyUEdgeMap >(); |
1086 |
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 }; |
1087 }; |
1714 }; |
1088 |
1715 |
1089 } |
1716 } |
1090 |
1717 |
1091 } |
1718 } |