1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
3 * This file is a part of LEMON, a generic C++ optimization library.
5 * Copyright (C) 2003-2010
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
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.
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
19 ///\ingroup graph_concepts
21 ///\brief The concepts of graph components.
23 #ifndef LEMON_CONCEPTS_GRAPH_COMPONENTS_H
24 #define LEMON_CONCEPTS_GRAPH_COMPONENTS_H
26 #include <lemon/core.h>
27 #include <lemon/concepts/maps.h>
29 #include <lemon/bits/alteration_notifier.h>
34 /// \brief Concept class for \c Node, \c Arc and \c Edge types.
36 /// This class describes the concept of \c Node, \c Arc and \c Edge
37 /// subtypes of digraph and graph types.
39 /// \note This class is a template class so that we can use it to
40 /// create graph skeleton classes. The reason for this is that \c Node
41 /// and \c Arc (or \c Edge) types should \e not derive from the same
42 /// base class. For \c Node you should instantiate it with character
43 /// \c 'n', for \c Arc with \c 'a' and for \c Edge with \c 'e'.
45 template <char sel = '0'>
49 /// \brief Default constructor.
51 /// Default constructor.
52 /// \warning The default constructor is not required to set
53 /// the item to some well-defined value. So you should consider it
57 /// \brief Copy constructor.
60 GraphItem(const GraphItem &) {}
62 /// \brief Constructor for conversion from \c INVALID.
64 /// Constructor for conversion from \c INVALID.
65 /// It initializes the item to be invalid.
66 /// \sa Invalid for more details.
69 /// \brief Assignment operator.
71 /// Assignment operator for the item.
72 GraphItem& operator=(const GraphItem&) { return *this; }
74 /// \brief Assignment operator for INVALID.
76 /// This operator makes the item invalid.
77 GraphItem& operator=(Invalid) { return *this; }
79 /// \brief Equality operator.
81 /// Equality operator.
82 bool operator==(const GraphItem&) const { return false; }
84 /// \brief Inequality operator.
86 /// Inequality operator.
87 bool operator!=(const GraphItem&) const { return false; }
89 /// \brief Ordering operator.
91 /// This operator defines an ordering of the items.
92 /// It makes possible to use graph item types as key types in
93 /// associative containers (e.g. \c std::map).
95 /// \note This operator only has to define some strict ordering of
96 /// the items; this order has nothing to do with the iteration
97 /// ordering of the items.
98 bool operator<(const GraphItem&) const { return false; }
100 template<typename _GraphItem>
106 _GraphItem i3 = INVALID;
111 b = (ia == ib) && (ia != ib);
112 b = (ia == INVALID) && (ib != INVALID);
116 const _GraphItem &ia;
117 const _GraphItem &ib;
122 /// \brief Base skeleton class for directed graphs.
124 /// This class describes the base interface of directed graph types.
125 /// All digraph %concepts have to conform to this class.
126 /// It just provides types for nodes and arcs and functions
127 /// to get the source and the target nodes of arcs.
128 class BaseDigraphComponent {
131 typedef BaseDigraphComponent Digraph;
133 /// \brief Node class of the digraph.
135 /// This class represents the nodes of the digraph.
136 typedef GraphItem<'n'> Node;
138 /// \brief Arc class of the digraph.
140 /// This class represents the arcs of the digraph.
141 typedef GraphItem<'a'> Arc;
143 /// \brief Return the source node of an arc.
145 /// This function returns the source node of an arc.
146 Node source(const Arc&) const { return INVALID; }
148 /// \brief Return the target node of an arc.
150 /// This function returns the target node of an arc.
151 Node target(const Arc&) const { return INVALID; }
153 /// \brief Return the opposite node on the given arc.
155 /// This function returns the opposite node on the given arc.
156 Node oppositeNode(const Node&, const Arc&) const {
160 template <typename _Digraph>
162 typedef typename _Digraph::Node Node;
163 typedef typename _Digraph::Arc Arc;
166 checkConcept<GraphItem<'n'>, Node>();
167 checkConcept<GraphItem<'a'>, Arc>();
171 n = digraph.source(e);
172 n = digraph.target(e);
173 n = digraph.oppositeNode(n, e);
177 const _Digraph& digraph;
182 /// \brief Base skeleton class for undirected graphs.
184 /// This class describes the base interface of undirected graph types.
185 /// All graph %concepts have to conform to this class.
186 /// It extends the interface of \ref BaseDigraphComponent with an
187 /// \c Edge type and functions to get the end nodes of edges,
188 /// to convert from arcs to edges and to get both direction of edges.
189 class BaseGraphComponent : public BaseDigraphComponent {
192 typedef BaseGraphComponent Graph;
194 typedef BaseDigraphComponent::Node Node;
195 typedef BaseDigraphComponent::Arc Arc;
197 /// \brief Undirected edge class of the graph.
199 /// This class represents the undirected edges of the graph.
200 /// Undirected graphs can be used as directed graphs, each edge is
201 /// represented by two opposite directed arcs.
202 class Edge : public GraphItem<'e'> {
203 typedef GraphItem<'e'> Parent;
206 /// \brief Default constructor.
208 /// Default constructor.
209 /// \warning The default constructor is not required to set
210 /// the item to some well-defined value. So you should consider it
211 /// as uninitialized.
214 /// \brief Copy constructor.
216 /// Copy constructor.
217 Edge(const Edge &) : Parent() {}
219 /// \brief Constructor for conversion from \c INVALID.
221 /// Constructor for conversion from \c INVALID.
222 /// It initializes the item to be invalid.
223 /// \sa Invalid for more details.
226 /// \brief Constructor for conversion from an arc.
228 /// Constructor for conversion from an arc.
229 /// Besides the core graph item functionality each arc should
230 /// be convertible to the represented edge.
234 /// \brief Return one end node of an edge.
236 /// This function returns one end node of an edge.
237 Node u(const Edge&) const { return INVALID; }
239 /// \brief Return the other end node of an edge.
241 /// This function returns the other end node of an edge.
242 Node v(const Edge&) const { return INVALID; }
244 /// \brief Return a directed arc related to an edge.
246 /// This function returns a directed arc from its direction and the
247 /// represented edge.
248 Arc direct(const Edge&, bool) const { return INVALID; }
250 /// \brief Return a directed arc related to an edge.
252 /// This function returns a directed arc from its source node and the
253 /// represented edge.
254 Arc direct(const Edge&, const Node&) const { return INVALID; }
256 /// \brief Return the direction of the arc.
258 /// Returns the direction of the arc. Each arc represents an
259 /// edge with a direction. It gives back the
261 bool direction(const Arc&) const { return true; }
263 /// \brief Return the opposite arc.
265 /// This function returns the opposite arc, i.e. the arc representing
266 /// the same edge and has opposite direction.
267 Arc oppositeArc(const Arc&) const { return INVALID; }
269 template <typename _Graph>
271 typedef typename _Graph::Node Node;
272 typedef typename _Graph::Arc Arc;
273 typedef typename _Graph::Edge Edge;
276 checkConcept<BaseDigraphComponent, _Graph>();
277 checkConcept<GraphItem<'e'>, Edge>();
284 e = graph.direct(ue, true);
285 e = graph.direct(ue, false);
286 e = graph.direct(ue, n);
287 e = graph.oppositeArc(e);
289 bool d = graph.direction(e);
290 ignore_unused_variable_warning(d);
300 /// \brief Skeleton class for \e idable directed graphs.
302 /// This class describes the interface of \e idable directed graphs.
303 /// It extends \ref BaseDigraphComponent with the core ID functions.
304 /// The ids of the items must be unique and immutable.
305 /// This concept is part of the Digraph concept.
306 template <typename BAS = BaseDigraphComponent>
307 class IDableDigraphComponent : public BAS {
311 typedef typename Base::Node Node;
312 typedef typename Base::Arc Arc;
314 /// \brief Return a unique integer id for the given node.
316 /// This function returns a unique integer id for the given node.
317 int id(const Node&) const { return -1; }
319 /// \brief Return the node by its unique id.
321 /// This function returns the node by its unique id.
322 /// If the digraph does not contain a node with the given id,
323 /// then the result of the function is undefined.
324 Node nodeFromId(int) const { return INVALID; }
326 /// \brief Return a unique integer id for the given arc.
328 /// This function returns a unique integer id for the given arc.
329 int id(const Arc&) const { return -1; }
331 /// \brief Return the arc by its unique id.
333 /// This function returns the arc by its unique id.
334 /// If the digraph does not contain an arc with the given id,
335 /// then the result of the function is undefined.
336 Arc arcFromId(int) const { return INVALID; }
338 /// \brief Return an integer greater or equal to the maximum
341 /// This function returns an integer greater or equal to the
343 int maxNodeId() const { return -1; }
345 /// \brief Return an integer greater or equal to the maximum
348 /// This function returns an integer greater or equal to the
350 int maxArcId() const { return -1; }
352 template <typename _Digraph>
356 checkConcept<Base, _Digraph >();
357 typename _Digraph::Node node;
359 int nid = digraph.id(node);
360 nid = digraph.id(node);
361 node = digraph.nodeFromId(nid);
362 typename _Digraph::Arc arc;
364 int eid = digraph.id(arc);
365 eid = digraph.id(arc);
366 arc = digraph.arcFromId(eid);
368 nid = digraph.maxNodeId();
369 ignore_unused_variable_warning(nid);
370 eid = digraph.maxArcId();
371 ignore_unused_variable_warning(eid);
374 const _Digraph& digraph;
379 /// \brief Skeleton class for \e idable undirected graphs.
381 /// This class describes the interface of \e idable undirected
382 /// graphs. It extends \ref IDableDigraphComponent with the core ID
383 /// functions of undirected graphs.
384 /// The ids of the items must be unique and immutable.
385 /// This concept is part of the Graph concept.
386 template <typename BAS = BaseGraphComponent>
387 class IDableGraphComponent : public IDableDigraphComponent<BAS> {
391 typedef typename Base::Edge Edge;
393 using IDableDigraphComponent<Base>::id;
395 /// \brief Return a unique integer id for the given edge.
397 /// This function returns a unique integer id for the given edge.
398 int id(const Edge&) const { return -1; }
400 /// \brief Return the edge by its unique id.
402 /// This function returns the edge by its unique id.
403 /// If the graph does not contain an edge with the given id,
404 /// then the result of the function is undefined.
405 Edge edgeFromId(int) const { return INVALID; }
407 /// \brief Return an integer greater or equal to the maximum
410 /// This function returns an integer greater or equal to the
412 int maxEdgeId() const { return -1; }
414 template <typename _Graph>
418 checkConcept<IDableDigraphComponent<Base>, _Graph >();
419 typename _Graph::Edge edge;
420 int ueid = graph.id(edge);
421 ueid = graph.id(edge);
422 edge = graph.edgeFromId(ueid);
423 ueid = graph.maxEdgeId();
424 ignore_unused_variable_warning(ueid);
432 /// \brief Concept class for \c NodeIt, \c ArcIt and \c EdgeIt types.
434 /// This class describes the concept of \c NodeIt, \c ArcIt and
435 /// \c EdgeIt subtypes of digraph and graph types.
436 template <typename GR, typename Item>
437 class GraphItemIt : public Item {
439 /// \brief Default constructor.
441 /// Default constructor.
442 /// \warning The default constructor is not required to set
443 /// the iterator to some well-defined value. So you should consider it
444 /// as uninitialized.
447 /// \brief Copy constructor.
449 /// Copy constructor.
450 GraphItemIt(const GraphItemIt& it) : Item(it) {}
452 /// \brief Constructor that sets the iterator to the first item.
454 /// Constructor that sets the iterator to the first item.
455 explicit GraphItemIt(const GR&) {}
457 /// \brief Constructor for conversion from \c INVALID.
459 /// Constructor for conversion from \c INVALID.
460 /// It initializes the iterator to be invalid.
461 /// \sa Invalid for more details.
462 GraphItemIt(Invalid) {}
464 /// \brief Assignment operator.
466 /// Assignment operator for the iterator.
467 GraphItemIt& operator=(const GraphItemIt&) { return *this; }
469 /// \brief Increment the iterator.
471 /// This operator increments the iterator, i.e. assigns it to the
473 GraphItemIt& operator++() { return *this; }
475 /// \brief Equality operator
477 /// Equality operator.
478 /// Two iterators are equal if and only if they point to the
479 /// same object or both are invalid.
480 bool operator==(const GraphItemIt&) const { return true;}
482 /// \brief Inequality operator
484 /// Inequality operator.
485 /// Two iterators are equal if and only if they point to the
486 /// same object or both are invalid.
487 bool operator!=(const GraphItemIt&) const { return true;}
489 template<typename _GraphItemIt>
492 checkConcept<GraphItem<>, _GraphItemIt>();
495 _GraphItemIt it3 = it1;
496 _GraphItemIt it4 = INVALID;
497 ignore_unused_variable_warning(it3);
498 ignore_unused_variable_warning(it4);
512 /// \brief Concept class for \c InArcIt, \c OutArcIt and
513 /// \c IncEdgeIt types.
515 /// This class describes the concept of \c InArcIt, \c OutArcIt
516 /// and \c IncEdgeIt subtypes of digraph and graph types.
518 /// \note Since these iterator classes do not inherit from the same
519 /// base class, there is an additional template parameter (selector)
520 /// \c sel. For \c InArcIt you should instantiate it with character
521 /// \c 'i', for \c OutArcIt with \c 'o' and for \c IncEdgeIt with \c 'e'.
522 template <typename GR,
523 typename Item = typename GR::Arc,
524 typename Base = typename GR::Node,
526 class GraphIncIt : public Item {
528 /// \brief Default constructor.
530 /// Default constructor.
531 /// \warning The default constructor is not required to set
532 /// the iterator to some well-defined value. So you should consider it
533 /// as uninitialized.
536 /// \brief Copy constructor.
538 /// Copy constructor.
539 GraphIncIt(const GraphIncIt& it) : Item(it) {}
541 /// \brief Constructor that sets the iterator to the first
542 /// incoming or outgoing arc.
544 /// Constructor that sets the iterator to the first arc
545 /// incoming to or outgoing from the given node.
546 explicit GraphIncIt(const GR&, const Base&) {}
548 /// \brief Constructor for conversion from \c INVALID.
550 /// Constructor for conversion from \c INVALID.
551 /// It initializes the iterator to be invalid.
552 /// \sa Invalid for more details.
553 GraphIncIt(Invalid) {}
555 /// \brief Assignment operator.
557 /// Assignment operator for the iterator.
558 GraphIncIt& operator=(const GraphIncIt&) { return *this; }
560 /// \brief Increment the iterator.
562 /// This operator increments the iterator, i.e. assigns it to the
563 /// next arc incoming to or outgoing from the given node.
564 GraphIncIt& operator++() { return *this; }
566 /// \brief Equality operator
568 /// Equality operator.
569 /// Two iterators are equal if and only if they point to the
570 /// same object or both are invalid.
571 bool operator==(const GraphIncIt&) const { return true;}
573 /// \brief Inequality operator
575 /// Inequality operator.
576 /// Two iterators are equal if and only if they point to the
577 /// same object or both are invalid.
578 bool operator!=(const GraphIncIt&) const { return true;}
580 template <typename _GraphIncIt>
583 checkConcept<GraphItem<sel>, _GraphIncIt>();
584 _GraphIncIt it1(graph, node);
586 _GraphIncIt it3 = it1;
587 _GraphIncIt it4 = INVALID;
588 ignore_unused_variable_warning(it3);
589 ignore_unused_variable_warning(it4);
603 /// \brief Skeleton class for iterable directed graphs.
605 /// This class describes the interface of iterable directed
606 /// graphs. It extends \ref BaseDigraphComponent with the core
607 /// iterable interface.
608 /// This concept is part of the Digraph concept.
609 template <typename BAS = BaseDigraphComponent>
610 class IterableDigraphComponent : public BAS {
615 typedef typename Base::Node Node;
616 typedef typename Base::Arc Arc;
618 typedef IterableDigraphComponent Digraph;
620 /// \name Base Iteration
622 /// This interface provides functions for iteration on digraph items.
626 /// \brief Return the first node.
628 /// This function gives back the first node in the iteration order.
629 void first(Node&) const {}
631 /// \brief Return the next node.
633 /// This function gives back the next node in the iteration order.
634 void next(Node&) const {}
636 /// \brief Return the first arc.
638 /// This function gives back the first arc in the iteration order.
639 void first(Arc&) const {}
641 /// \brief Return the next arc.
643 /// This function gives back the next arc in the iteration order.
644 void next(Arc&) const {}
646 /// \brief Return the first arc incomming to the given node.
648 /// This function gives back the first arc incomming to the
650 void firstIn(Arc&, const Node&) const {}
652 /// \brief Return the next arc incomming to the given node.
654 /// This function gives back the next arc incomming to the
656 void nextIn(Arc&) const {}
658 /// \brief Return the first arc outgoing form the given node.
660 /// This function gives back the first arc outgoing form the
662 void firstOut(Arc&, const Node&) const {}
664 /// \brief Return the next arc outgoing form the given node.
666 /// This function gives back the next arc outgoing form the
668 void nextOut(Arc&) const {}
672 /// \name Class Based Iteration
674 /// This interface provides iterator classes for digraph items.
678 /// \brief This iterator goes through each node.
680 /// This iterator goes through each node.
682 typedef GraphItemIt<Digraph, Node> NodeIt;
684 /// \brief This iterator goes through each arc.
686 /// This iterator goes through each arc.
688 typedef GraphItemIt<Digraph, Arc> ArcIt;
690 /// \brief This iterator goes trough the incoming arcs of a node.
692 /// This iterator goes trough the \e incoming arcs of a certain node
694 typedef GraphIncIt<Digraph, Arc, Node, 'i'> InArcIt;
696 /// \brief This iterator goes trough the outgoing arcs of a node.
698 /// This iterator goes trough the \e outgoing arcs of a certain node
700 typedef GraphIncIt<Digraph, Arc, Node, 'o'> OutArcIt;
702 /// \brief The base node of the iterator.
704 /// This function gives back the base node of the iterator.
705 /// It is always the target node of the pointed arc.
706 Node baseNode(const InArcIt&) const { return INVALID; }
708 /// \brief The running node of the iterator.
710 /// This function gives back the running node of the iterator.
711 /// It is always the source node of the pointed arc.
712 Node runningNode(const InArcIt&) const { return INVALID; }
714 /// \brief The base node of the iterator.
716 /// This function gives back the base node of the iterator.
717 /// It is always the source node of the pointed arc.
718 Node baseNode(const OutArcIt&) const { return INVALID; }
720 /// \brief The running node of the iterator.
722 /// This function gives back the running node of the iterator.
723 /// It is always the target node of the pointed arc.
724 Node runningNode(const OutArcIt&) const { return INVALID; }
728 template <typename _Digraph>
731 checkConcept<Base, _Digraph>();
734 typename _Digraph::Node node(INVALID);
735 typename _Digraph::Arc arc(INVALID);
745 digraph.firstIn(arc, node);
749 digraph.firstOut(arc, node);
750 digraph.nextOut(arc);
755 checkConcept<GraphItemIt<_Digraph, typename _Digraph::Arc>,
756 typename _Digraph::ArcIt >();
757 checkConcept<GraphItemIt<_Digraph, typename _Digraph::Node>,
758 typename _Digraph::NodeIt >();
759 checkConcept<GraphIncIt<_Digraph, typename _Digraph::Arc,
760 typename _Digraph::Node, 'i'>, typename _Digraph::InArcIt>();
761 checkConcept<GraphIncIt<_Digraph, typename _Digraph::Arc,
762 typename _Digraph::Node, 'o'>, typename _Digraph::OutArcIt>();
764 typename _Digraph::Node n;
765 const typename _Digraph::InArcIt iait(INVALID);
766 const typename _Digraph::OutArcIt oait(INVALID);
767 n = digraph.baseNode(iait);
768 n = digraph.runningNode(iait);
769 n = digraph.baseNode(oait);
770 n = digraph.runningNode(oait);
771 ignore_unused_variable_warning(n);
775 const _Digraph& digraph;
780 /// \brief Skeleton class for iterable undirected graphs.
782 /// This class describes the interface of iterable undirected
783 /// graphs. It extends \ref IterableDigraphComponent with the core
784 /// iterable interface of undirected graphs.
785 /// This concept is part of the Graph concept.
786 template <typename BAS = BaseGraphComponent>
787 class IterableGraphComponent : public IterableDigraphComponent<BAS> {
791 typedef typename Base::Node Node;
792 typedef typename Base::Arc Arc;
793 typedef typename Base::Edge Edge;
796 typedef IterableGraphComponent Graph;
798 /// \name Base Iteration
800 /// This interface provides functions for iteration on edges.
804 using IterableDigraphComponent<Base>::first;
805 using IterableDigraphComponent<Base>::next;
807 /// \brief Return the first edge.
809 /// This function gives back the first edge in the iteration order.
810 void first(Edge&) const {}
812 /// \brief Return the next edge.
814 /// This function gives back the next edge in the iteration order.
815 void next(Edge&) const {}
817 /// \brief Return the first edge incident to the given node.
819 /// This function gives back the first edge incident to the given
820 /// node. The bool parameter gives back the direction for which the
821 /// source node of the directed arc representing the edge is the
823 void firstInc(Edge&, bool&, const Node&) const {}
825 /// \brief Gives back the next of the edges from the
828 /// This function gives back the next edge incident to the given
829 /// node. The bool parameter should be used as \c firstInc() use it.
830 void nextInc(Edge&, bool&) const {}
832 using IterableDigraphComponent<Base>::baseNode;
833 using IterableDigraphComponent<Base>::runningNode;
837 /// \name Class Based Iteration
839 /// This interface provides iterator classes for edges.
843 /// \brief This iterator goes through each edge.
845 /// This iterator goes through each edge.
846 typedef GraphItemIt<Graph, Edge> EdgeIt;
848 /// \brief This iterator goes trough the incident edges of a
851 /// This iterator goes trough the incident edges of a certain
853 typedef GraphIncIt<Graph, Edge, Node, 'e'> IncEdgeIt;
855 /// \brief The base node of the iterator.
857 /// This function gives back the base node of the iterator.
858 Node baseNode(const IncEdgeIt&) const { return INVALID; }
860 /// \brief The running node of the iterator.
862 /// This function gives back the running node of the iterator.
863 Node runningNode(const IncEdgeIt&) const { return INVALID; }
867 template <typename _Graph>
870 checkConcept<IterableDigraphComponent<Base>, _Graph>();
873 typename _Graph::Node node(INVALID);
874 typename _Graph::Edge edge(INVALID);
881 graph.firstInc(edge, dir, node);
882 graph.nextInc(edge, dir);
888 checkConcept<GraphItemIt<_Graph, typename _Graph::Edge>,
889 typename _Graph::EdgeIt >();
890 checkConcept<GraphIncIt<_Graph, typename _Graph::Edge,
891 typename _Graph::Node, 'e'>, typename _Graph::IncEdgeIt>();
893 typename _Graph::Node n;
894 const typename _Graph::IncEdgeIt ieit(INVALID);
895 n = graph.baseNode(ieit);
896 n = graph.runningNode(ieit);
905 /// \brief Skeleton class for alterable directed graphs.
907 /// This class describes the interface of alterable directed
908 /// graphs. It extends \ref BaseDigraphComponent with the alteration
909 /// notifier interface. It implements
910 /// an observer-notifier pattern for each digraph item. More
911 /// obsevers can be registered into the notifier and whenever an
912 /// alteration occured in the digraph all the observers will be
913 /// notified about it.
914 template <typename BAS = BaseDigraphComponent>
915 class AlterableDigraphComponent : public BAS {
919 typedef typename Base::Node Node;
920 typedef typename Base::Arc Arc;
923 /// Node alteration notifier class.
924 typedef AlterationNotifier<AlterableDigraphComponent, Node>
926 /// Arc alteration notifier class.
927 typedef AlterationNotifier<AlterableDigraphComponent, Arc>
930 /// \brief Return the node alteration notifier.
932 /// This function gives back the node alteration notifier.
933 NodeNotifier& notifier(Node) const {
934 return NodeNotifier();
937 /// \brief Return the arc alteration notifier.
939 /// This function gives back the arc alteration notifier.
940 ArcNotifier& notifier(Arc) const {
941 return ArcNotifier();
944 template <typename _Digraph>
947 checkConcept<Base, _Digraph>();
948 typename _Digraph::NodeNotifier& nn
949 = digraph.notifier(typename _Digraph::Node());
951 typename _Digraph::ArcNotifier& en
952 = digraph.notifier(typename _Digraph::Arc());
954 ignore_unused_variable_warning(nn);
955 ignore_unused_variable_warning(en);
958 const _Digraph& digraph;
963 /// \brief Skeleton class for alterable undirected graphs.
965 /// This class describes the interface of alterable undirected
966 /// graphs. It extends \ref AlterableDigraphComponent with the alteration
967 /// notifier interface of undirected graphs. It implements
968 /// an observer-notifier pattern for the edges. More
969 /// obsevers can be registered into the notifier and whenever an
970 /// alteration occured in the graph all the observers will be
971 /// notified about it.
972 template <typename BAS = BaseGraphComponent>
973 class AlterableGraphComponent : public AlterableDigraphComponent<BAS> {
977 typedef typename Base::Edge Edge;
980 /// Edge alteration notifier class.
981 typedef AlterationNotifier<AlterableGraphComponent, Edge>
984 /// \brief Return the edge alteration notifier.
986 /// This function gives back the edge alteration notifier.
987 EdgeNotifier& notifier(Edge) const {
988 return EdgeNotifier();
991 template <typename _Graph>
994 checkConcept<AlterableDigraphComponent<Base>, _Graph>();
995 typename _Graph::EdgeNotifier& uen
996 = graph.notifier(typename _Graph::Edge());
997 ignore_unused_variable_warning(uen);
1000 const _Graph& graph;
1005 /// \brief Concept class for standard graph maps.
1007 /// This class describes the concept of standard graph maps, i.e.
1008 /// the \c NodeMap, \c ArcMap and \c EdgeMap subtypes of digraph and
1009 /// graph types, which can be used for associating data to graph items.
1010 /// The standard graph maps must conform to the ReferenceMap concept.
1011 template <typename GR, typename K, typename V>
1012 class GraphMap : public ReferenceMap<K, V, V&, const V&> {
1013 typedef ReferenceMap<K, V, V&, const V&> Parent;
1017 /// The key type of the map.
1019 /// The value type of the map.
1021 /// The reference type of the map.
1022 typedef Value& Reference;
1023 /// The const reference type of the map.
1024 typedef const Value& ConstReference;
1026 // The reference map tag.
1027 typedef True ReferenceMapTag;
1029 /// \brief Construct a new map.
1031 /// Construct a new map for the graph.
1032 explicit GraphMap(const GR&) {}
1033 /// \brief Construct a new map with default value.
1035 /// Construct a new map for the graph and initalize the values.
1036 GraphMap(const GR&, const Value&) {}
1039 /// \brief Copy constructor.
1041 /// Copy Constructor.
1042 GraphMap(const GraphMap&) : Parent() {}
1044 /// \brief Assignment operator.
1046 /// Assignment operator. It does not mofify the underlying graph,
1047 /// it just iterates on the current item set and set the map
1048 /// with the value returned by the assigned map.
1049 template <typename CMap>
1050 GraphMap& operator=(const CMap&) {
1051 checkConcept<ReadMap<Key, Value>, CMap>();
1056 template<typename _Map>
1057 struct Constraints {
1058 void constraints() {
1060 <ReferenceMap<Key, Value, Value&, const Value&>, _Map>();
1067 // Assignment operator
1068 // ReadMap<Key, Value> cmap;
1071 ignore_unused_variable_warning(m1);
1072 ignore_unused_variable_warning(m2);
1073 // ignore_unused_variable_warning(m3);
1078 const typename GraphMap::Value &t;
1084 /// \brief Skeleton class for mappable directed graphs.
1086 /// This class describes the interface of mappable directed graphs.
1087 /// It extends \ref BaseDigraphComponent with the standard digraph
1088 /// map classes, namely \c NodeMap and \c ArcMap.
1089 /// This concept is part of the Digraph concept.
1090 template <typename BAS = BaseDigraphComponent>
1091 class MappableDigraphComponent : public BAS {
1095 typedef typename Base::Node Node;
1096 typedef typename Base::Arc Arc;
1098 typedef MappableDigraphComponent Digraph;
1100 /// \brief Standard graph map for the nodes.
1102 /// Standard graph map for the nodes.
1103 /// It conforms to the ReferenceMap concept.
1104 template <typename V>
1105 class NodeMap : public GraphMap<MappableDigraphComponent, Node, V> {
1106 typedef GraphMap<MappableDigraphComponent, Node, V> Parent;
1109 /// \brief Construct a new map.
1111 /// Construct a new map for the digraph.
1112 explicit NodeMap(const MappableDigraphComponent& digraph)
1113 : Parent(digraph) {}
1115 /// \brief Construct a new map with default value.
1117 /// Construct a new map for the digraph and initalize the values.
1118 NodeMap(const MappableDigraphComponent& digraph, const V& value)
1119 : Parent(digraph, value) {}
1122 /// \brief Copy constructor.
1124 /// Copy Constructor.
1125 NodeMap(const NodeMap& nm) : Parent(nm) {}
1127 /// \brief Assignment operator.
1129 /// Assignment operator.
1130 template <typename CMap>
1131 NodeMap& operator=(const CMap&) {
1132 checkConcept<ReadMap<Node, V>, CMap>();
1138 /// \brief Standard graph map for the arcs.
1140 /// Standard graph map for the arcs.
1141 /// It conforms to the ReferenceMap concept.
1142 template <typename V>
1143 class ArcMap : public GraphMap<MappableDigraphComponent, Arc, V> {
1144 typedef GraphMap<MappableDigraphComponent, Arc, V> Parent;
1147 /// \brief Construct a new map.
1149 /// Construct a new map for the digraph.
1150 explicit ArcMap(const MappableDigraphComponent& digraph)
1151 : Parent(digraph) {}
1153 /// \brief Construct a new map with default value.
1155 /// Construct a new map for the digraph and initalize the values.
1156 ArcMap(const MappableDigraphComponent& digraph, const V& value)
1157 : Parent(digraph, value) {}
1160 /// \brief Copy constructor.
1162 /// Copy Constructor.
1163 ArcMap(const ArcMap& nm) : Parent(nm) {}
1165 /// \brief Assignment operator.
1167 /// Assignment operator.
1168 template <typename CMap>
1169 ArcMap& operator=(const CMap&) {
1170 checkConcept<ReadMap<Arc, V>, CMap>();
1177 template <typename _Digraph>
1178 struct Constraints {
1182 Dummy() : value(0) {}
1183 Dummy(int _v) : value(_v) {}
1186 void constraints() {
1187 checkConcept<Base, _Digraph>();
1189 typedef typename _Digraph::template NodeMap<int> IntNodeMap;
1190 checkConcept<GraphMap<_Digraph, typename _Digraph::Node, int>,
1192 } { // bool map test
1193 typedef typename _Digraph::template NodeMap<bool> BoolNodeMap;
1194 checkConcept<GraphMap<_Digraph, typename _Digraph::Node, bool>,
1196 } { // Dummy map test
1197 typedef typename _Digraph::template NodeMap<Dummy> DummyNodeMap;
1198 checkConcept<GraphMap<_Digraph, typename _Digraph::Node, Dummy>,
1203 typedef typename _Digraph::template ArcMap<int> IntArcMap;
1204 checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, int>,
1206 } { // bool map test
1207 typedef typename _Digraph::template ArcMap<bool> BoolArcMap;
1208 checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, bool>,
1210 } { // Dummy map test
1211 typedef typename _Digraph::template ArcMap<Dummy> DummyArcMap;
1212 checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, Dummy>,
1217 const _Digraph& digraph;
1222 /// \brief Skeleton class for mappable undirected graphs.
1224 /// This class describes the interface of mappable undirected graphs.
1225 /// It extends \ref MappableDigraphComponent with the standard graph
1226 /// map class for edges (\c EdgeMap).
1227 /// This concept is part of the Graph concept.
1228 template <typename BAS = BaseGraphComponent>
1229 class MappableGraphComponent : public MappableDigraphComponent<BAS> {
1233 typedef typename Base::Edge Edge;
1235 typedef MappableGraphComponent Graph;
1237 /// \brief Standard graph map for the edges.
1239 /// Standard graph map for the edges.
1240 /// It conforms to the ReferenceMap concept.
1241 template <typename V>
1242 class EdgeMap : public GraphMap<MappableGraphComponent, Edge, V> {
1243 typedef GraphMap<MappableGraphComponent, Edge, V> Parent;
1246 /// \brief Construct a new map.
1248 /// Construct a new map for the graph.
1249 explicit EdgeMap(const MappableGraphComponent& graph)
1252 /// \brief Construct a new map with default value.
1254 /// Construct a new map for the graph and initalize the values.
1255 EdgeMap(const MappableGraphComponent& graph, const V& value)
1256 : Parent(graph, value) {}
1259 /// \brief Copy constructor.
1261 /// Copy Constructor.
1262 EdgeMap(const EdgeMap& nm) : Parent(nm) {}
1264 /// \brief Assignment operator.
1266 /// Assignment operator.
1267 template <typename CMap>
1268 EdgeMap& operator=(const CMap&) {
1269 checkConcept<ReadMap<Edge, V>, CMap>();
1276 template <typename _Graph>
1277 struct Constraints {
1281 Dummy() : value(0) {}
1282 Dummy(int _v) : value(_v) {}
1285 void constraints() {
1286 checkConcept<MappableDigraphComponent<Base>, _Graph>();
1289 typedef typename _Graph::template EdgeMap<int> IntEdgeMap;
1290 checkConcept<GraphMap<_Graph, typename _Graph::Edge, int>,
1292 } { // bool map test
1293 typedef typename _Graph::template EdgeMap<bool> BoolEdgeMap;
1294 checkConcept<GraphMap<_Graph, typename _Graph::Edge, bool>,
1296 } { // Dummy map test
1297 typedef typename _Graph::template EdgeMap<Dummy> DummyEdgeMap;
1298 checkConcept<GraphMap<_Graph, typename _Graph::Edge, Dummy>,
1303 const _Graph& graph;
1308 /// \brief Skeleton class for extendable directed graphs.
1310 /// This class describes the interface of extendable directed graphs.
1311 /// It extends \ref BaseDigraphComponent with functions for adding
1312 /// nodes and arcs to the digraph.
1313 /// This concept requires \ref AlterableDigraphComponent.
1314 template <typename BAS = BaseDigraphComponent>
1315 class ExtendableDigraphComponent : public BAS {
1319 typedef typename Base::Node Node;
1320 typedef typename Base::Arc Arc;
1322 /// \brief Add a new node to the digraph.
1324 /// This function adds a new node to the digraph.
1329 /// \brief Add a new arc connecting the given two nodes.
1331 /// This function adds a new arc connecting the given two nodes
1333 Arc addArc(const Node&, const Node&) {
1337 template <typename _Digraph>
1338 struct Constraints {
1339 void constraints() {
1340 checkConcept<Base, _Digraph>();
1341 typename _Digraph::Node node_a, node_b;
1342 node_a = digraph.addNode();
1343 node_b = digraph.addNode();
1344 typename _Digraph::Arc arc;
1345 arc = digraph.addArc(node_a, node_b);
1353 /// \brief Skeleton class for extendable undirected graphs.
1355 /// This class describes the interface of extendable undirected graphs.
1356 /// It extends \ref BaseGraphComponent with functions for adding
1357 /// nodes and edges to the graph.
1358 /// This concept requires \ref AlterableGraphComponent.
1359 template <typename BAS = BaseGraphComponent>
1360 class ExtendableGraphComponent : public BAS {
1364 typedef typename Base::Node Node;
1365 typedef typename Base::Edge Edge;
1367 /// \brief Add a new node to the digraph.
1369 /// This function adds a new node to the digraph.
1374 /// \brief Add a new edge connecting the given two nodes.
1376 /// This function adds a new edge connecting the given two nodes
1378 Edge addEdge(const Node&, const Node&) {
1382 template <typename _Graph>
1383 struct Constraints {
1384 void constraints() {
1385 checkConcept<Base, _Graph>();
1386 typename _Graph::Node node_a, node_b;
1387 node_a = graph.addNode();
1388 node_b = graph.addNode();
1389 typename _Graph::Edge edge;
1390 edge = graph.addEdge(node_a, node_b);
1398 /// \brief Skeleton class for erasable directed graphs.
1400 /// This class describes the interface of erasable directed graphs.
1401 /// It extends \ref BaseDigraphComponent with functions for removing
1402 /// nodes and arcs from the digraph.
1403 /// This concept requires \ref AlterableDigraphComponent.
1404 template <typename BAS = BaseDigraphComponent>
1405 class ErasableDigraphComponent : public BAS {
1409 typedef typename Base::Node Node;
1410 typedef typename Base::Arc Arc;
1412 /// \brief Erase a node from the digraph.
1414 /// This function erases the given node from the digraph and all arcs
1415 /// connected to the node.
1416 void erase(const Node&) {}
1418 /// \brief Erase an arc from the digraph.
1420 /// This function erases the given arc from the digraph.
1421 void erase(const Arc&) {}
1423 template <typename _Digraph>
1424 struct Constraints {
1425 void constraints() {
1426 checkConcept<Base, _Digraph>();
1427 const typename _Digraph::Node node(INVALID);
1428 digraph.erase(node);
1429 const typename _Digraph::Arc arc(INVALID);
1438 /// \brief Skeleton class for erasable undirected graphs.
1440 /// This class describes the interface of erasable undirected graphs.
1441 /// It extends \ref BaseGraphComponent with functions for removing
1442 /// nodes and edges from the graph.
1443 /// This concept requires \ref AlterableGraphComponent.
1444 template <typename BAS = BaseGraphComponent>
1445 class ErasableGraphComponent : public BAS {
1449 typedef typename Base::Node Node;
1450 typedef typename Base::Edge Edge;
1452 /// \brief Erase a node from the graph.
1454 /// This function erases the given node from the graph and all edges
1455 /// connected to the node.
1456 void erase(const Node&) {}
1458 /// \brief Erase an edge from the digraph.
1460 /// This function erases the given edge from the digraph.
1461 void erase(const Edge&) {}
1463 template <typename _Graph>
1464 struct Constraints {
1465 void constraints() {
1466 checkConcept<Base, _Graph>();
1467 const typename _Graph::Node node(INVALID);
1469 const typename _Graph::Edge edge(INVALID);
1478 /// \brief Skeleton class for clearable directed graphs.
1480 /// This class describes the interface of clearable directed graphs.
1481 /// It extends \ref BaseDigraphComponent with a function for clearing
1483 /// This concept requires \ref AlterableDigraphComponent.
1484 template <typename BAS = BaseDigraphComponent>
1485 class ClearableDigraphComponent : public BAS {
1490 /// \brief Erase all nodes and arcs from the digraph.
1492 /// This function erases all nodes and arcs from the digraph.
1495 template <typename _Digraph>
1496 struct Constraints {
1497 void constraints() {
1498 checkConcept<Base, _Digraph>();
1507 /// \brief Skeleton class for clearable undirected graphs.
1509 /// This class describes the interface of clearable undirected graphs.
1510 /// It extends \ref BaseGraphComponent with a function for clearing
1512 /// This concept requires \ref AlterableGraphComponent.
1513 template <typename BAS = BaseGraphComponent>
1514 class ClearableGraphComponent : public ClearableDigraphComponent<BAS> {
1519 /// \brief Erase all nodes and edges from the graph.
1521 /// This function erases all nodes and edges from the graph.
1524 template <typename _Graph>
1525 struct Constraints {
1526 void constraints() {
1527 checkConcept<Base, _Graph>();