1 /* -*- mode: C++; indent-tabs-mode: nil; -*- |
1 /* -*- mode: C++; indent-tabs-mode: nil; -*- |
2 * |
2 * |
3 * This file is a part of LEMON, a generic C++ optimization library. |
3 * This file is a part of LEMON, a generic C++ optimization library. |
4 * |
4 * |
5 * Copyright (C) 2003-2009 |
5 * Copyright (C) 2003-2010 |
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
7 * (Egervary Research Group on Combinatorial Optimization, EGRES). |
7 * (Egervary Research Group on Combinatorial Optimization, EGRES). |
8 * |
8 * |
9 * Permission to use, modify and distribute this software is granted |
9 * Permission to use, modify and distribute this software is granted |
10 * provided that this copyright notice appears in all copies. For |
10 * provided that this copyright notice appears in all copies. For |
36 /// This class describes the concept of \c Node, \c Arc and \c Edge |
36 /// This class describes the concept of \c Node, \c Arc and \c Edge |
37 /// subtypes of digraph and graph types. |
37 /// subtypes of digraph and graph types. |
38 /// |
38 /// |
39 /// \note This class is a template class so that we can use it to |
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 |
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 |
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 |
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'. |
43 /// \c 'n', for \c Arc with \c 'a' and for \c Edge with \c 'e'. |
44 #ifndef DOXYGEN |
44 #ifndef DOXYGEN |
45 template <char sel = '0'> |
45 template <char sel = '0'> |
46 #endif |
46 #endif |
87 bool operator!=(const GraphItem&) const { return false; } |
87 bool operator!=(const GraphItem&) const { return false; } |
88 |
88 |
89 /// \brief Ordering operator. |
89 /// \brief Ordering operator. |
90 /// |
90 /// |
91 /// This operator defines an ordering of the items. |
91 /// This operator defines an ordering of the items. |
92 /// It makes possible to use graph item types as key types in |
92 /// It makes possible to use graph item types as key types in |
93 /// associative containers (e.g. \c std::map). |
93 /// associative containers (e.g. \c std::map). |
94 /// |
94 /// |
95 /// \note This operator only has to define some strict ordering of |
95 /// \note This operator only has to define some strict ordering of |
96 /// the items; this order has nothing to do with the iteration |
96 /// the items; this order has nothing to do with the iteration |
97 /// ordering of the items. |
97 /// ordering of the items. |
120 |
120 |
121 /// \brief Base skeleton class for directed graphs. |
121 /// \brief Base skeleton class for directed graphs. |
122 /// |
122 /// |
123 /// This class describes the base interface of directed graph types. |
123 /// This class describes the base interface of directed graph types. |
124 /// All digraph %concepts have to conform to this class. |
124 /// All digraph %concepts have to conform to this class. |
125 /// It just provides types for nodes and arcs and functions |
125 /// It just provides types for nodes and arcs and functions |
126 /// to get the source and the target nodes of arcs. |
126 /// to get the source and the target nodes of arcs. |
127 class BaseDigraphComponent { |
127 class BaseDigraphComponent { |
128 public: |
128 public: |
129 |
129 |
130 typedef BaseDigraphComponent Digraph; |
130 typedef BaseDigraphComponent Digraph; |
424 }; |
424 }; |
425 }; |
425 }; |
426 |
426 |
427 /// \brief Concept class for \c NodeIt, \c ArcIt and \c EdgeIt types. |
427 /// \brief Concept class for \c NodeIt, \c ArcIt and \c EdgeIt types. |
428 /// |
428 /// |
429 /// This class describes the concept of \c NodeIt, \c ArcIt and |
429 /// This class describes the concept of \c NodeIt, \c ArcIt and |
430 /// \c EdgeIt subtypes of digraph and graph types. |
430 /// \c EdgeIt subtypes of digraph and graph types. |
431 template <typename GR, typename Item> |
431 template <typename GR, typename Item> |
432 class GraphItemIt : public Item { |
432 class GraphItemIt : public Item { |
433 public: |
433 public: |
434 /// \brief Default constructor. |
434 /// \brief Default constructor. |
464 /// \brief Increment the iterator. |
464 /// \brief Increment the iterator. |
465 /// |
465 /// |
466 /// This operator increments the iterator, i.e. assigns it to the |
466 /// This operator increments the iterator, i.e. assigns it to the |
467 /// next item. |
467 /// next item. |
468 GraphItemIt& operator++() { return *this; } |
468 GraphItemIt& operator++() { return *this; } |
469 |
469 |
470 /// \brief Equality operator |
470 /// \brief Equality operator |
471 /// |
471 /// |
472 /// Equality operator. |
472 /// Equality operator. |
473 /// Two iterators are equal if and only if they point to the |
473 /// Two iterators are equal if and only if they point to the |
474 /// same object or both are invalid. |
474 /// same object or both are invalid. |
499 } |
499 } |
500 const GR& g; |
500 const GR& g; |
501 }; |
501 }; |
502 }; |
502 }; |
503 |
503 |
504 /// \brief Concept class for \c InArcIt, \c OutArcIt and |
504 /// \brief Concept class for \c InArcIt, \c OutArcIt and |
505 /// \c IncEdgeIt types. |
505 /// \c IncEdgeIt types. |
506 /// |
506 /// |
507 /// This class describes the concept of \c InArcIt, \c OutArcIt |
507 /// This class describes the concept of \c InArcIt, \c OutArcIt |
508 /// and \c IncEdgeIt subtypes of digraph and graph types. |
508 /// and \c IncEdgeIt subtypes of digraph and graph types. |
509 /// |
509 /// |
510 /// \note Since these iterator classes do not inherit from the same |
510 /// \note Since these iterator classes do not inherit from the same |
511 /// base class, there is an additional template parameter (selector) |
511 /// base class, there is an additional template parameter (selector) |
512 /// \c sel. For \c InArcIt you should instantiate it with character |
512 /// \c sel. For \c InArcIt you should instantiate it with character |
513 /// \c 'i', for \c OutArcIt with \c 'o' and for \c IncEdgeIt with \c 'e'. |
513 /// \c 'i', for \c OutArcIt with \c 'o' and for \c IncEdgeIt with \c 'e'. |
514 template <typename GR, |
514 template <typename GR, |
515 typename Item = typename GR::Arc, |
515 typename Item = typename GR::Arc, |
516 typename Base = typename GR::Node, |
516 typename Base = typename GR::Node, |
517 char sel = '0'> |
517 char sel = '0'> |
528 /// \brief Copy constructor. |
528 /// \brief Copy constructor. |
529 /// |
529 /// |
530 /// Copy constructor. |
530 /// Copy constructor. |
531 GraphIncIt(const GraphIncIt& it) : Item(it) {} |
531 GraphIncIt(const GraphIncIt& it) : Item(it) {} |
532 |
532 |
533 /// \brief Constructor that sets the iterator to the first |
533 /// \brief Constructor that sets the iterator to the first |
534 /// incoming or outgoing arc. |
534 /// incoming or outgoing arc. |
535 /// |
535 /// |
536 /// Constructor that sets the iterator to the first arc |
536 /// Constructor that sets the iterator to the first arc |
537 /// incoming to or outgoing from the given node. |
537 /// incoming to or outgoing from the given node. |
538 explicit GraphIncIt(const GR&, const Base&) {} |
538 explicit GraphIncIt(const GR&, const Base&) {} |
539 |
539 |
540 /// \brief Constructor for conversion from \c INVALID. |
540 /// \brief Constructor for conversion from \c INVALID. |
541 /// |
541 /// |
802 /// This function gives back the next edge in the iteration order. |
802 /// This function gives back the next edge in the iteration order. |
803 void next(Edge&) const {} |
803 void next(Edge&) const {} |
804 |
804 |
805 /// \brief Return the first edge incident to the given node. |
805 /// \brief Return the first edge incident to the given node. |
806 /// |
806 /// |
807 /// This function gives back the first edge incident to the given |
807 /// This function gives back the first edge incident to the given |
808 /// node. The bool parameter gives back the direction for which the |
808 /// node. The bool parameter gives back the direction for which the |
809 /// source node of the directed arc representing the edge is the |
809 /// source node of the directed arc representing the edge is the |
810 /// given node. |
810 /// given node. |
811 void firstInc(Edge&, bool&, const Node&) const {} |
811 void firstInc(Edge&, bool&, const Node&) const {} |
812 |
812 |
813 /// \brief Gives back the next of the edges from the |
813 /// \brief Gives back the next of the edges from the |
814 /// given node. |
814 /// given node. |
815 /// |
815 /// |
816 /// This function gives back the next edge incident to the given |
816 /// This function gives back the next edge incident to the given |
817 /// node. The bool parameter should be used as \c firstInc() use it. |
817 /// node. The bool parameter should be used as \c firstInc() use it. |
818 void nextInc(Edge&, bool&) const {} |
818 void nextInc(Edge&, bool&) const {} |
819 |
819 |
820 using IterableDigraphComponent<Base>::baseNode; |
820 using IterableDigraphComponent<Base>::baseNode; |
821 using IterableDigraphComponent<Base>::runningNode; |
821 using IterableDigraphComponent<Base>::runningNode; |
988 }; |
988 }; |
989 |
989 |
990 /// \brief Concept class for standard graph maps. |
990 /// \brief Concept class for standard graph maps. |
991 /// |
991 /// |
992 /// This class describes the concept of standard graph maps, i.e. |
992 /// This class describes the concept of standard graph maps, i.e. |
993 /// the \c NodeMap, \c ArcMap and \c EdgeMap subtypes of digraph and |
993 /// the \c NodeMap, \c ArcMap and \c EdgeMap subtypes of digraph and |
994 /// graph types, which can be used for associating data to graph items. |
994 /// graph types, which can be used for associating data to graph items. |
995 /// The standard graph maps must conform to the ReferenceMap concept. |
995 /// The standard graph maps must conform to the ReferenceMap concept. |
996 template <typename GR, typename K, typename V> |
996 template <typename GR, typename K, typename V> |
997 class GraphMap : public ReferenceMap<K, V, V&, const V&> { |
997 class GraphMap : public ReferenceMap<K, V, V&, const V&> { |
998 typedef ReferenceMap<K, V, V&, const V&> Parent; |
998 typedef ReferenceMap<K, V, V&, const V&> Parent; |
1043 void constraints() { |
1043 void constraints() { |
1044 checkConcept |
1044 checkConcept |
1045 <ReferenceMap<Key, Value, Value&, const Value&>, _Map>(); |
1045 <ReferenceMap<Key, Value, Value&, const Value&>, _Map>(); |
1046 _Map m1(g); |
1046 _Map m1(g); |
1047 _Map m2(g,t); |
1047 _Map m2(g,t); |
1048 |
1048 |
1049 // Copy constructor |
1049 // Copy constructor |
1050 // _Map m3(m); |
1050 // _Map m3(m); |
1051 |
1051 |
1052 // Assignment operator |
1052 // Assignment operator |
1053 // ReadMap<Key, Value> cmap; |
1053 // ReadMap<Key, Value> cmap; |
1066 }; |
1066 }; |
1067 |
1067 |
1068 /// \brief Skeleton class for mappable directed graphs. |
1068 /// \brief Skeleton class for mappable directed graphs. |
1069 /// |
1069 /// |
1070 /// This class describes the interface of mappable directed graphs. |
1070 /// This class describes the interface of mappable directed graphs. |
1071 /// It extends \ref BaseDigraphComponent with the standard digraph |
1071 /// It extends \ref BaseDigraphComponent with the standard digraph |
1072 /// map classes, namely \c NodeMap and \c ArcMap. |
1072 /// map classes, namely \c NodeMap and \c ArcMap. |
1073 /// This concept is part of the Digraph concept. |
1073 /// This concept is part of the Digraph concept. |
1074 template <typename BAS = BaseDigraphComponent> |
1074 template <typename BAS = BaseDigraphComponent> |
1075 class MappableDigraphComponent : public BAS { |
1075 class MappableDigraphComponent : public BAS { |
1076 public: |
1076 public: |
1203 }; |
1203 }; |
1204 |
1204 |
1205 /// \brief Skeleton class for mappable undirected graphs. |
1205 /// \brief Skeleton class for mappable undirected graphs. |
1206 /// |
1206 /// |
1207 /// This class describes the interface of mappable undirected graphs. |
1207 /// This class describes the interface of mappable undirected graphs. |
1208 /// It extends \ref MappableDigraphComponent with the standard graph |
1208 /// It extends \ref MappableDigraphComponent with the standard graph |
1209 /// map class for edges (\c EdgeMap). |
1209 /// map class for edges (\c EdgeMap). |
1210 /// This concept is part of the Graph concept. |
1210 /// This concept is part of the Graph concept. |
1211 template <typename BAS = BaseGraphComponent> |
1211 template <typename BAS = BaseGraphComponent> |
1212 class MappableGraphComponent : public MappableDigraphComponent<BAS> { |
1212 class MappableGraphComponent : public MappableDigraphComponent<BAS> { |
1213 public: |
1213 public: |
1288 }; |
1288 }; |
1289 |
1289 |
1290 /// \brief Skeleton class for extendable directed graphs. |
1290 /// \brief Skeleton class for extendable directed graphs. |
1291 /// |
1291 /// |
1292 /// This class describes the interface of extendable directed graphs. |
1292 /// This class describes the interface of extendable directed graphs. |
1293 /// It extends \ref BaseDigraphComponent with functions for adding |
1293 /// It extends \ref BaseDigraphComponent with functions for adding |
1294 /// nodes and arcs to the digraph. |
1294 /// nodes and arcs to the digraph. |
1295 /// This concept requires \ref AlterableDigraphComponent. |
1295 /// This concept requires \ref AlterableDigraphComponent. |
1296 template <typename BAS = BaseDigraphComponent> |
1296 template <typename BAS = BaseDigraphComponent> |
1297 class ExtendableDigraphComponent : public BAS { |
1297 class ExtendableDigraphComponent : public BAS { |
1298 public: |
1298 public: |
1332 }; |
1332 }; |
1333 |
1333 |
1334 /// \brief Skeleton class for extendable undirected graphs. |
1334 /// \brief Skeleton class for extendable undirected graphs. |
1335 /// |
1335 /// |
1336 /// This class describes the interface of extendable undirected graphs. |
1336 /// This class describes the interface of extendable undirected graphs. |
1337 /// It extends \ref BaseGraphComponent with functions for adding |
1337 /// It extends \ref BaseGraphComponent with functions for adding |
1338 /// nodes and edges to the graph. |
1338 /// nodes and edges to the graph. |
1339 /// This concept requires \ref AlterableGraphComponent. |
1339 /// This concept requires \ref AlterableGraphComponent. |
1340 template <typename BAS = BaseGraphComponent> |
1340 template <typename BAS = BaseGraphComponent> |
1341 class ExtendableGraphComponent : public BAS { |
1341 class ExtendableGraphComponent : public BAS { |
1342 public: |
1342 public: |
1376 }; |
1376 }; |
1377 |
1377 |
1378 /// \brief Skeleton class for erasable directed graphs. |
1378 /// \brief Skeleton class for erasable directed graphs. |
1379 /// |
1379 /// |
1380 /// This class describes the interface of erasable directed graphs. |
1380 /// This class describes the interface of erasable directed graphs. |
1381 /// It extends \ref BaseDigraphComponent with functions for removing |
1381 /// It extends \ref BaseDigraphComponent with functions for removing |
1382 /// nodes and arcs from the digraph. |
1382 /// nodes and arcs from the digraph. |
1383 /// This concept requires \ref AlterableDigraphComponent. |
1383 /// This concept requires \ref AlterableDigraphComponent. |
1384 template <typename BAS = BaseDigraphComponent> |
1384 template <typename BAS = BaseDigraphComponent> |
1385 class ErasableDigraphComponent : public BAS { |
1385 class ErasableDigraphComponent : public BAS { |
1386 public: |
1386 public: |
1389 typedef typename Base::Node Node; |
1389 typedef typename Base::Node Node; |
1390 typedef typename Base::Arc Arc; |
1390 typedef typename Base::Arc Arc; |
1391 |
1391 |
1392 /// \brief Erase a node from the digraph. |
1392 /// \brief Erase a node from the digraph. |
1393 /// |
1393 /// |
1394 /// This function erases the given node from the digraph and all arcs |
1394 /// This function erases the given node from the digraph and all arcs |
1395 /// connected to the node. |
1395 /// connected to the node. |
1396 void erase(const Node&) {} |
1396 void erase(const Node&) {} |
1397 |
1397 |
1398 /// \brief Erase an arc from the digraph. |
1398 /// \brief Erase an arc from the digraph. |
1399 /// |
1399 /// |
1415 }; |
1415 }; |
1416 |
1416 |
1417 /// \brief Skeleton class for erasable undirected graphs. |
1417 /// \brief Skeleton class for erasable undirected graphs. |
1418 /// |
1418 /// |
1419 /// This class describes the interface of erasable undirected graphs. |
1419 /// This class describes the interface of erasable undirected graphs. |
1420 /// It extends \ref BaseGraphComponent with functions for removing |
1420 /// It extends \ref BaseGraphComponent with functions for removing |
1421 /// nodes and edges from the graph. |
1421 /// nodes and edges from the graph. |
1422 /// This concept requires \ref AlterableGraphComponent. |
1422 /// This concept requires \ref AlterableGraphComponent. |
1423 template <typename BAS = BaseGraphComponent> |
1423 template <typename BAS = BaseGraphComponent> |
1424 class ErasableGraphComponent : public BAS { |
1424 class ErasableGraphComponent : public BAS { |
1425 public: |
1425 public: |