29 #include <lemon/bits/alteration_notifier.h> |
29 #include <lemon/bits/alteration_notifier.h> |
30 |
30 |
31 namespace lemon { |
31 namespace lemon { |
32 namespace concepts { |
32 namespace concepts { |
33 |
33 |
34 /// \brief Skeleton class for graph Node and Arc types |
34 /// \brief Concept class for \c Node, \c Arc and \c Edge types. |
35 /// |
35 /// |
36 /// This class describes the interface of Node and Arc (and Edge |
36 /// This class describes the concept of \c Node, \c Arc and \c Edge |
37 /// in undirected graphs) subtypes of 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 than Node |
40 /// create graph skeleton classes. The reason for this is that \c Node |
41 /// and Arc types should \em not derive from the same base class. |
41 /// and \c Arc (or \c Edge) types should \e not derive from the same |
42 /// For Node you should instantiate it with character 'n' and for Arc |
42 /// base class. For \c Node you should instantiate it with character |
43 /// with 'a'. |
43 /// \c 'n', for \c Arc with \c 'a' and for \c Edge with \c 'e'. |
44 |
|
45 #ifndef DOXYGEN |
44 #ifndef DOXYGEN |
46 template <char sel = '0'> |
45 template <char sel = '0'> |
47 #endif |
46 #endif |
48 class GraphItem { |
47 class GraphItem { |
49 public: |
48 public: |
50 /// \brief Default constructor. |
49 /// \brief Default constructor. |
51 /// |
50 /// |
|
51 /// Default constructor. |
52 /// \warning The default constructor is not required to set |
52 /// \warning The default constructor is not required to set |
53 /// the item to some well-defined value. So you should consider it |
53 /// the item to some well-defined value. So you should consider it |
54 /// as uninitialized. |
54 /// as uninitialized. |
55 GraphItem() {} |
55 GraphItem() {} |
|
56 |
56 /// \brief Copy constructor. |
57 /// \brief Copy constructor. |
57 /// |
58 /// |
58 /// Copy constructor. |
59 /// Copy constructor. |
59 /// |
|
60 GraphItem(const GraphItem &) {} |
60 GraphItem(const GraphItem &) {} |
61 /// \brief Invalid constructor \& conversion. |
61 |
62 /// |
62 /// \brief Constructor for conversion from \c INVALID. |
63 /// This constructor initializes the item to be invalid. |
63 /// |
|
64 /// Constructor for conversion from \c INVALID. |
|
65 /// It initializes the item to be invalid. |
64 /// \sa Invalid for more details. |
66 /// \sa Invalid for more details. |
65 GraphItem(Invalid) {} |
67 GraphItem(Invalid) {} |
66 /// \brief Assign operator for nodes. |
68 |
67 /// |
69 /// \brief Assignment operator. |
68 /// The nodes are assignable. |
70 /// |
69 /// |
71 /// Assignment operator for the item. |
70 GraphItem& operator=(GraphItem const&) { return *this; } |
72 GraphItem& operator=(const GraphItem&) { return *this; } |
|
73 |
71 /// \brief Equality operator. |
74 /// \brief Equality operator. |
72 /// |
75 /// |
73 /// Two iterators are equal if and only if they represents the |
76 /// Equality operator. |
74 /// same node in the graph or both are invalid. |
77 bool operator==(const GraphItem&) const { return false; } |
75 bool operator==(GraphItem) const { return false; } |
78 |
76 /// \brief Inequality operator. |
79 /// \brief Inequality operator. |
77 /// |
80 /// |
78 /// \sa operator==(const Node& n) |
81 /// Inequality operator. |
79 /// |
82 bool operator!=(const GraphItem&) const { return false; } |
80 bool operator!=(GraphItem) const { return false; } |
83 |
81 |
84 /// \brief Ordering operator. |
82 /// \brief Artificial ordering operator. |
85 /// |
83 /// |
86 /// This operator defines an ordering of the items. |
84 /// To allow the use of graph descriptors as key type in std::map or |
87 /// It makes possible to use graph item types as key types in |
85 /// similar associative container we require this. |
88 /// associative containers (e.g. \c std::map). |
86 /// |
89 /// |
87 /// \note This operator only have to define some strict ordering of |
90 /// \note This operator only have to define some strict ordering of |
88 /// the items; this order has nothing to do with the iteration |
91 /// the items; this order has nothing to do with the iteration |
89 /// ordering of the items. |
92 /// ordering of the items. |
90 bool operator<(GraphItem) const { return false; } |
93 bool operator<(const GraphItem&) const { return false; } |
91 |
94 |
92 template<typename _GraphItem> |
95 template<typename _GraphItem> |
93 struct Constraints { |
96 struct Constraints { |
94 void constraints() { |
97 void constraints() { |
95 _GraphItem i1; |
98 _GraphItem i1; |
97 _GraphItem i3 = INVALID; |
100 _GraphItem i3 = INVALID; |
98 |
101 |
99 i1 = i2 = i3; |
102 i1 = i2 = i3; |
100 |
103 |
101 bool b; |
104 bool b; |
102 // b = (ia == ib) && (ia != ib) && (ia < ib); |
|
103 b = (ia == ib) && (ia != ib); |
105 b = (ia == ib) && (ia != ib); |
104 b = (ia == INVALID) && (ib != INVALID); |
106 b = (ia == INVALID) && (ib != INVALID); |
105 b = (ia < ib); |
107 b = (ia < ib); |
106 } |
108 } |
107 |
109 |
108 const _GraphItem &ia; |
110 const _GraphItem &ia; |
109 const _GraphItem &ib; |
111 const _GraphItem &ib; |
110 }; |
112 }; |
111 }; |
113 }; |
112 |
114 |
113 /// \brief An empty base directed graph class. |
115 /// \brief Base skeleton class for directed graphs. |
114 /// |
116 /// |
115 /// This class provides the minimal set of features needed for a |
117 /// This class describes the base interface of directed graph types. |
116 /// directed graph structure. All digraph concepts have to |
118 /// All digraph %concepts have to conform to this class. |
117 /// conform to this base directed graph. It just provides types |
119 /// It just provides types for nodes and arcs and functions |
118 /// for nodes and arcs and functions to get the source and the |
120 /// to get the source and the target nodes of arcs. |
119 /// target of the arcs. |
|
120 class BaseDigraphComponent { |
121 class BaseDigraphComponent { |
121 public: |
122 public: |
122 |
123 |
123 typedef BaseDigraphComponent Digraph; |
124 typedef BaseDigraphComponent Digraph; |
124 |
125 |
125 /// \brief Node class of the digraph. |
126 /// \brief Node class of the digraph. |
126 /// |
127 /// |
127 /// This class represents the Nodes of the digraph. |
128 /// This class represents the nodes of the digraph. |
128 /// |
|
129 typedef GraphItem<'n'> Node; |
129 typedef GraphItem<'n'> Node; |
130 |
130 |
131 /// \brief Arc class of the digraph. |
131 /// \brief Arc class of the digraph. |
132 /// |
132 /// |
133 /// This class represents the Arcs of the digraph. |
133 /// This class represents the arcs of the digraph. |
134 /// |
134 typedef GraphItem<'a'> Arc; |
135 typedef GraphItem<'e'> Arc; |
135 |
136 |
136 /// \brief Return the source node of an arc. |
137 /// \brief Gives back the target node of an arc. |
137 /// |
138 /// |
138 /// This function returns the source node of an arc. |
139 /// Gives back the target node of an arc. |
139 Node source(const Arc&) const { return INVALID; } |
140 /// |
140 |
141 Node target(const Arc&) const { return INVALID;} |
141 /// \brief Return the target node of an arc. |
142 |
142 /// |
143 /// \brief Gives back the source node of an arc. |
143 /// This function returns the target node of an arc. |
144 /// |
144 Node target(const Arc&) const { return INVALID; } |
145 /// Gives back the source node of an arc. |
145 |
146 /// |
146 /// \brief Return the opposite node on the given arc. |
147 Node source(const Arc&) const { return INVALID;} |
147 /// |
148 |
148 /// This function returns the opposite node on the given arc. |
149 /// \brief Gives back the opposite node on the given arc. |
|
150 /// |
|
151 /// Gives back the opposite node on the given arc. |
|
152 Node oppositeNode(const Node&, const Arc&) const { |
149 Node oppositeNode(const Node&, const Arc&) const { |
153 return INVALID; |
150 return INVALID; |
154 } |
151 } |
155 |
152 |
156 template <typename _Digraph> |
153 template <typename _Digraph> |
172 |
169 |
173 const _Digraph& digraph; |
170 const _Digraph& digraph; |
174 }; |
171 }; |
175 }; |
172 }; |
176 |
173 |
177 /// \brief An empty base undirected graph class. |
174 /// \brief Base skeleton class for undirected graphs. |
178 /// |
175 /// |
179 /// This class provides the minimal set of features needed for an |
176 /// This class describes the base interface of undirected graph types. |
180 /// undirected graph structure. All undirected graph concepts have |
177 /// All graph %concepts have to conform to this class. |
181 /// to conform to this base graph. It just provides types for |
178 /// It extends the interface of \ref BaseDigraphComponent with an |
182 /// nodes, arcs and edges and functions to get the |
179 /// \c Edge type and functions to get the end nodes of edges, |
183 /// source and the target of the arcs and edges, |
180 /// to convert from arcs to edges and to get both direction of edges. |
184 /// conversion from arcs to edges and function to get |
|
185 /// both direction of the edges. |
|
186 class BaseGraphComponent : public BaseDigraphComponent { |
181 class BaseGraphComponent : public BaseDigraphComponent { |
187 public: |
182 public: |
188 typedef BaseDigraphComponent::Node Node; |
183 typedef BaseDigraphComponent::Node Node; |
189 typedef BaseDigraphComponent::Arc Arc; |
184 typedef BaseDigraphComponent::Arc Arc; |
190 /// \brief Undirected arc class of the graph. |
185 |
191 /// |
186 /// \brief Undirected edge class of the graph. |
192 /// This class represents the edges of the graph. |
187 /// |
193 /// The undirected graphs can be used as a directed graph which |
188 /// This class represents the undirected edges of the graph. |
194 /// for each arc contains the opposite arc too so the graph is |
189 /// Undirected graphs can be used as directed graphs, each edge is |
195 /// bidirected. The edge represents two opposite |
190 /// represented by two opposite directed arcs. |
196 /// directed arcs. |
191 class Edge : public GraphItem<'e'> { |
197 class Edge : public GraphItem<'u'> { |
|
198 public: |
192 public: |
199 typedef GraphItem<'u'> Parent; |
193 typedef GraphItem<'e'> Parent; |
|
194 |
200 /// \brief Default constructor. |
195 /// \brief Default constructor. |
201 /// |
196 /// |
|
197 /// Default constructor. |
202 /// \warning The default constructor is not required to set |
198 /// \warning The default constructor is not required to set |
203 /// the item to some well-defined value. So you should consider it |
199 /// the item to some well-defined value. So you should consider it |
204 /// as uninitialized. |
200 /// as uninitialized. |
205 Edge() {} |
201 Edge() {} |
|
202 |
206 /// \brief Copy constructor. |
203 /// \brief Copy constructor. |
207 /// |
204 /// |
208 /// Copy constructor. |
205 /// Copy constructor. |
209 /// |
|
210 Edge(const Edge &) : Parent() {} |
206 Edge(const Edge &) : Parent() {} |
211 /// \brief Invalid constructor \& conversion. |
207 |
212 /// |
208 /// \brief Constructor for conversion from \c INVALID. |
213 /// This constructor initializes the item to be invalid. |
209 /// |
|
210 /// Constructor for conversion from \c INVALID. |
|
211 /// It initializes the item to be invalid. |
214 /// \sa Invalid for more details. |
212 /// \sa Invalid for more details. |
215 Edge(Invalid) {} |
213 Edge(Invalid) {} |
216 /// \brief Converter from arc to edge. |
214 |
217 /// |
215 /// \brief Constructor for conversion from an arc. |
|
216 /// |
|
217 /// Constructor for conversion from an arc. |
218 /// Besides the core graph item functionality each arc should |
218 /// Besides the core graph item functionality each arc should |
219 /// be convertible to the represented edge. |
219 /// be convertible to the represented edge. |
220 Edge(const Arc&) {} |
220 Edge(const Arc&) {} |
221 /// \brief Assign arc to edge. |
221 |
222 /// |
222 /// \brief Assign an arc to an edge. |
|
223 /// |
|
224 /// This function assigns an arc to an edge. |
223 /// Besides the core graph item functionality each arc should |
225 /// Besides the core graph item functionality each arc should |
224 /// be convertible to the represented edge. |
226 /// be convertible to the represented edge. |
225 Edge& operator=(const Arc&) { return *this; } |
227 Edge& operator=(const Arc&) { return *this; } |
226 }; |
228 }; |
227 |
229 |
228 /// \brief Returns the direction of the arc. |
230 /// \brief Return one end node of an edge. |
|
231 /// |
|
232 /// This function returns one end node of an edge. |
|
233 Node u(const Edge&) const { return INVALID; } |
|
234 |
|
235 /// \brief Return the other end node of an edge. |
|
236 /// |
|
237 /// This function returns the other end node of an edge. |
|
238 Node v(const Edge&) const { return INVALID; } |
|
239 |
|
240 /// \brief Return a directed arc related to an edge. |
|
241 /// |
|
242 /// This function returns a directed arc from its direction and the |
|
243 /// represented edge. |
|
244 Arc direct(const Edge&, bool) const { return INVALID; } |
|
245 |
|
246 /// \brief Return a directed arc related to an edge. |
|
247 /// |
|
248 /// This function returns a directed arc from its source node and the |
|
249 /// represented edge. |
|
250 Arc direct(const Edge&, const Node&) const { return INVALID; } |
|
251 |
|
252 /// \brief Return the direction of the arc. |
229 /// |
253 /// |
230 /// Returns the direction of the arc. Each arc represents an |
254 /// Returns the direction of the arc. Each arc represents an |
231 /// edge with a direction. It gives back the |
255 /// edge with a direction. It gives back the |
232 /// direction. |
256 /// direction. |
233 bool direction(const Arc&) const { return true; } |
257 bool direction(const Arc&) const { return true; } |
234 |
258 |
235 /// \brief Returns the directed arc. |
259 /// \brief Return the opposite arc. |
236 /// |
260 /// |
237 /// Returns the directed arc from its direction and the |
261 /// This function returns the opposite arc, i.e. the arc representing |
238 /// represented edge. |
262 /// the same edge and has opposite direction. |
239 Arc direct(const Edge&, bool) const { return INVALID;} |
263 Arc oppositeArc(const Arc&) const { return INVALID; } |
240 |
|
241 /// \brief Returns the directed arc. |
|
242 /// |
|
243 /// Returns the directed arc from its source and the |
|
244 /// represented edge. |
|
245 Arc direct(const Edge&, const Node&) const { return INVALID;} |
|
246 |
|
247 /// \brief Returns the opposite arc. |
|
248 /// |
|
249 /// Returns the opposite arc. It is the arc representing the |
|
250 /// same edge and has opposite direction. |
|
251 Arc oppositeArc(const Arc&) const { return INVALID;} |
|
252 |
|
253 /// \brief Gives back one ending of an edge. |
|
254 /// |
|
255 /// Gives back one ending of an edge. |
|
256 Node u(const Edge&) const { return INVALID;} |
|
257 |
|
258 /// \brief Gives back the other ending of an edge. |
|
259 /// |
|
260 /// Gives back the other ending of an edge. |
|
261 Node v(const Edge&) const { return INVALID;} |
|
262 |
264 |
263 template <typename _Graph> |
265 template <typename _Graph> |
264 struct Constraints { |
266 struct Constraints { |
265 typedef typename _Graph::Node Node; |
267 typedef typename _Graph::Node Node; |
266 typedef typename _Graph::Arc Arc; |
268 typedef typename _Graph::Arc Arc; |
267 typedef typename _Graph::Edge Edge; |
269 typedef typename _Graph::Edge Edge; |
268 |
270 |
269 void constraints() { |
271 void constraints() { |
270 checkConcept<BaseDigraphComponent, _Graph>(); |
272 checkConcept<BaseDigraphComponent, _Graph>(); |
271 checkConcept<GraphItem<'u'>, Edge>(); |
273 checkConcept<GraphItem<'e'>, Edge>(); |
272 { |
274 { |
273 Node n; |
275 Node n; |
274 Edge ue(INVALID); |
276 Edge ue(INVALID); |
275 Arc e; |
277 Arc e; |
276 n = graph.u(ue); |
278 n = graph.u(ue); |
277 n = graph.v(ue); |
279 n = graph.v(ue); |
278 e = graph.direct(ue, true); |
280 e = graph.direct(ue, true); |
|
281 e = graph.direct(ue, false); |
279 e = graph.direct(ue, n); |
282 e = graph.direct(ue, n); |
280 e = graph.oppositeArc(e); |
283 e = graph.oppositeArc(e); |
281 ue = e; |
284 ue = e; |
282 bool d = graph.direction(e); |
285 bool d = graph.direction(e); |
283 ignore_unused_variable_warning(d); |
286 ignore_unused_variable_warning(d); |
287 const _Graph& graph; |
290 const _Graph& graph; |
288 }; |
291 }; |
289 |
292 |
290 }; |
293 }; |
291 |
294 |
292 /// \brief An empty idable base digraph class. |
295 /// \brief Skeleton class for \e idable directed graphs. |
293 /// |
296 /// |
294 /// This class provides beside the core digraph features |
297 /// This class describes the interface of \e idable directed graphs. |
295 /// core id functions for the digraph structure. |
298 /// It extends \ref BaseDigraphComponent with the core ID functions. |
296 /// The most of the base digraphs should conform to this concept. |
299 /// The ids of the items must be unique and immutable. |
297 /// The id's are unique and immutable. |
300 /// This concept is part of the Digraph concept. |
298 template <typename BAS = BaseDigraphComponent> |
301 template <typename BAS = BaseDigraphComponent> |
299 class IDableDigraphComponent : public BAS { |
302 class IDableDigraphComponent : public BAS { |
300 public: |
303 public: |
301 |
304 |
302 typedef BAS Base; |
305 typedef BAS Base; |
303 typedef typename Base::Node Node; |
306 typedef typename Base::Node Node; |
304 typedef typename Base::Arc Arc; |
307 typedef typename Base::Arc Arc; |
305 |
308 |
306 /// \brief Gives back an unique integer id for the Node. |
309 /// \brief Return a unique integer id for the given node. |
307 /// |
310 /// |
308 /// Gives back an unique integer id for the Node. |
311 /// This function returns a unique integer id for the given node. |
309 /// |
312 int id(const Node&) const { return -1; } |
310 int id(const Node&) const { return -1;} |
313 |
311 |
314 /// \brief Return the node by its unique id. |
312 /// \brief Gives back the node by the unique id. |
315 /// |
313 /// |
316 /// This function returns the node by its unique id. |
314 /// Gives back the node by the unique id. |
317 /// If the digraph does not contain a node with the given id, |
315 /// If the digraph does not contain node with the given id |
318 /// then the result of the function is undefined. |
316 /// then the result of the function is undetermined. |
319 Node nodeFromId(int) const { return INVALID; } |
317 Node nodeFromId(int) const { return INVALID;} |
320 |
318 |
321 /// \brief Return a unique integer id for the given arc. |
319 /// \brief Gives back an unique integer id for the Arc. |
322 /// |
320 /// |
323 /// This function returns a unique integer id for the given arc. |
321 /// Gives back an unique integer id for the Arc. |
324 int id(const Arc&) const { return -1; } |
322 /// |
325 |
323 int id(const Arc&) const { return -1;} |
326 /// \brief Return the arc by its unique id. |
324 |
327 /// |
325 /// \brief Gives back the arc by the unique id. |
328 /// This function returns the arc by its unique id. |
326 /// |
329 /// If the digraph does not contain an arc with the given id, |
327 /// Gives back the arc by the unique id. |
330 /// then the result of the function is undefined. |
328 /// If the digraph does not contain arc with the given id |
331 Arc arcFromId(int) const { return INVALID; } |
329 /// then the result of the function is undetermined. |
332 |
330 Arc arcFromId(int) const { return INVALID;} |
333 /// \brief Return an integer greater or equal to the maximum |
331 |
334 /// node id. |
332 /// \brief Gives back an integer greater or equal to the maximum |
335 /// |
333 /// Node id. |
336 /// This function returns an integer greater or equal to the |
334 /// |
337 /// maximum node id. |
335 /// Gives back an integer greater or equal to the maximum Node |
338 int maxNodeId() const { return -1; } |
336 /// id. |
339 |
337 int maxNodeId() const { return -1;} |
340 /// \brief Return an integer greater or equal to the maximum |
338 |
341 /// arc id. |
339 /// \brief Gives back an integer greater or equal to the maximum |
342 /// |
340 /// Arc id. |
343 /// This function returns an integer greater or equal to the |
341 /// |
344 /// maximum arc id. |
342 /// Gives back an integer greater or equal to the maximum Arc |
345 int maxArcId() const { return -1; } |
343 /// id. |
|
344 int maxArcId() const { return -1;} |
|
345 |
346 |
346 template <typename _Digraph> |
347 template <typename _Digraph> |
347 struct Constraints { |
348 struct Constraints { |
348 |
349 |
349 void constraints() { |
350 void constraints() { |
365 |
366 |
366 const _Digraph& digraph; |
367 const _Digraph& digraph; |
367 }; |
368 }; |
368 }; |
369 }; |
369 |
370 |
370 /// \brief An empty idable base undirected graph class. |
371 /// \brief Skeleton class for \e idable undirected graphs. |
371 /// |
372 /// |
372 /// This class provides beside the core undirected graph features |
373 /// This class describes the interface of \e idable undirected |
373 /// core id functions for the undirected graph structure. The |
374 /// graphs. It extends \ref IDableDigraphComponent with the core ID |
374 /// most of the base undirected graphs should conform to this |
375 /// functions of undirected graphs. |
375 /// concept. The id's are unique and immutable. |
376 /// The ids of the items must be unique and immutable. |
|
377 /// This concept is part of the Graph concept. |
376 template <typename BAS = BaseGraphComponent> |
378 template <typename BAS = BaseGraphComponent> |
377 class IDableGraphComponent : public IDableDigraphComponent<BAS> { |
379 class IDableGraphComponent : public IDableDigraphComponent<BAS> { |
378 public: |
380 public: |
379 |
381 |
380 typedef BAS Base; |
382 typedef BAS Base; |
381 typedef typename Base::Edge Edge; |
383 typedef typename Base::Edge Edge; |
382 |
384 |
383 using IDableDigraphComponent<Base>::id; |
385 using IDableDigraphComponent<Base>::id; |
384 |
386 |
385 /// \brief Gives back an unique integer id for the Edge. |
387 /// \brief Return a unique integer id for the given edge. |
386 /// |
388 /// |
387 /// Gives back an unique integer id for the Edge. |
389 /// This function returns a unique integer id for the given edge. |
388 /// |
390 int id(const Edge&) const { return -1; } |
389 int id(const Edge&) const { return -1;} |
391 |
390 |
392 /// \brief Return the edge by its unique id. |
391 /// \brief Gives back the edge by the unique id. |
393 /// |
392 /// |
394 /// This function returns the edge by its unique id. |
393 /// Gives back the edge by the unique id. If the |
395 /// If the graph does not contain an edge with the given id, |
394 /// graph does not contain arc with the given id then the |
396 /// then the result of the function is undefined. |
395 /// result of the function is undetermined. |
397 Edge edgeFromId(int) const { return INVALID; } |
396 Edge edgeFromId(int) const { return INVALID;} |
398 |
397 |
399 /// \brief Return an integer greater or equal to the maximum |
398 /// \brief Gives back an integer greater or equal to the maximum |
400 /// edge id. |
399 /// Edge id. |
401 /// |
400 /// |
402 /// This function returns an integer greater or equal to the |
401 /// Gives back an integer greater or equal to the maximum Edge |
403 /// maximum edge id. |
402 /// id. |
404 int maxEdgeId() const { return -1; } |
403 int maxEdgeId() const { return -1;} |
|
404 |
405 |
405 template <typename _Graph> |
406 template <typename _Graph> |
406 struct Constraints { |
407 struct Constraints { |
407 |
408 |
408 void constraints() { |
409 void constraints() { |
409 checkConcept<Base, _Graph >(); |
|
410 checkConcept<IDableDigraphComponent<Base>, _Graph >(); |
410 checkConcept<IDableDigraphComponent<Base>, _Graph >(); |
411 typename _Graph::Edge edge; |
411 typename _Graph::Edge edge; |
412 int ueid = graph.id(edge); |
412 int ueid = graph.id(edge); |
413 ueid = graph.id(edge); |
413 ueid = graph.id(edge); |
414 edge = graph.edgeFromId(ueid); |
414 edge = graph.edgeFromId(ueid); |
418 |
418 |
419 const _Graph& graph; |
419 const _Graph& graph; |
420 }; |
420 }; |
421 }; |
421 }; |
422 |
422 |
423 /// \brief Skeleton class for graph NodeIt and ArcIt |
423 /// \brief Concept class for \c NodeIt, \c ArcIt and \c EdgeIt types. |
424 /// |
424 /// |
425 /// Skeleton class for graph NodeIt and ArcIt. |
425 /// This class describes the concept of \c NodeIt, \c ArcIt and |
426 /// |
426 /// \c EdgeIt subtypes of digraph and graph types. |
427 template <typename GR, typename Item> |
427 template <typename GR, typename Item> |
428 class GraphItemIt : public Item { |
428 class GraphItemIt : public Item { |
429 public: |
429 public: |
430 /// \brief Default constructor. |
430 /// \brief Default constructor. |
431 /// |
431 /// |
432 /// @warning The default constructor sets the iterator |
432 /// Default constructor. |
433 /// to an undefined value. |
433 /// \warning The default constructor is not required to set |
|
434 /// the iterator to some well-defined value. So you should consider it |
|
435 /// as uninitialized. |
434 GraphItemIt() {} |
436 GraphItemIt() {} |
|
437 |
435 /// \brief Copy constructor. |
438 /// \brief Copy constructor. |
436 /// |
439 /// |
437 /// Copy constructor. |
440 /// Copy constructor. |
438 /// |
441 GraphItemIt(const GraphItemIt& it) : Item(it) {} |
439 GraphItemIt(const GraphItemIt& ) {} |
442 |
440 /// \brief Sets the iterator to the first item. |
443 /// \brief Constructor that sets the iterator to the first item. |
441 /// |
444 /// |
442 /// Sets the iterator to the first item of \c the graph. |
445 /// Constructor that sets the iterator to the first item. |
443 /// |
|
444 explicit GraphItemIt(const GR&) {} |
446 explicit GraphItemIt(const GR&) {} |
445 /// \brief Invalid constructor \& conversion. |
447 |
446 /// |
448 /// \brief Constructor for conversion from \c INVALID. |
447 /// This constructor initializes the item to be invalid. |
449 /// |
|
450 /// Constructor for conversion from \c INVALID. |
|
451 /// It initializes the iterator to be invalid. |
448 /// \sa Invalid for more details. |
452 /// \sa Invalid for more details. |
449 GraphItemIt(Invalid) {} |
453 GraphItemIt(Invalid) {} |
450 /// \brief Assign operator for items. |
454 |
451 /// |
455 /// \brief Assignment operator. |
452 /// The items are assignable. |
456 /// |
453 /// |
457 /// Assignment operator for the iterator. |
454 GraphItemIt& operator=(const GraphItemIt&) { return *this; } |
458 GraphItemIt& operator=(const GraphItemIt&) { return *this; } |
455 /// \brief Next item. |
459 |
456 /// |
460 /// \brief Increment the iterator. |
457 /// Assign the iterator to the next item. |
461 /// |
458 /// |
462 /// This operator increments the iterator, i.e. assigns it to the |
|
463 /// next item. |
459 GraphItemIt& operator++() { return *this; } |
464 GraphItemIt& operator++() { return *this; } |
|
465 |
460 /// \brief Equality operator |
466 /// \brief Equality operator |
461 /// |
467 /// |
|
468 /// Equality operator. |
462 /// Two iterators are equal if and only if they point to the |
469 /// Two iterators are equal if and only if they point to the |
463 /// same object or both are invalid. |
470 /// same object or both are invalid. |
464 bool operator==(const GraphItemIt&) const { return true;} |
471 bool operator==(const GraphItemIt&) const { return true;} |
|
472 |
465 /// \brief Inequality operator |
473 /// \brief Inequality operator |
466 /// |
474 /// |
467 /// \sa operator==(Node n) |
475 /// Inequality operator. |
468 /// |
476 /// Two iterators are equal if and only if they point to the |
|
477 /// same object or both are invalid. |
469 bool operator!=(const GraphItemIt&) const { return true;} |
478 bool operator!=(const GraphItemIt&) const { return true;} |
470 |
479 |
471 template<typename _GraphItemIt> |
480 template<typename _GraphItemIt> |
472 struct Constraints { |
481 struct Constraints { |
473 void constraints() { |
482 void constraints() { |
|
483 checkConcept<GraphItem<>, _GraphItemIt>(); |
474 _GraphItemIt it1(g); |
484 _GraphItemIt it1(g); |
475 _GraphItemIt it2; |
485 _GraphItemIt it2; |
|
486 _GraphItemIt it3 = it1; |
|
487 _GraphItemIt it4 = INVALID; |
476 |
488 |
477 it2 = ++it1; |
489 it2 = ++it1; |
478 ++it2 = it1; |
490 ++it2 = it1; |
479 ++(++it1); |
491 ++(++it1); |
480 |
492 |
481 Item bi = it1; |
493 Item bi = it1; |
482 bi = it2; |
494 bi = it2; |
483 } |
495 } |
484 GR& g; |
496 const GR& g; |
485 }; |
497 }; |
486 }; |
498 }; |
487 |
499 |
488 /// \brief Skeleton class for graph InArcIt and OutArcIt |
500 /// \brief Concept class for \c InArcIt, \c OutArcIt and |
489 /// |
501 /// \c IncEdgeIt types. |
490 /// \note Because InArcIt and OutArcIt may not inherit from the same |
502 /// |
491 /// base class, the \c sel is a additional template parameter (selector). |
503 /// This class describes the concept of \c InArcIt, \c OutArcIt |
492 /// For InArcIt you should instantiate it with character 'i' and for |
504 /// and \c IncEdgeIt subtypes of digraph and graph types. |
493 /// OutArcIt with 'o'. |
505 /// |
|
506 /// \note Since these iterator classes do not inherit from the same |
|
507 /// base class, there is an additional template parameter (selector) |
|
508 /// \c sel. For \c InArcIt you should instantiate it with character |
|
509 /// \c 'i', for \c OutArcIt with \c 'o' and for \c IncEdgeIt with \c 'e'. |
494 template <typename GR, |
510 template <typename GR, |
495 typename Item = typename GR::Arc, |
511 typename Item = typename GR::Arc, |
496 typename Base = typename GR::Node, |
512 typename Base = typename GR::Node, |
497 char sel = '0'> |
513 char sel = '0'> |
498 class GraphIncIt : public Item { |
514 class GraphIncIt : public Item { |
499 public: |
515 public: |
500 /// \brief Default constructor. |
516 /// \brief Default constructor. |
501 /// |
517 /// |
502 /// @warning The default constructor sets the iterator |
518 /// Default constructor. |
503 /// to an undefined value. |
519 /// \warning The default constructor is not required to set |
|
520 /// the iterator to some well-defined value. So you should consider it |
|
521 /// as uninitialized. |
504 GraphIncIt() {} |
522 GraphIncIt() {} |
|
523 |
505 /// \brief Copy constructor. |
524 /// \brief Copy constructor. |
506 /// |
525 /// |
507 /// Copy constructor. |
526 /// Copy constructor. |
508 /// |
527 GraphIncIt(const GraphIncIt& it) : Item(it) {} |
509 GraphIncIt(GraphIncIt const& gi) : Item(gi) {} |
528 |
510 /// \brief Sets the iterator to the first arc incoming into or outgoing |
529 /// \brief Constructor that sets the iterator to the first |
511 /// from the node. |
530 /// incoming or outgoing arc. |
512 /// |
531 /// |
513 /// Sets the iterator to the first arc incoming into or outgoing |
532 /// Constructor that sets the iterator to the first arc |
514 /// from the node. |
533 /// incoming to or outgoing from the given node. |
515 /// |
|
516 explicit GraphIncIt(const GR&, const Base&) {} |
534 explicit GraphIncIt(const GR&, const Base&) {} |
517 /// \brief Invalid constructor \& conversion. |
535 |
518 /// |
536 /// \brief Constructor for conversion from \c INVALID. |
519 /// This constructor initializes the item to be invalid. |
537 /// |
|
538 /// Constructor for conversion from \c INVALID. |
|
539 /// It initializes the iterator to be invalid. |
520 /// \sa Invalid for more details. |
540 /// \sa Invalid for more details. |
521 GraphIncIt(Invalid) {} |
541 GraphIncIt(Invalid) {} |
522 /// \brief Assign operator for iterators. |
542 |
523 /// |
543 /// \brief Assignment operator. |
524 /// The iterators are assignable. |
544 /// |
525 /// |
545 /// Assignment operator for the iterator. |
526 GraphIncIt& operator=(GraphIncIt const&) { return *this; } |
546 GraphIncIt& operator=(const GraphIncIt&) { return *this; } |
527 /// \brief Next item. |
547 |
528 /// |
548 /// \brief Increment the iterator. |
529 /// Assign the iterator to the next item. |
549 /// |
530 /// |
550 /// This operator increments the iterator, i.e. assigns it to the |
|
551 /// next arc incoming to or outgoing from the given node. |
531 GraphIncIt& operator++() { return *this; } |
552 GraphIncIt& operator++() { return *this; } |
532 |
553 |
533 /// \brief Equality operator |
554 /// \brief Equality operator |
534 /// |
555 /// |
|
556 /// Equality operator. |
535 /// Two iterators are equal if and only if they point to the |
557 /// Two iterators are equal if and only if they point to the |
536 /// same object or both are invalid. |
558 /// same object or both are invalid. |
537 bool operator==(const GraphIncIt&) const { return true;} |
559 bool operator==(const GraphIncIt&) const { return true;} |
538 |
560 |
539 /// \brief Inequality operator |
561 /// \brief Inequality operator |
540 /// |
562 /// |
541 /// \sa operator==(Node n) |
563 /// Inequality operator. |
542 /// |
564 /// Two iterators are equal if and only if they point to the |
|
565 /// same object or both are invalid. |
543 bool operator!=(const GraphIncIt&) const { return true;} |
566 bool operator!=(const GraphIncIt&) const { return true;} |
544 |
567 |
545 template <typename _GraphIncIt> |
568 template <typename _GraphIncIt> |
546 struct Constraints { |
569 struct Constraints { |
547 void constraints() { |
570 void constraints() { |
548 checkConcept<GraphItem<sel>, _GraphIncIt>(); |
571 checkConcept<GraphItem<sel>, _GraphIncIt>(); |
549 _GraphIncIt it1(graph, node); |
572 _GraphIncIt it1(graph, node); |
550 _GraphIncIt it2; |
573 _GraphIncIt it2; |
|
574 _GraphIncIt it3 = it1; |
|
575 _GraphIncIt it4 = INVALID; |
551 |
576 |
552 it2 = ++it1; |
577 it2 = ++it1; |
553 ++it2 = it1; |
578 ++it2 = it1; |
554 ++(++it1); |
579 ++(++it1); |
555 Item e = it1; |
580 Item e = it1; |
556 e = it2; |
581 e = it2; |
557 |
582 } |
558 } |
583 const Base& node; |
559 |
584 const GR& graph; |
560 Item arc; |
585 }; |
561 Base node; |
586 }; |
562 GR graph; |
587 |
563 _GraphIncIt it; |
588 /// \brief Skeleton class for iterable directed graphs. |
564 }; |
589 /// |
565 }; |
590 /// This class describes the interface of iterable directed |
566 |
591 /// graphs. It extends \ref BaseDigraphComponent with the core |
567 |
592 /// iterable interface. |
568 /// \brief An empty iterable digraph class. |
|
569 /// |
|
570 /// This class provides beside the core digraph features |
|
571 /// iterator based iterable interface for the digraph structure. |
|
572 /// This concept is part of the Digraph concept. |
593 /// This concept is part of the Digraph concept. |
573 template <typename BAS = BaseDigraphComponent> |
594 template <typename BAS = BaseDigraphComponent> |
574 class IterableDigraphComponent : public BAS { |
595 class IterableDigraphComponent : public BAS { |
575 |
596 |
576 public: |
597 public: |
581 |
602 |
582 typedef IterableDigraphComponent Digraph; |
603 typedef IterableDigraphComponent Digraph; |
583 |
604 |
584 /// \name Base iteration |
605 /// \name Base iteration |
585 /// |
606 /// |
586 /// This interface provides functions for iteration on digraph items |
607 /// This interface provides functions for iteration on digraph items. |
587 /// |
608 /// |
588 /// @{ |
609 /// @{ |
589 |
610 |
590 /// \brief Gives back the first node in the iterating order. |
611 /// \brief Return the first node. |
591 /// |
612 /// |
592 /// Gives back the first node in the iterating order. |
613 /// This function gives back the first node in the iteration order. |
593 /// |
|
594 void first(Node&) const {} |
614 void first(Node&) const {} |
595 |
615 |
596 /// \brief Gives back the next node in the iterating order. |
616 /// \brief Return the next node. |
597 /// |
617 /// |
598 /// Gives back the next node in the iterating order. |
618 /// This function gives back the next node in the iteration order. |
599 /// |
|
600 void next(Node&) const {} |
619 void next(Node&) const {} |
601 |
620 |
602 /// \brief Gives back the first arc in the iterating order. |
621 /// \brief Return the first arc. |
603 /// |
622 /// |
604 /// Gives back the first arc in the iterating order. |
623 /// This function gives back the first arc in the iteration order. |
605 /// |
|
606 void first(Arc&) const {} |
624 void first(Arc&) const {} |
607 |
625 |
608 /// \brief Gives back the next arc in the iterating order. |
626 /// \brief Return the next arc. |
609 /// |
627 /// |
610 /// Gives back the next arc in the iterating order. |
628 /// This function gives back the next arc in the iteration order. |
611 /// |
|
612 void next(Arc&) const {} |
629 void next(Arc&) const {} |
613 |
630 |
614 |
631 /// \brief Return the first arc incomming to the given node. |
615 /// \brief Gives back the first of the arcs point to the given |
632 /// |
616 /// node. |
633 /// This function gives back the first arc incomming to the |
617 /// |
634 /// given node. |
618 /// Gives back the first of the arcs point to the given node. |
|
619 /// |
|
620 void firstIn(Arc&, const Node&) const {} |
635 void firstIn(Arc&, const Node&) const {} |
621 |
636 |
622 /// \brief Gives back the next of the arcs points to the given |
637 /// \brief Return the next arc incomming to the given node. |
623 /// node. |
638 /// |
624 /// |
639 /// This function gives back the next arc incomming to the |
625 /// Gives back the next of the arcs points to the given node. |
640 /// given node. |
626 /// |
|
627 void nextIn(Arc&) const {} |
641 void nextIn(Arc&) const {} |
628 |
642 |
629 /// \brief Gives back the first of the arcs start from the |
643 /// \brief Return the first arc outgoing form the given node. |
|
644 /// |
|
645 /// This function gives back the first arc outgoing form the |
630 /// given node. |
646 /// given node. |
631 /// |
|
632 /// Gives back the first of the arcs start from the given node. |
|
633 /// |
|
634 void firstOut(Arc&, const Node&) const {} |
647 void firstOut(Arc&, const Node&) const {} |
635 |
648 |
636 /// \brief Gives back the next of the arcs start from the given |
649 /// \brief Return the next arc outgoing form the given node. |
637 /// node. |
650 /// |
638 /// |
651 /// This function gives back the next arc outgoing form the |
639 /// Gives back the next of the arcs start from the given node. |
652 /// given node. |
640 /// |
|
641 void nextOut(Arc&) const {} |
653 void nextOut(Arc&) const {} |
642 |
654 |
643 /// @} |
655 /// @} |
644 |
656 |
645 /// \name Class based iteration |
657 /// \name Class based iteration |
646 /// |
658 /// |
647 /// This interface provides functions for iteration on digraph items |
659 /// This interface provides iterator classes for digraph items. |
648 /// |
660 /// |
649 /// @{ |
661 /// @{ |
650 |
662 |
651 /// \brief This iterator goes through each node. |
663 /// \brief This iterator goes through each node. |
652 /// |
664 /// |
653 /// This iterator goes through each node. |
665 /// This iterator goes through each node. |
654 /// |
666 /// |
655 typedef GraphItemIt<Digraph, Node> NodeIt; |
667 typedef GraphItemIt<Digraph, Node> NodeIt; |
656 |
668 |
657 /// \brief This iterator goes through each node. |
669 /// \brief This iterator goes through each arc. |
658 /// |
670 /// |
659 /// This iterator goes through each node. |
671 /// This iterator goes through each arc. |
660 /// |
672 /// |
661 typedef GraphItemIt<Digraph, Arc> ArcIt; |
673 typedef GraphItemIt<Digraph, Arc> ArcIt; |
662 |
674 |
663 /// \brief This iterator goes trough the incoming arcs of a node. |
675 /// \brief This iterator goes trough the incoming arcs of a node. |
664 /// |
676 /// |
665 /// This iterator goes trough the \e inccoming arcs of a certain node |
677 /// This iterator goes trough the \e incoming arcs of a certain node |
666 /// of a digraph. |
678 /// of a digraph. |
667 typedef GraphIncIt<Digraph, Arc, Node, 'i'> InArcIt; |
679 typedef GraphIncIt<Digraph, Arc, Node, 'i'> InArcIt; |
668 |
680 |
669 /// \brief This iterator goes trough the outgoing arcs of a node. |
681 /// \brief This iterator goes trough the outgoing arcs of a node. |
670 /// |
682 /// |
672 /// of a digraph. |
684 /// of a digraph. |
673 typedef GraphIncIt<Digraph, Arc, Node, 'o'> OutArcIt; |
685 typedef GraphIncIt<Digraph, Arc, Node, 'o'> OutArcIt; |
674 |
686 |
675 /// \brief The base node of the iterator. |
687 /// \brief The base node of the iterator. |
676 /// |
688 /// |
677 /// Gives back the base node of the iterator. |
689 /// This function gives back the base node of the iterator. |
678 /// It is always the target of the pointed arc. |
690 /// It is always the target node of the pointed arc. |
679 Node baseNode(const InArcIt&) const { return INVALID; } |
691 Node baseNode(const InArcIt&) const { return INVALID; } |
680 |
692 |
681 /// \brief The running node of the iterator. |
693 /// \brief The running node of the iterator. |
682 /// |
694 /// |
683 /// Gives back the running node of the iterator. |
695 /// This function gives back the running node of the iterator. |
684 /// It is always the source of the pointed arc. |
696 /// It is always the source node of the pointed arc. |
685 Node runningNode(const InArcIt&) const { return INVALID; } |
697 Node runningNode(const InArcIt&) const { return INVALID; } |
686 |
698 |
687 /// \brief The base node of the iterator. |
699 /// \brief The base node of the iterator. |
688 /// |
700 /// |
689 /// Gives back the base node of the iterator. |
701 /// This function gives back the base node of the iterator. |
690 /// It is always the source of the pointed arc. |
702 /// It is always the source node of the pointed arc. |
691 Node baseNode(const OutArcIt&) const { return INVALID; } |
703 Node baseNode(const OutArcIt&) const { return INVALID; } |
692 |
704 |
693 /// \brief The running node of the iterator. |
705 /// \brief The running node of the iterator. |
694 /// |
706 /// |
695 /// Gives back the running node of the iterator. |
707 /// This function gives back the running node of the iterator. |
696 /// It is always the target of the pointed arc. |
708 /// It is always the target node of the pointed arc. |
697 Node runningNode(const OutArcIt&) const { return INVALID; } |
709 Node runningNode(const OutArcIt&) const { return INVALID; } |
698 |
710 |
699 /// @} |
711 /// @} |
700 |
712 |
701 template <typename _Digraph> |
713 template <typename _Digraph> |
733 typename _Digraph::Node, 'i'>, typename _Digraph::InArcIt>(); |
745 typename _Digraph::Node, 'i'>, typename _Digraph::InArcIt>(); |
734 checkConcept<GraphIncIt<_Digraph, typename _Digraph::Arc, |
746 checkConcept<GraphIncIt<_Digraph, typename _Digraph::Arc, |
735 typename _Digraph::Node, 'o'>, typename _Digraph::OutArcIt>(); |
747 typename _Digraph::Node, 'o'>, typename _Digraph::OutArcIt>(); |
736 |
748 |
737 typename _Digraph::Node n; |
749 typename _Digraph::Node n; |
738 typename _Digraph::InArcIt ieit(INVALID); |
750 const typename _Digraph::InArcIt iait(INVALID); |
739 typename _Digraph::OutArcIt oeit(INVALID); |
751 const typename _Digraph::OutArcIt oait(INVALID); |
740 n = digraph.baseNode(ieit); |
752 n = digraph.baseNode(iait); |
741 n = digraph.runningNode(ieit); |
753 n = digraph.runningNode(iait); |
742 n = digraph.baseNode(oeit); |
754 n = digraph.baseNode(oait); |
743 n = digraph.runningNode(oeit); |
755 n = digraph.runningNode(oait); |
744 ignore_unused_variable_warning(n); |
756 ignore_unused_variable_warning(n); |
745 } |
757 } |
746 } |
758 } |
747 |
759 |
748 const _Digraph& digraph; |
760 const _Digraph& digraph; |
749 |
761 }; |
750 }; |
762 }; |
751 }; |
763 |
752 |
764 /// \brief Skeleton class for iterable undirected graphs. |
753 /// \brief An empty iterable undirected graph class. |
765 /// |
754 /// |
766 /// This class describes the interface of iterable undirected |
755 /// This class provides beside the core graph features iterator |
767 /// graphs. It extends \ref IterableDigraphComponent with the core |
756 /// based iterable interface for the undirected graph structure. |
768 /// iterable interface of undirected graphs. |
757 /// This concept is part of the Graph concept. |
769 /// This concept is part of the Graph concept. |
758 template <typename BAS = BaseGraphComponent> |
770 template <typename BAS = BaseGraphComponent> |
759 class IterableGraphComponent : public IterableDigraphComponent<BAS> { |
771 class IterableGraphComponent : public IterableDigraphComponent<BAS> { |
760 public: |
772 public: |
761 |
773 |
767 |
779 |
768 typedef IterableGraphComponent Graph; |
780 typedef IterableGraphComponent Graph; |
769 |
781 |
770 /// \name Base iteration |
782 /// \name Base iteration |
771 /// |
783 /// |
772 /// This interface provides functions for iteration on graph items |
784 /// This interface provides functions for iteration on edges. |
|
785 /// |
773 /// @{ |
786 /// @{ |
774 |
787 |
775 using IterableDigraphComponent<Base>::first; |
788 using IterableDigraphComponent<Base>::first; |
776 using IterableDigraphComponent<Base>::next; |
789 using IterableDigraphComponent<Base>::next; |
777 |
790 |
778 /// \brief Gives back the first edge in the iterating |
791 /// \brief Return the first edge. |
779 /// order. |
792 /// |
780 /// |
793 /// This function gives back the first edge in the iteration order. |
781 /// Gives back the first edge in the iterating order. |
|
782 /// |
|
783 void first(Edge&) const {} |
794 void first(Edge&) const {} |
784 |
795 |
785 /// \brief Gives back the next edge in the iterating |
796 /// \brief Return the next edge. |
786 /// order. |
797 /// |
787 /// |
798 /// This function gives back the next edge in the iteration order. |
788 /// Gives back the next edge in the iterating order. |
|
789 /// |
|
790 void next(Edge&) const {} |
799 void next(Edge&) const {} |
791 |
800 |
792 |
801 /// \brief Return the first edge incident to the given node. |
793 /// \brief Gives back the first of the edges from the |
802 /// |
|
803 /// This function gives back the first edge incident to the given |
|
804 /// node. The bool parameter gives back the direction for which the |
|
805 /// source node of the directed arc representing the edge is the |
794 /// given node. |
806 /// given node. |
795 /// |
|
796 /// Gives back the first of the edges from the given |
|
797 /// node. The bool parameter gives back that direction which |
|
798 /// gives a good direction of the edge so the source of the |
|
799 /// directed arc is the given node. |
|
800 void firstInc(Edge&, bool&, const Node&) const {} |
807 void firstInc(Edge&, bool&, const Node&) const {} |
801 |
808 |
802 /// \brief Gives back the next of the edges from the |
809 /// \brief Gives back the next of the edges from the |
803 /// given node. |
810 /// given node. |
804 /// |
811 /// |
805 /// Gives back the next of the edges from the given |
812 /// This function gives back the next edge incident to the given |
806 /// node. The bool parameter should be used as the \c firstInc() |
813 /// node. The bool parameter should be used as \c firstInc() use it. |
807 /// use it. |
|
808 void nextInc(Edge&, bool&) const {} |
814 void nextInc(Edge&, bool&) const {} |
809 |
815 |
810 using IterableDigraphComponent<Base>::baseNode; |
816 using IterableDigraphComponent<Base>::baseNode; |
811 using IterableDigraphComponent<Base>::runningNode; |
817 using IterableDigraphComponent<Base>::runningNode; |
812 |
818 |
813 /// @} |
819 /// @} |
814 |
820 |
815 /// \name Class based iteration |
821 /// \name Class based iteration |
816 /// |
822 /// |
817 /// This interface provides functions for iteration on graph items |
823 /// This interface provides iterator classes for edges. |
818 /// |
824 /// |
819 /// @{ |
825 /// @{ |
820 |
826 |
821 /// \brief This iterator goes through each node. |
827 /// \brief This iterator goes through each edge. |
822 /// |
828 /// |
823 /// This iterator goes through each node. |
829 /// This iterator goes through each edge. |
824 typedef GraphItemIt<Graph, Edge> EdgeIt; |
830 typedef GraphItemIt<Graph, Edge> EdgeIt; |
825 /// \brief This iterator goes trough the incident arcs of a |
831 |
|
832 /// \brief This iterator goes trough the incident edges of a |
826 /// node. |
833 /// node. |
827 /// |
834 /// |
828 /// This iterator goes trough the incident arcs of a certain |
835 /// This iterator goes trough the incident edges of a certain |
829 /// node of a graph. |
836 /// node of a graph. |
830 typedef GraphIncIt<Graph, Edge, Node, 'u'> IncEdgeIt; |
837 typedef GraphIncIt<Graph, Edge, Node, 'e'> IncEdgeIt; |
|
838 |
831 /// \brief The base node of the iterator. |
839 /// \brief The base node of the iterator. |
832 /// |
840 /// |
833 /// Gives back the base node of the iterator. |
841 /// This function gives back the base node of the iterator. |
834 Node baseNode(const IncEdgeIt&) const { return INVALID; } |
842 Node baseNode(const IncEdgeIt&) const { return INVALID; } |
835 |
843 |
836 /// \brief The running node of the iterator. |
844 /// \brief The running node of the iterator. |
837 /// |
845 /// |
838 /// Gives back the running node of the iterator. |
846 /// This function gives back the running node of the iterator. |
839 Node runningNode(const IncEdgeIt&) const { return INVALID; } |
847 Node runningNode(const IncEdgeIt&) const { return INVALID; } |
840 |
848 |
841 /// @} |
849 /// @} |
842 |
850 |
843 template <typename _Graph> |
851 template <typename _Graph> |
862 |
870 |
863 { |
871 { |
864 checkConcept<GraphItemIt<_Graph, typename _Graph::Edge>, |
872 checkConcept<GraphItemIt<_Graph, typename _Graph::Edge>, |
865 typename _Graph::EdgeIt >(); |
873 typename _Graph::EdgeIt >(); |
866 checkConcept<GraphIncIt<_Graph, typename _Graph::Edge, |
874 checkConcept<GraphIncIt<_Graph, typename _Graph::Edge, |
867 typename _Graph::Node, 'u'>, typename _Graph::IncEdgeIt>(); |
875 typename _Graph::Node, 'e'>, typename _Graph::IncEdgeIt>(); |
868 |
876 |
869 typename _Graph::Node n; |
877 typename _Graph::Node n; |
870 typename _Graph::IncEdgeIt ueit(INVALID); |
878 const typename _Graph::IncEdgeIt ieit(INVALID); |
871 n = graph.baseNode(ueit); |
879 n = graph.baseNode(ieit); |
872 n = graph.runningNode(ueit); |
880 n = graph.runningNode(ieit); |
873 } |
881 } |
874 } |
882 } |
875 |
883 |
876 const _Graph& graph; |
884 const _Graph& graph; |
877 }; |
885 }; |
878 }; |
886 }; |
879 |
887 |
880 /// \brief An empty alteration notifier digraph class. |
888 /// \brief Skeleton class for alterable directed graphs. |
881 /// |
889 /// |
882 /// This class provides beside the core digraph features alteration |
890 /// This class describes the interface of alterable directed |
883 /// notifier interface for the digraph structure. This implements |
891 /// graphs. It extends \ref BaseDigraphComponent with the alteration |
|
892 /// notifier interface. It implements |
884 /// an observer-notifier pattern for each digraph item. More |
893 /// an observer-notifier pattern for each digraph item. More |
885 /// obsevers can be registered into the notifier and whenever an |
894 /// obsevers can be registered into the notifier and whenever an |
886 /// alteration occured in the digraph all the observers will |
895 /// alteration occured in the digraph all the observers will be |
887 /// notified about it. |
896 /// notified about it. |
888 template <typename BAS = BaseDigraphComponent> |
897 template <typename BAS = BaseDigraphComponent> |
889 class AlterableDigraphComponent : public BAS { |
898 class AlterableDigraphComponent : public BAS { |
890 public: |
899 public: |
891 |
900 |
892 typedef BAS Base; |
901 typedef BAS Base; |
893 typedef typename Base::Node Node; |
902 typedef typename Base::Node Node; |
894 typedef typename Base::Arc Arc; |
903 typedef typename Base::Arc Arc; |
895 |
904 |
896 |
905 |
897 /// The node observer registry. |
906 /// Node alteration notifier class. |
898 typedef AlterationNotifier<AlterableDigraphComponent, Node> |
907 typedef AlterationNotifier<AlterableDigraphComponent, Node> |
899 NodeNotifier; |
908 NodeNotifier; |
900 /// The arc observer registry. |
909 /// Arc alteration notifier class. |
901 typedef AlterationNotifier<AlterableDigraphComponent, Arc> |
910 typedef AlterationNotifier<AlterableDigraphComponent, Arc> |
902 ArcNotifier; |
911 ArcNotifier; |
903 |
912 |
904 /// \brief Gives back the node alteration notifier. |
913 /// \brief Return the node alteration notifier. |
905 /// |
914 /// |
906 /// Gives back the node alteration notifier. |
915 /// This function gives back the node alteration notifier. |
907 NodeNotifier& notifier(Node) const { |
916 NodeNotifier& notifier(Node) const { |
908 return NodeNotifier(); |
917 return NodeNotifier(); |
909 } |
918 } |
910 |
919 |
911 /// \brief Gives back the arc alteration notifier. |
920 /// \brief Return the arc alteration notifier. |
912 /// |
921 /// |
913 /// Gives back the arc alteration notifier. |
922 /// This function gives back the arc alteration notifier. |
914 ArcNotifier& notifier(Arc) const { |
923 ArcNotifier& notifier(Arc) const { |
915 return ArcNotifier(); |
924 return ArcNotifier(); |
916 } |
925 } |
917 |
926 |
918 template <typename _Digraph> |
927 template <typename _Digraph> |
928 ignore_unused_variable_warning(nn); |
937 ignore_unused_variable_warning(nn); |
929 ignore_unused_variable_warning(en); |
938 ignore_unused_variable_warning(en); |
930 } |
939 } |
931 |
940 |
932 const _Digraph& digraph; |
941 const _Digraph& digraph; |
933 |
942 }; |
934 }; |
943 }; |
935 |
944 |
936 }; |
945 /// \brief Skeleton class for alterable undirected graphs. |
937 |
946 /// |
938 /// \brief An empty alteration notifier undirected graph class. |
947 /// This class describes the interface of alterable undirected |
939 /// |
948 /// graphs. It extends \ref AlterableDigraphComponent with the alteration |
940 /// This class provides beside the core graph features alteration |
949 /// notifier interface of undirected graphs. It implements |
941 /// notifier interface for the graph structure. This implements |
950 /// an observer-notifier pattern for the edges. More |
942 /// an observer-notifier pattern for each graph item. More |
|
943 /// obsevers can be registered into the notifier and whenever an |
951 /// obsevers can be registered into the notifier and whenever an |
944 /// alteration occured in the graph all the observers will |
952 /// alteration occured in the graph all the observers will be |
945 /// notified about it. |
953 /// notified about it. |
946 template <typename BAS = BaseGraphComponent> |
954 template <typename BAS = BaseGraphComponent> |
947 class AlterableGraphComponent : public AlterableDigraphComponent<BAS> { |
955 class AlterableGraphComponent : public AlterableDigraphComponent<BAS> { |
948 public: |
956 public: |
949 |
957 |
950 typedef BAS Base; |
958 typedef BAS Base; |
951 typedef typename Base::Edge Edge; |
959 typedef typename Base::Edge Edge; |
952 |
960 |
953 |
961 |
954 /// The arc observer registry. |
962 /// Edge alteration notifier class. |
955 typedef AlterationNotifier<AlterableGraphComponent, Edge> |
963 typedef AlterationNotifier<AlterableGraphComponent, Edge> |
956 EdgeNotifier; |
964 EdgeNotifier; |
957 |
965 |
958 /// \brief Gives back the arc alteration notifier. |
966 /// \brief Return the edge alteration notifier. |
959 /// |
967 /// |
960 /// Gives back the arc alteration notifier. |
968 /// This function gives back the edge alteration notifier. |
961 EdgeNotifier& notifier(Edge) const { |
969 EdgeNotifier& notifier(Edge) const { |
962 return EdgeNotifier(); |
970 return EdgeNotifier(); |
963 } |
971 } |
964 |
972 |
965 template <typename _Graph> |
973 template <typename _Graph> |
966 struct Constraints { |
974 struct Constraints { |
967 void constraints() { |
975 void constraints() { |
968 checkConcept<AlterableGraphComponent<Base>, _Graph>(); |
976 checkConcept<AlterableDigraphComponent<Base>, _Graph>(); |
969 typename _Graph::EdgeNotifier& uen |
977 typename _Graph::EdgeNotifier& uen |
970 = graph.notifier(typename _Graph::Edge()); |
978 = graph.notifier(typename _Graph::Edge()); |
971 ignore_unused_variable_warning(uen); |
979 ignore_unused_variable_warning(uen); |
972 } |
980 } |
973 |
981 |
974 const _Graph& graph; |
982 const _Graph& graph; |
975 }; |
983 }; |
976 }; |
984 }; |
977 |
985 |
978 /// \brief Class describing the concept of graph maps |
986 /// \brief Concept class for standard graph maps. |
979 /// |
987 /// |
980 /// This class describes the common interface of the graph maps |
988 /// This class describes the concept of standard graph maps, i.e. |
981 /// (NodeMap, ArcMap), that is maps that can be used to |
989 /// the \c NodeMap, \c ArcMap and \c EdgeMap subtypes of digraph and |
982 /// associate data to graph descriptors (nodes or arcs). |
990 /// graph types, which can be used for associating data to graph items. |
983 template <typename GR, typename K, typename V> |
991 template <typename GR, typename K, typename V> |
984 class GraphMap : public ReadWriteMap<K, V> { |
992 class GraphMap : public ReadWriteMap<K, V> { |
985 public: |
993 public: |
986 |
994 |
987 typedef ReadWriteMap<K, V> Parent; |
995 typedef ReadWriteMap<K, V> Parent; |
1076 explicit NodeMap(const MappableDigraphComponent& digraph) |
1084 explicit NodeMap(const MappableDigraphComponent& digraph) |
1077 : Parent(digraph) {} |
1085 : Parent(digraph) {} |
1078 |
1086 |
1079 /// \brief Construct a new map with default value. |
1087 /// \brief Construct a new map with default value. |
1080 /// |
1088 /// |
1081 /// Construct a new map for the digraph and initalise the values. |
1089 /// Construct a new map for the digraph and initalize the values. |
1082 NodeMap(const MappableDigraphComponent& digraph, const V& value) |
1090 NodeMap(const MappableDigraphComponent& digraph, const V& value) |
1083 : Parent(digraph, value) {} |
1091 : Parent(digraph, value) {} |
1084 |
1092 |
1085 private: |
1093 private: |
1086 /// \brief Copy constructor. |
1094 /// \brief Copy constructor. |
1087 /// |
1095 /// |
1088 /// Copy Constructor. |
1096 /// Copy Constructor. |
1089 NodeMap(const NodeMap& nm) : Parent(nm) {} |
1097 NodeMap(const NodeMap& nm) : Parent(nm) {} |
1090 |
1098 |
1091 /// \brief Assign operator. |
1099 /// \brief Assignment operator. |
1092 /// |
1100 /// |
1093 /// Assign operator. |
1101 /// Assignment operator. |
1094 template <typename CMap> |
1102 template <typename CMap> |
1095 NodeMap& operator=(const CMap&) { |
1103 NodeMap& operator=(const CMap&) { |
1096 checkConcept<ReadMap<Node, V>, CMap>(); |
1104 checkConcept<ReadMap<Node, V>, CMap>(); |
1097 return *this; |
1105 return *this; |
1098 } |
1106 } |
1099 |
1107 |
1100 }; |
1108 }; |
1101 |
1109 |
1102 /// \brief ReadWrite map of the arcs. |
1110 /// \brief Standard graph map for the arcs. |
1103 /// |
1111 /// |
1104 /// ReadWrite map of the arcs. |
1112 /// Standard graph map for the arcs. |
1105 /// |
|
1106 template <typename V> |
1113 template <typename V> |
1107 class ArcMap : public GraphMap<Digraph, Arc, V> { |
1114 class ArcMap : public GraphMap<MappableDigraphComponent, Arc, V> { |
1108 public: |
1115 public: |
1109 typedef GraphMap<MappableDigraphComponent, Arc, V> Parent; |
1116 typedef GraphMap<MappableDigraphComponent, Arc, V> Parent; |
1110 |
1117 |
1111 /// \brief Construct a new map. |
1118 /// \brief Construct a new map. |
1112 /// |
1119 /// |
1353 |
1359 |
1354 _Graph& graph; |
1360 _Graph& graph; |
1355 }; |
1361 }; |
1356 }; |
1362 }; |
1357 |
1363 |
1358 /// \brief An empty erasable digraph class. |
1364 /// \brief Skeleton class for erasable directed graphs. |
1359 /// |
1365 /// |
1360 /// This class provides beside the core digraph features core erase |
1366 /// This class describes the interface of erasable directed graphs. |
1361 /// functions for the digraph structure. The main difference between |
1367 /// It extends \ref BaseDigraphComponent with functions for removing |
1362 /// the base and this interface is that the digraph alterations |
1368 /// nodes and arcs from the digraph. |
1363 /// should handled already on this level. |
1369 /// This concept requires \ref AlterableDigraphComponent. |
1364 template <typename BAS = BaseDigraphComponent> |
1370 template <typename BAS = BaseDigraphComponent> |
1365 class ErasableDigraphComponent : public BAS { |
1371 class ErasableDigraphComponent : public BAS { |
1366 public: |
1372 public: |
1367 |
1373 |
1368 typedef BAS Base; |
1374 typedef BAS Base; |
1369 typedef typename Base::Node Node; |
1375 typedef typename Base::Node Node; |
1370 typedef typename Base::Arc Arc; |
1376 typedef typename Base::Arc Arc; |
1371 |
1377 |
1372 /// \brief Erase a node from the digraph. |
1378 /// \brief Erase a node from the digraph. |
1373 /// |
1379 /// |
1374 /// Erase a node from the digraph. This function should |
1380 /// This function erases the given node from the digraph and all arcs |
1375 /// erase all arcs connecting to the node. |
1381 /// connected to the node. |
1376 void erase(const Node&) {} |
1382 void erase(const Node&) {} |
1377 |
1383 |
1378 /// \brief Erase an arc from the digraph. |
1384 /// \brief Erase an arc from the digraph. |
1379 /// |
1385 /// |
1380 /// Erase an arc from the digraph. |
1386 /// This function erases the given arc from the digraph. |
1381 /// |
|
1382 void erase(const Arc&) {} |
1387 void erase(const Arc&) {} |
1383 |
1388 |
1384 template <typename _Digraph> |
1389 template <typename _Digraph> |
1385 struct Constraints { |
1390 struct Constraints { |
1386 void constraints() { |
1391 void constraints() { |
1387 checkConcept<Base, _Digraph>(); |
1392 checkConcept<Base, _Digraph>(); |
1388 typename _Digraph::Node node; |
1393 const typename _Digraph::Node node(INVALID); |
1389 digraph.erase(node); |
1394 digraph.erase(node); |
1390 typename _Digraph::Arc arc; |
1395 const typename _Digraph::Arc arc(INVALID); |
1391 digraph.erase(arc); |
1396 digraph.erase(arc); |
1392 } |
1397 } |
1393 |
1398 |
1394 _Digraph& digraph; |
1399 _Digraph& digraph; |
1395 }; |
1400 }; |
1396 }; |
1401 }; |
1397 |
1402 |
1398 /// \brief An empty erasable base undirected graph class. |
1403 /// \brief Skeleton class for erasable undirected graphs. |
1399 /// |
1404 /// |
1400 /// This class provides beside the core undirected graph features |
1405 /// This class describes the interface of erasable undirected graphs. |
1401 /// core erase functions for the undirceted graph structure. The |
1406 /// It extends \ref BaseGraphComponent with functions for removing |
1402 /// main difference between the base and this interface is that |
1407 /// nodes and edges from the graph. |
1403 /// the graph alterations should handled already on this level. |
1408 /// This concept requires \ref AlterableGraphComponent. |
1404 template <typename BAS = BaseGraphComponent> |
1409 template <typename BAS = BaseGraphComponent> |
1405 class ErasableGraphComponent : public BAS { |
1410 class ErasableGraphComponent : public BAS { |
1406 public: |
1411 public: |
1407 |
1412 |
1408 typedef BAS Base; |
1413 typedef BAS Base; |
1409 typedef typename Base::Node Node; |
1414 typedef typename Base::Node Node; |
1410 typedef typename Base::Edge Edge; |
1415 typedef typename Base::Edge Edge; |
1411 |
1416 |
1412 /// \brief Erase a node from the graph. |
1417 /// \brief Erase a node from the graph. |
1413 /// |
1418 /// |
1414 /// Erase a node from the graph. This function should erase |
1419 /// This function erases the given node from the graph and all edges |
1415 /// arcs connecting to the node. |
1420 /// connected to the node. |
1416 void erase(const Node&) {} |
1421 void erase(const Node&) {} |
1417 |
1422 |
1418 /// \brief Erase an arc from the graph. |
1423 /// \brief Erase an edge from the digraph. |
1419 /// |
1424 /// |
1420 /// Erase an arc from the graph. |
1425 /// This function erases the given edge from the digraph. |
1421 /// |
|
1422 void erase(const Edge&) {} |
1426 void erase(const Edge&) {} |
1423 |
1427 |
1424 template <typename _Graph> |
1428 template <typename _Graph> |
1425 struct Constraints { |
1429 struct Constraints { |
1426 void constraints() { |
1430 void constraints() { |
1427 checkConcept<Base, _Graph>(); |
1431 checkConcept<Base, _Graph>(); |
1428 typename _Graph::Node node; |
1432 const typename _Graph::Node node(INVALID); |
1429 graph.erase(node); |
1433 graph.erase(node); |
1430 typename _Graph::Edge edge; |
1434 const typename _Graph::Edge edge(INVALID); |
1431 graph.erase(edge); |
1435 graph.erase(edge); |
1432 } |
1436 } |
1433 |
1437 |
1434 _Graph& graph; |
1438 _Graph& graph; |
1435 }; |
1439 }; |
1436 }; |
1440 }; |
1437 |
1441 |
1438 /// \brief An empty clearable base digraph class. |
1442 /// \brief Skeleton class for clearable directed graphs. |
1439 /// |
1443 /// |
1440 /// This class provides beside the core digraph features core clear |
1444 /// This class describes the interface of clearable directed graphs. |
1441 /// functions for the digraph structure. The main difference between |
1445 /// It extends \ref BaseDigraphComponent with a function for clearing |
1442 /// the base and this interface is that the digraph alterations |
1446 /// the digraph. |
1443 /// should handled already on this level. |
1447 /// This concept requires \ref AlterableDigraphComponent. |
1444 template <typename BAS = BaseDigraphComponent> |
1448 template <typename BAS = BaseDigraphComponent> |
1445 class ClearableDigraphComponent : public BAS { |
1449 class ClearableDigraphComponent : public BAS { |
1446 public: |
1450 public: |
1447 |
1451 |
1448 typedef BAS Base; |
1452 typedef BAS Base; |
1449 |
1453 |
1450 /// \brief Erase all nodes and arcs from the digraph. |
1454 /// \brief Erase all nodes and arcs from the digraph. |
1451 /// |
1455 /// |
1452 /// Erase all nodes and arcs from the digraph. |
1456 /// This function erases all nodes and arcs from the digraph. |
1453 /// |
|
1454 void clear() {} |
1457 void clear() {} |
1455 |
1458 |
1456 template <typename _Digraph> |
1459 template <typename _Digraph> |
1457 struct Constraints { |
1460 struct Constraints { |
1458 void constraints() { |
1461 void constraints() { |
1459 checkConcept<Base, _Digraph>(); |
1462 checkConcept<Base, _Digraph>(); |
1460 digraph.clear(); |
1463 digraph.clear(); |
1461 } |
1464 } |
1462 |
1465 |
1463 _Digraph digraph; |
1466 _Digraph& digraph; |
1464 }; |
1467 }; |
1465 }; |
1468 }; |
1466 |
1469 |
1467 /// \brief An empty clearable base undirected graph class. |
1470 /// \brief Skeleton class for clearable undirected graphs. |
1468 /// |
1471 /// |
1469 /// This class provides beside the core undirected graph features |
1472 /// This class describes the interface of clearable undirected graphs. |
1470 /// core clear functions for the undirected graph structure. The |
1473 /// It extends \ref BaseGraphComponent with a function for clearing |
1471 /// main difference between the base and this interface is that |
1474 /// the graph. |
1472 /// the graph alterations should handled already on this level. |
1475 /// This concept requires \ref AlterableGraphComponent. |
1473 template <typename BAS = BaseGraphComponent> |
1476 template <typename BAS = BaseGraphComponent> |
1474 class ClearableGraphComponent : public ClearableDigraphComponent<BAS> { |
1477 class ClearableGraphComponent : public ClearableDigraphComponent<BAS> { |
1475 public: |
1478 public: |
1476 |
1479 |
1477 typedef BAS Base; |
1480 typedef BAS Base; |
1478 |
1481 |
|
1482 /// \brief Erase all nodes and edges from the graph. |
|
1483 /// |
|
1484 /// This function erases all nodes and edges from the graph. |
|
1485 void clear() {} |
|
1486 |
1479 template <typename _Graph> |
1487 template <typename _Graph> |
1480 struct Constraints { |
1488 struct Constraints { |
1481 void constraints() { |
1489 void constraints() { |
1482 checkConcept<ClearableGraphComponent<Base>, _Graph>(); |
1490 checkConcept<Base, _Graph>(); |
1483 } |
1491 graph.clear(); |
1484 |
1492 } |
1485 _Graph graph; |
1493 |
|
1494 _Graph& graph; |
1486 }; |
1495 }; |
1487 }; |
1496 }; |
1488 |
1497 |
1489 } |
1498 } |
1490 |
1499 |