Chris@16
|
1 //
|
Chris@16
|
2 //=======================================================================
|
Chris@16
|
3 // Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
|
Chris@16
|
4 // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
|
Chris@16
|
5 //
|
Chris@16
|
6 // Copyright 2009, Andrew Sutton
|
Chris@16
|
7 //
|
Chris@16
|
8 // Distributed under the Boost Software License, Version 1.0. (See
|
Chris@16
|
9 // accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
10 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
11 //=======================================================================
|
Chris@16
|
12 //
|
Chris@16
|
13 #ifndef BOOST_GRAPH_CONCEPTS_HPP
|
Chris@16
|
14 #define BOOST_GRAPH_CONCEPTS_HPP
|
Chris@16
|
15
|
Chris@16
|
16 #include <boost/config.hpp>
|
Chris@16
|
17 #include <boost/property_map/property_map.hpp>
|
Chris@16
|
18 #include <boost/graph/graph_traits.hpp>
|
Chris@16
|
19 #include <boost/graph/properties.hpp>
|
Chris@16
|
20 #include <boost/graph/numeric_values.hpp>
|
Chris@16
|
21 #include <boost/graph/buffer_concepts.hpp>
|
Chris@16
|
22 #include <boost/concept_check.hpp>
|
Chris@16
|
23 #include <boost/type_traits/is_same.hpp>
|
Chris@16
|
24 #include <boost/mpl/not.hpp>
|
Chris@16
|
25 #include <boost/static_assert.hpp>
|
Chris@16
|
26 #include <boost/detail/workaround.hpp>
|
Chris@16
|
27 #include <boost/concept/assert.hpp>
|
Chris@16
|
28
|
Chris@16
|
29 #include <boost/concept/detail/concept_def.hpp>
|
Chris@16
|
30 namespace boost
|
Chris@16
|
31 {
|
Chris@16
|
32 // dwa 2003/7/11 -- This clearly shouldn't be necessary, but if
|
Chris@16
|
33 // you want to use vector_as_graph, it is! I'm sure the graph
|
Chris@16
|
34 // library leaves these out all over the place. Probably a
|
Chris@16
|
35 // redesign involving specializing a template with a static
|
Chris@16
|
36 // member function is in order :(
|
Chris@16
|
37 //
|
Chris@16
|
38 // It is needed in order to allow us to write using boost::vertices as
|
Chris@16
|
39 // needed for ADL when using vector_as_graph below.
|
Chris@16
|
40 #if !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) \
|
Chris@16
|
41 && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
|
Chris@16
|
42 # define BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACK
|
Chris@16
|
43 #endif
|
Chris@16
|
44
|
Chris@16
|
45 #ifdef BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACK
|
Chris@16
|
46 template <class T>
|
Chris@16
|
47 typename T::ThereReallyIsNoMemberByThisNameInT vertices(T const&);
|
Chris@16
|
48 #endif
|
Chris@16
|
49
|
Chris@16
|
50 namespace concepts {
|
Chris@16
|
51 BOOST_concept(MultiPassInputIterator,(T)) {
|
Chris@16
|
52 BOOST_CONCEPT_USAGE(MultiPassInputIterator) {
|
Chris@16
|
53 BOOST_CONCEPT_ASSERT((InputIterator<T>));
|
Chris@16
|
54 }
|
Chris@16
|
55 };
|
Chris@16
|
56
|
Chris@16
|
57 BOOST_concept(Graph,(G))
|
Chris@16
|
58 {
|
Chris@16
|
59 typedef typename graph_traits<G>::vertex_descriptor vertex_descriptor;
|
Chris@16
|
60 typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
|
Chris@16
|
61 typedef typename graph_traits<G>::directed_category directed_category;
|
Chris@16
|
62 typedef typename graph_traits<G>::edge_parallel_category edge_parallel_category;
|
Chris@16
|
63 typedef typename graph_traits<G>::traversal_category traversal_category;
|
Chris@16
|
64
|
Chris@16
|
65 BOOST_CONCEPT_USAGE(Graph)
|
Chris@16
|
66 {
|
Chris@16
|
67 BOOST_CONCEPT_ASSERT((DefaultConstructible<vertex_descriptor>));
|
Chris@16
|
68 BOOST_CONCEPT_ASSERT((EqualityComparable<vertex_descriptor>));
|
Chris@16
|
69 BOOST_CONCEPT_ASSERT((Assignable<vertex_descriptor>));
|
Chris@16
|
70 }
|
Chris@16
|
71 G g;
|
Chris@16
|
72 };
|
Chris@16
|
73
|
Chris@16
|
74 BOOST_concept(IncidenceGraph,(G))
|
Chris@16
|
75 : Graph<G>
|
Chris@16
|
76 {
|
Chris@16
|
77 typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
|
Chris@16
|
78 typedef typename graph_traits<G>::out_edge_iterator out_edge_iterator;
|
Chris@16
|
79 typedef typename graph_traits<G>::degree_size_type degree_size_type;
|
Chris@16
|
80 typedef typename graph_traits<G>::traversal_category traversal_category;
|
Chris@16
|
81
|
Chris@16
|
82 BOOST_STATIC_ASSERT((boost::mpl::not_<boost::is_same<out_edge_iterator, void> >::value));
|
Chris@16
|
83 BOOST_STATIC_ASSERT((boost::mpl::not_<boost::is_same<degree_size_type, void> >::value));
|
Chris@16
|
84
|
Chris@16
|
85 BOOST_CONCEPT_USAGE(IncidenceGraph) {
|
Chris@16
|
86 BOOST_CONCEPT_ASSERT((MultiPassInputIterator<out_edge_iterator>));
|
Chris@16
|
87 BOOST_CONCEPT_ASSERT((DefaultConstructible<edge_descriptor>));
|
Chris@16
|
88 BOOST_CONCEPT_ASSERT((EqualityComparable<edge_descriptor>));
|
Chris@16
|
89 BOOST_CONCEPT_ASSERT((Assignable<edge_descriptor>));
|
Chris@16
|
90 BOOST_CONCEPT_ASSERT((Convertible<traversal_category,
|
Chris@16
|
91 incidence_graph_tag>));
|
Chris@16
|
92
|
Chris@16
|
93 p = out_edges(u, g);
|
Chris@16
|
94 n = out_degree(u, g);
|
Chris@16
|
95 e = *p.first;
|
Chris@16
|
96 u = source(e, g);
|
Chris@16
|
97 v = target(e, g);
|
Chris@16
|
98 const_constraints(g);
|
Chris@16
|
99 }
|
Chris@16
|
100 void const_constraints(const G& cg) {
|
Chris@16
|
101 p = out_edges(u, cg);
|
Chris@16
|
102 n = out_degree(u, cg);
|
Chris@16
|
103 e = *p.first;
|
Chris@16
|
104 u = source(e, cg);
|
Chris@16
|
105 v = target(e, cg);
|
Chris@16
|
106 }
|
Chris@16
|
107 std::pair<out_edge_iterator, out_edge_iterator> p;
|
Chris@16
|
108 typename graph_traits<G>::vertex_descriptor u, v;
|
Chris@16
|
109 typename graph_traits<G>::edge_descriptor e;
|
Chris@16
|
110 typename graph_traits<G>::degree_size_type n;
|
Chris@16
|
111 G g;
|
Chris@16
|
112 };
|
Chris@16
|
113
|
Chris@16
|
114 BOOST_concept(BidirectionalGraph,(G))
|
Chris@16
|
115 : IncidenceGraph<G>
|
Chris@16
|
116 {
|
Chris@16
|
117 typedef typename graph_traits<G>::in_edge_iterator
|
Chris@16
|
118 in_edge_iterator;
|
Chris@16
|
119 typedef typename graph_traits<G>::traversal_category
|
Chris@16
|
120 traversal_category;
|
Chris@16
|
121
|
Chris@16
|
122 BOOST_CONCEPT_USAGE(BidirectionalGraph) {
|
Chris@16
|
123 BOOST_CONCEPT_ASSERT((MultiPassInputIterator<in_edge_iterator>));
|
Chris@16
|
124 BOOST_CONCEPT_ASSERT((Convertible<traversal_category,
|
Chris@16
|
125 bidirectional_graph_tag>));
|
Chris@16
|
126
|
Chris@16
|
127 BOOST_STATIC_ASSERT((boost::mpl::not_<boost::is_same<in_edge_iterator, void> >::value));
|
Chris@16
|
128
|
Chris@16
|
129 p = in_edges(v, g);
|
Chris@16
|
130 n = in_degree(v, g);
|
Chris@16
|
131 e = *p.first;
|
Chris@16
|
132 const_constraints(g);
|
Chris@16
|
133 }
|
Chris@16
|
134 void const_constraints(const G& cg) {
|
Chris@16
|
135 p = in_edges(v, cg);
|
Chris@16
|
136 n = in_degree(v, cg);
|
Chris@16
|
137 e = *p.first;
|
Chris@16
|
138 }
|
Chris@16
|
139 std::pair<in_edge_iterator, in_edge_iterator> p;
|
Chris@16
|
140 typename graph_traits<G>::vertex_descriptor v;
|
Chris@16
|
141 typename graph_traits<G>::edge_descriptor e;
|
Chris@16
|
142 typename graph_traits<G>::degree_size_type n;
|
Chris@16
|
143 G g;
|
Chris@16
|
144 };
|
Chris@16
|
145
|
Chris@16
|
146 BOOST_concept(AdjacencyGraph,(G))
|
Chris@16
|
147 : Graph<G>
|
Chris@16
|
148 {
|
Chris@16
|
149 typedef typename graph_traits<G>::adjacency_iterator
|
Chris@16
|
150 adjacency_iterator;
|
Chris@16
|
151 typedef typename graph_traits<G>::traversal_category
|
Chris@16
|
152 traversal_category;
|
Chris@16
|
153
|
Chris@16
|
154 BOOST_CONCEPT_USAGE(AdjacencyGraph) {
|
Chris@16
|
155 BOOST_CONCEPT_ASSERT((MultiPassInputIterator<adjacency_iterator>));
|
Chris@16
|
156 BOOST_CONCEPT_ASSERT((Convertible<traversal_category,
|
Chris@16
|
157 adjacency_graph_tag>));
|
Chris@16
|
158
|
Chris@16
|
159 BOOST_STATIC_ASSERT((boost::mpl::not_<boost::is_same<adjacency_iterator, void> >::value));
|
Chris@16
|
160
|
Chris@16
|
161 p = adjacent_vertices(v, g);
|
Chris@16
|
162 v = *p.first;
|
Chris@16
|
163 const_constraints(g);
|
Chris@16
|
164 }
|
Chris@16
|
165 void const_constraints(const G& cg) {
|
Chris@16
|
166 p = adjacent_vertices(v, cg);
|
Chris@16
|
167 }
|
Chris@16
|
168 std::pair<adjacency_iterator,adjacency_iterator> p;
|
Chris@16
|
169 typename graph_traits<G>::vertex_descriptor v;
|
Chris@16
|
170 G g;
|
Chris@16
|
171 };
|
Chris@16
|
172
|
Chris@16
|
173 BOOST_concept(VertexListGraph,(G))
|
Chris@16
|
174 : Graph<G>
|
Chris@16
|
175 {
|
Chris@16
|
176 typedef typename graph_traits<G>::vertex_iterator vertex_iterator;
|
Chris@16
|
177 typedef typename graph_traits<G>::vertices_size_type vertices_size_type;
|
Chris@16
|
178 typedef typename graph_traits<G>::traversal_category
|
Chris@16
|
179 traversal_category;
|
Chris@16
|
180
|
Chris@16
|
181 BOOST_CONCEPT_USAGE(VertexListGraph) {
|
Chris@16
|
182 BOOST_CONCEPT_ASSERT((MultiPassInputIterator<vertex_iterator>));
|
Chris@16
|
183 BOOST_CONCEPT_ASSERT((Convertible<traversal_category,
|
Chris@16
|
184 vertex_list_graph_tag>));
|
Chris@16
|
185
|
Chris@16
|
186 BOOST_STATIC_ASSERT((boost::mpl::not_<boost::is_same<vertex_iterator, void> >::value));
|
Chris@16
|
187 BOOST_STATIC_ASSERT((boost::mpl::not_<boost::is_same<vertices_size_type, void> >::value));
|
Chris@16
|
188
|
Chris@16
|
189 #ifdef BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACK
|
Chris@16
|
190 // dwa 2003/7/11 -- This clearly shouldn't be necessary, but if
|
Chris@16
|
191 // you want to use vector_as_graph, it is! I'm sure the graph
|
Chris@16
|
192 // library leaves these out all over the place. Probably a
|
Chris@16
|
193 // redesign involving specializing a template with a static
|
Chris@16
|
194 // member function is in order :(
|
Chris@16
|
195 using boost::vertices;
|
Chris@16
|
196 #endif
|
Chris@16
|
197 p = vertices(g);
|
Chris@16
|
198 v = *p.first;
|
Chris@16
|
199 const_constraints(g);
|
Chris@16
|
200 }
|
Chris@16
|
201 void const_constraints(const G& cg) {
|
Chris@16
|
202 #ifdef BOOST_VECTOR_AS_GRAPH_GRAPH_ADL_HACK
|
Chris@16
|
203 // dwa 2003/7/11 -- This clearly shouldn't be necessary, but if
|
Chris@16
|
204 // you want to use vector_as_graph, it is! I'm sure the graph
|
Chris@16
|
205 // library leaves these out all over the place. Probably a
|
Chris@16
|
206 // redesign involving specializing a template with a static
|
Chris@16
|
207 // member function is in order :(
|
Chris@16
|
208 using boost::vertices;
|
Chris@16
|
209 #endif
|
Chris@16
|
210
|
Chris@16
|
211 p = vertices(cg);
|
Chris@16
|
212 v = *p.first;
|
Chris@16
|
213 V = num_vertices(cg);
|
Chris@16
|
214 }
|
Chris@16
|
215 std::pair<vertex_iterator,vertex_iterator> p;
|
Chris@16
|
216 typename graph_traits<G>::vertex_descriptor v;
|
Chris@16
|
217 G g;
|
Chris@16
|
218 vertices_size_type V;
|
Chris@16
|
219 };
|
Chris@16
|
220
|
Chris@16
|
221 BOOST_concept(EdgeListGraph,(G))
|
Chris@16
|
222 : Graph<G>
|
Chris@16
|
223 {
|
Chris@16
|
224 typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
|
Chris@16
|
225 typedef typename graph_traits<G>::edge_iterator edge_iterator;
|
Chris@16
|
226 typedef typename graph_traits<G>::edges_size_type edges_size_type;
|
Chris@16
|
227 typedef typename graph_traits<G>::traversal_category
|
Chris@16
|
228 traversal_category;
|
Chris@16
|
229
|
Chris@16
|
230 BOOST_CONCEPT_USAGE(EdgeListGraph) {
|
Chris@16
|
231 BOOST_CONCEPT_ASSERT((MultiPassInputIterator<edge_iterator>));
|
Chris@16
|
232 BOOST_CONCEPT_ASSERT((DefaultConstructible<edge_descriptor>));
|
Chris@16
|
233 BOOST_CONCEPT_ASSERT((EqualityComparable<edge_descriptor>));
|
Chris@16
|
234 BOOST_CONCEPT_ASSERT((Assignable<edge_descriptor>));
|
Chris@16
|
235 BOOST_CONCEPT_ASSERT((Convertible<traversal_category,
|
Chris@16
|
236 edge_list_graph_tag>));
|
Chris@16
|
237
|
Chris@16
|
238 BOOST_STATIC_ASSERT((boost::mpl::not_<boost::is_same<edge_iterator, void> >::value));
|
Chris@16
|
239 BOOST_STATIC_ASSERT((boost::mpl::not_<boost::is_same<edges_size_type, void> >::value));
|
Chris@16
|
240
|
Chris@16
|
241 p = edges(g);
|
Chris@16
|
242 e = *p.first;
|
Chris@16
|
243 u = source(e, g);
|
Chris@16
|
244 v = target(e, g);
|
Chris@16
|
245 const_constraints(g);
|
Chris@16
|
246 }
|
Chris@16
|
247 void const_constraints(const G& cg) {
|
Chris@16
|
248 p = edges(cg);
|
Chris@16
|
249 E = num_edges(cg);
|
Chris@16
|
250 e = *p.first;
|
Chris@16
|
251 u = source(e, cg);
|
Chris@16
|
252 v = target(e, cg);
|
Chris@16
|
253 }
|
Chris@16
|
254 std::pair<edge_iterator,edge_iterator> p;
|
Chris@16
|
255 typename graph_traits<G>::vertex_descriptor u, v;
|
Chris@16
|
256 typename graph_traits<G>::edge_descriptor e;
|
Chris@16
|
257 edges_size_type E;
|
Chris@16
|
258 G g;
|
Chris@16
|
259 };
|
Chris@16
|
260
|
Chris@16
|
261 BOOST_concept(VertexAndEdgeListGraph,(G))
|
Chris@16
|
262 : VertexListGraph<G>
|
Chris@16
|
263 , EdgeListGraph<G>
|
Chris@16
|
264 {
|
Chris@16
|
265 };
|
Chris@16
|
266
|
Chris@16
|
267 // Where to put the requirement for this constructor?
|
Chris@16
|
268 // G g(n_vertices);
|
Chris@16
|
269 // Not in mutable graph, then LEDA graph's can't be models of
|
Chris@16
|
270 // MutableGraph.
|
Chris@16
|
271 BOOST_concept(EdgeMutableGraph,(G))
|
Chris@16
|
272 {
|
Chris@16
|
273 typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
|
Chris@16
|
274
|
Chris@16
|
275 BOOST_CONCEPT_USAGE(EdgeMutableGraph) {
|
Chris@16
|
276 p = add_edge(u, v, g);
|
Chris@16
|
277 remove_edge(u, v, g);
|
Chris@16
|
278 remove_edge(e, g);
|
Chris@16
|
279 clear_vertex(v, g);
|
Chris@16
|
280 }
|
Chris@16
|
281 G g;
|
Chris@16
|
282 edge_descriptor e;
|
Chris@16
|
283 std::pair<edge_descriptor, bool> p;
|
Chris@16
|
284 typename graph_traits<G>::vertex_descriptor u, v;
|
Chris@16
|
285 };
|
Chris@16
|
286
|
Chris@16
|
287 BOOST_concept(VertexMutableGraph,(G))
|
Chris@16
|
288 {
|
Chris@16
|
289
|
Chris@16
|
290 BOOST_CONCEPT_USAGE(VertexMutableGraph) {
|
Chris@16
|
291 v = add_vertex(g);
|
Chris@16
|
292 remove_vertex(v, g);
|
Chris@16
|
293 }
|
Chris@16
|
294 G g;
|
Chris@16
|
295 typename graph_traits<G>::vertex_descriptor u, v;
|
Chris@16
|
296 };
|
Chris@16
|
297
|
Chris@16
|
298 BOOST_concept(MutableGraph,(G))
|
Chris@16
|
299 : EdgeMutableGraph<G>
|
Chris@16
|
300 , VertexMutableGraph<G>
|
Chris@16
|
301 {
|
Chris@16
|
302 };
|
Chris@16
|
303
|
Chris@16
|
304 template <class edge_descriptor>
|
Chris@16
|
305 struct dummy_edge_predicate {
|
Chris@16
|
306 bool operator()(const edge_descriptor&) const {
|
Chris@16
|
307 return false;
|
Chris@16
|
308 }
|
Chris@16
|
309 };
|
Chris@16
|
310
|
Chris@16
|
311 BOOST_concept(MutableIncidenceGraph,(G))
|
Chris@16
|
312 : MutableGraph<G>
|
Chris@16
|
313 {
|
Chris@16
|
314 BOOST_CONCEPT_USAGE(MutableIncidenceGraph) {
|
Chris@16
|
315 remove_edge(iter, g);
|
Chris@16
|
316 remove_out_edge_if(u, p, g);
|
Chris@16
|
317 }
|
Chris@16
|
318 G g;
|
Chris@16
|
319 typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
|
Chris@16
|
320 dummy_edge_predicate<edge_descriptor> p;
|
Chris@16
|
321 typename boost::graph_traits<G>::vertex_descriptor u;
|
Chris@16
|
322 typename boost::graph_traits<G>::out_edge_iterator iter;
|
Chris@16
|
323 };
|
Chris@16
|
324
|
Chris@16
|
325 BOOST_concept(MutableBidirectionalGraph,(G))
|
Chris@16
|
326 : MutableIncidenceGraph<G>
|
Chris@16
|
327 {
|
Chris@16
|
328 BOOST_CONCEPT_USAGE(MutableBidirectionalGraph)
|
Chris@16
|
329 {
|
Chris@16
|
330 remove_in_edge_if(u, p, g);
|
Chris@16
|
331 }
|
Chris@16
|
332 G g;
|
Chris@16
|
333 typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
|
Chris@16
|
334 dummy_edge_predicate<edge_descriptor> p;
|
Chris@16
|
335 typename boost::graph_traits<G>::vertex_descriptor u;
|
Chris@16
|
336 };
|
Chris@16
|
337
|
Chris@16
|
338 BOOST_concept(MutableEdgeListGraph,(G))
|
Chris@16
|
339 : EdgeMutableGraph<G>
|
Chris@16
|
340 {
|
Chris@16
|
341 BOOST_CONCEPT_USAGE(MutableEdgeListGraph) {
|
Chris@16
|
342 remove_edge_if(p, g);
|
Chris@16
|
343 }
|
Chris@16
|
344 G g;
|
Chris@16
|
345 typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
|
Chris@16
|
346 dummy_edge_predicate<edge_descriptor> p;
|
Chris@16
|
347 };
|
Chris@16
|
348
|
Chris@16
|
349 BOOST_concept(VertexMutablePropertyGraph,(G))
|
Chris@16
|
350 : VertexMutableGraph<G>
|
Chris@16
|
351 {
|
Chris@16
|
352 BOOST_CONCEPT_USAGE(VertexMutablePropertyGraph) {
|
Chris@16
|
353 v = add_vertex(vp, g);
|
Chris@16
|
354 }
|
Chris@16
|
355 G g;
|
Chris@16
|
356 typename graph_traits<G>::vertex_descriptor v;
|
Chris@16
|
357 typename vertex_property_type<G>::type vp;
|
Chris@16
|
358 };
|
Chris@16
|
359
|
Chris@16
|
360 BOOST_concept(EdgeMutablePropertyGraph,(G))
|
Chris@16
|
361 : EdgeMutableGraph<G>
|
Chris@16
|
362 {
|
Chris@16
|
363 typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
|
Chris@16
|
364
|
Chris@16
|
365 BOOST_CONCEPT_USAGE(EdgeMutablePropertyGraph) {
|
Chris@16
|
366 p = add_edge(u, v, ep, g);
|
Chris@16
|
367 }
|
Chris@16
|
368 G g;
|
Chris@16
|
369 std::pair<edge_descriptor, bool> p;
|
Chris@16
|
370 typename graph_traits<G>::vertex_descriptor u, v;
|
Chris@16
|
371 typename edge_property_type<G>::type ep;
|
Chris@16
|
372 };
|
Chris@16
|
373
|
Chris@16
|
374 BOOST_concept(AdjacencyMatrix,(G))
|
Chris@16
|
375 : Graph<G>
|
Chris@16
|
376 {
|
Chris@16
|
377 typedef typename graph_traits<G>::edge_descriptor edge_descriptor;
|
Chris@16
|
378
|
Chris@16
|
379 BOOST_CONCEPT_USAGE(AdjacencyMatrix) {
|
Chris@16
|
380 p = edge(u, v, g);
|
Chris@16
|
381 const_constraints(g);
|
Chris@16
|
382 }
|
Chris@16
|
383 void const_constraints(const G& cg) {
|
Chris@16
|
384 p = edge(u, v, cg);
|
Chris@16
|
385 }
|
Chris@16
|
386 typename graph_traits<G>::vertex_descriptor u, v;
|
Chris@16
|
387 std::pair<edge_descriptor, bool> p;
|
Chris@16
|
388 G g;
|
Chris@16
|
389 };
|
Chris@16
|
390
|
Chris@16
|
391 BOOST_concept(ReadablePropertyGraph,(G)(X)(Property))
|
Chris@16
|
392 : Graph<G>
|
Chris@16
|
393 {
|
Chris@16
|
394 typedef typename property_map<G, Property>::const_type const_Map;
|
Chris@16
|
395
|
Chris@16
|
396 BOOST_CONCEPT_USAGE(ReadablePropertyGraph)
|
Chris@16
|
397 {
|
Chris@16
|
398 BOOST_CONCEPT_ASSERT((ReadablePropertyMapConcept<const_Map, X>));
|
Chris@16
|
399
|
Chris@16
|
400 const_constraints(g);
|
Chris@16
|
401 }
|
Chris@16
|
402 void const_constraints(const G& cg) {
|
Chris@16
|
403 const_Map pmap = get(Property(), cg);
|
Chris@16
|
404 pval = get(Property(), cg, x);
|
Chris@16
|
405 ignore_unused_variable_warning(pmap);
|
Chris@16
|
406 }
|
Chris@16
|
407 G g;
|
Chris@16
|
408 X x;
|
Chris@16
|
409 typename property_traits<const_Map>::value_type pval;
|
Chris@16
|
410 };
|
Chris@16
|
411
|
Chris@16
|
412 BOOST_concept(PropertyGraph,(G)(X)(Property))
|
Chris@16
|
413 : ReadablePropertyGraph<G, X, Property>
|
Chris@16
|
414 {
|
Chris@16
|
415 typedef typename property_map<G, Property>::type Map;
|
Chris@16
|
416 BOOST_CONCEPT_USAGE(PropertyGraph) {
|
Chris@16
|
417 BOOST_CONCEPT_ASSERT((ReadWritePropertyMapConcept<Map, X>));
|
Chris@16
|
418
|
Chris@16
|
419 Map pmap = get(Property(), g);
|
Chris@16
|
420 pval = get(Property(), g, x);
|
Chris@16
|
421 put(Property(), g, x, pval);
|
Chris@16
|
422 ignore_unused_variable_warning(pmap);
|
Chris@16
|
423 }
|
Chris@16
|
424 G g;
|
Chris@16
|
425 X x;
|
Chris@16
|
426 typename property_traits<Map>::value_type pval;
|
Chris@16
|
427 };
|
Chris@16
|
428
|
Chris@16
|
429 BOOST_concept(LvaluePropertyGraph,(G)(X)(Property))
|
Chris@16
|
430 : ReadablePropertyGraph<G, X, Property>
|
Chris@16
|
431 {
|
Chris@16
|
432 typedef typename property_map<G, Property>::type Map;
|
Chris@16
|
433 typedef typename property_map<G, Property>::const_type const_Map;
|
Chris@16
|
434
|
Chris@16
|
435 BOOST_CONCEPT_USAGE(LvaluePropertyGraph) {
|
Chris@16
|
436 BOOST_CONCEPT_ASSERT((LvaluePropertyMapConcept<const_Map, X>));
|
Chris@16
|
437
|
Chris@16
|
438 pval = get(Property(), g, x);
|
Chris@16
|
439 put(Property(), g, x, pval);
|
Chris@16
|
440 }
|
Chris@16
|
441 G g;
|
Chris@16
|
442 X x;
|
Chris@16
|
443 typename property_traits<Map>::value_type pval;
|
Chris@16
|
444 };
|
Chris@16
|
445
|
Chris@16
|
446 // The *IndexGraph concepts are "semantic" graph concpepts. These can be
|
Chris@16
|
447 // applied to describe any graph that has an index map that can be accessed
|
Chris@16
|
448 // using the get(*_index, g) method. For example, adjacency lists with
|
Chris@16
|
449 // VertexSet == vecS are implicitly models of this concept.
|
Chris@16
|
450 //
|
Chris@16
|
451 // NOTE: We could require an associated type vertex_index_type, but that
|
Chris@16
|
452 // would mean propagating that type name into graph_traits and all of the
|
Chris@16
|
453 // other graph implementations. Much easier to simply call it unsigned.
|
Chris@16
|
454
|
Chris@16
|
455 BOOST_concept(VertexIndexGraph,(Graph))
|
Chris@16
|
456 {
|
Chris@16
|
457 BOOST_CONCEPT_USAGE(VertexIndexGraph)
|
Chris@16
|
458 {
|
Chris@16
|
459 typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
|
Chris@16
|
460 typedef typename property_map<Graph, vertex_index_t>::type Map;
|
Chris@16
|
461 typedef unsigned Index; // This could be Graph::vertex_index_type
|
Chris@16
|
462 Map m = get(vertex_index, g);
|
Chris@16
|
463 Index x = get(vertex_index, g, Vertex());
|
Chris@16
|
464 ignore_unused_variable_warning(m);
|
Chris@16
|
465 ignore_unused_variable_warning(x);
|
Chris@16
|
466
|
Chris@16
|
467 // This is relaxed
|
Chris@16
|
468 renumber_vertex_indices(g);
|
Chris@16
|
469
|
Chris@16
|
470 const_constraints(g);
|
Chris@16
|
471 }
|
Chris@101
|
472 void const_constraints(const Graph& g_)
|
Chris@16
|
473 {
|
Chris@16
|
474 typedef typename property_map<Graph, vertex_index_t>::const_type Map;
|
Chris@101
|
475 Map m = get(vertex_index, g_);
|
Chris@16
|
476 ignore_unused_variable_warning(m);
|
Chris@16
|
477 }
|
Chris@16
|
478 private:
|
Chris@16
|
479 Graph g;
|
Chris@16
|
480 };
|
Chris@16
|
481
|
Chris@16
|
482 BOOST_concept(EdgeIndexGraph,(Graph))
|
Chris@16
|
483 {
|
Chris@16
|
484 BOOST_CONCEPT_USAGE(EdgeIndexGraph)
|
Chris@16
|
485 {
|
Chris@16
|
486 typedef typename graph_traits<Graph>::edge_descriptor Edge;
|
Chris@16
|
487 typedef typename property_map<Graph, edge_index_t>::type Map;
|
Chris@16
|
488 typedef unsigned Index; // This could be Graph::vertex_index_type
|
Chris@16
|
489 Map m = get(edge_index, g);
|
Chris@16
|
490 Index x = get(edge_index, g, Edge());
|
Chris@16
|
491 ignore_unused_variable_warning(m);
|
Chris@16
|
492 ignore_unused_variable_warning(x);
|
Chris@16
|
493
|
Chris@16
|
494 // This is relaxed
|
Chris@16
|
495 renumber_edge_indices(g);
|
Chris@16
|
496
|
Chris@16
|
497 const_constraints(g);
|
Chris@16
|
498 }
|
Chris@101
|
499 void const_constraints(const Graph& g_)
|
Chris@16
|
500 {
|
Chris@16
|
501 typedef typename property_map<Graph, edge_index_t>::const_type Map;
|
Chris@101
|
502 Map m = get(edge_index, g_);
|
Chris@16
|
503 ignore_unused_variable_warning(m);
|
Chris@16
|
504 }
|
Chris@16
|
505 private:
|
Chris@16
|
506 Graph g;
|
Chris@16
|
507 };
|
Chris@16
|
508
|
Chris@16
|
509 BOOST_concept(ColorValue,(C))
|
Chris@16
|
510 : EqualityComparable<C>
|
Chris@16
|
511 , DefaultConstructible<C>
|
Chris@16
|
512 {
|
Chris@16
|
513 BOOST_CONCEPT_USAGE(ColorValue) {
|
Chris@16
|
514 c = color_traits<C>::white();
|
Chris@16
|
515 c = color_traits<C>::gray();
|
Chris@16
|
516 c = color_traits<C>::black();
|
Chris@16
|
517 }
|
Chris@16
|
518 C c;
|
Chris@16
|
519 };
|
Chris@16
|
520
|
Chris@16
|
521 BOOST_concept(BasicMatrix,(M)(I)(V))
|
Chris@16
|
522 {
|
Chris@16
|
523 BOOST_CONCEPT_USAGE(BasicMatrix) {
|
Chris@16
|
524 V& elt = A[i][j];
|
Chris@16
|
525 const_constraints(A);
|
Chris@16
|
526 ignore_unused_variable_warning(elt);
|
Chris@16
|
527 }
|
Chris@16
|
528 void const_constraints(const M& cA) {
|
Chris@16
|
529 const V& elt = cA[i][j];
|
Chris@16
|
530 ignore_unused_variable_warning(elt);
|
Chris@16
|
531 }
|
Chris@16
|
532 M A;
|
Chris@16
|
533 I i, j;
|
Chris@16
|
534 };
|
Chris@16
|
535
|
Chris@16
|
536 // The following concepts describe aspects of numberic values and measure
|
Chris@16
|
537 // functions. We're extending the notion of numeric values to include
|
Chris@16
|
538 // emulation for zero and infinity.
|
Chris@16
|
539
|
Chris@16
|
540 BOOST_concept(NumericValue,(Numeric))
|
Chris@16
|
541 {
|
Chris@16
|
542 BOOST_CONCEPT_USAGE(NumericValue)
|
Chris@16
|
543 {
|
Chris@16
|
544 BOOST_CONCEPT_ASSERT(( DefaultConstructible<Numeric> ));
|
Chris@16
|
545 BOOST_CONCEPT_ASSERT(( CopyConstructible<Numeric> ));
|
Chris@16
|
546 numeric_values<Numeric>::zero();
|
Chris@16
|
547 numeric_values<Numeric>::infinity();
|
Chris@16
|
548 }
|
Chris@16
|
549 };
|
Chris@16
|
550
|
Chris@16
|
551 BOOST_concept(DegreeMeasure,(Measure)(Graph))
|
Chris@16
|
552 {
|
Chris@16
|
553 BOOST_CONCEPT_USAGE(DegreeMeasure)
|
Chris@16
|
554 {
|
Chris@16
|
555 typedef typename Measure::degree_type Degree;
|
Chris@16
|
556 typedef typename Measure::vertex_type Vertex;
|
Chris@16
|
557
|
Chris@16
|
558 Degree d = m(Vertex(), g);
|
Chris@16
|
559 ignore_unused_variable_warning(d);
|
Chris@16
|
560 }
|
Chris@16
|
561 private:
|
Chris@16
|
562 Measure m;
|
Chris@16
|
563 Graph g;
|
Chris@16
|
564 };
|
Chris@16
|
565
|
Chris@16
|
566 BOOST_concept(DistanceMeasure,(Measure)(Graph))
|
Chris@16
|
567 {
|
Chris@16
|
568 BOOST_CONCEPT_USAGE(DistanceMeasure)
|
Chris@16
|
569 {
|
Chris@16
|
570 typedef typename Measure::distance_type Distance;
|
Chris@16
|
571 typedef typename Measure::result_type Result;
|
Chris@16
|
572 Result r = m(Distance(), g);
|
Chris@16
|
573 ignore_unused_variable_warning(r);
|
Chris@16
|
574 }
|
Chris@16
|
575 private:
|
Chris@16
|
576 Measure m;
|
Chris@16
|
577 Graph g;
|
Chris@16
|
578 };
|
Chris@16
|
579
|
Chris@16
|
580 } /* namespace concepts */
|
Chris@16
|
581
|
Chris@16
|
582 using boost::concepts::MultiPassInputIteratorConcept;
|
Chris@16
|
583
|
Chris@16
|
584 // Graph concepts
|
Chris@16
|
585 using boost::concepts::GraphConcept;
|
Chris@16
|
586 using boost::concepts::IncidenceGraphConcept;
|
Chris@16
|
587 using boost::concepts::BidirectionalGraphConcept;
|
Chris@16
|
588 using boost::concepts::AdjacencyGraphConcept;
|
Chris@16
|
589 using boost::concepts::VertexListGraphConcept;
|
Chris@16
|
590 using boost::concepts::EdgeListGraphConcept;
|
Chris@16
|
591 using boost::concepts::VertexAndEdgeListGraphConcept;
|
Chris@16
|
592 using boost::concepts::EdgeMutableGraphConcept;
|
Chris@16
|
593 using boost::concepts::VertexMutableGraphConcept;
|
Chris@16
|
594 using boost::concepts::MutableGraphConcept;
|
Chris@16
|
595 using boost::concepts::MutableIncidenceGraphConcept;
|
Chris@16
|
596 using boost::concepts::MutableBidirectionalGraphConcept;
|
Chris@16
|
597 using boost::concepts::MutableEdgeListGraphConcept;
|
Chris@16
|
598 using boost::concepts::VertexMutablePropertyGraphConcept;
|
Chris@16
|
599 using boost::concepts::EdgeMutablePropertyGraphConcept;
|
Chris@16
|
600 using boost::concepts::AdjacencyMatrixConcept;
|
Chris@16
|
601 using boost::concepts::ReadablePropertyGraphConcept;
|
Chris@16
|
602 using boost::concepts::PropertyGraphConcept;
|
Chris@16
|
603 using boost::concepts::LvaluePropertyGraphConcept;
|
Chris@16
|
604 using boost::concepts::VertexIndexGraphConcept;
|
Chris@16
|
605 using boost::concepts::EdgeIndexGraphConcept;
|
Chris@16
|
606
|
Chris@16
|
607 // Utility concepts
|
Chris@16
|
608 using boost::concepts::ColorValueConcept;
|
Chris@16
|
609 using boost::concepts::BasicMatrixConcept;
|
Chris@16
|
610 using boost::concepts::NumericValueConcept;
|
Chris@16
|
611 using boost::concepts::DistanceMeasureConcept;
|
Chris@16
|
612 using boost::concepts::DegreeMeasureConcept;
|
Chris@16
|
613
|
Chris@16
|
614
|
Chris@16
|
615 } /* namespace boost */
|
Chris@16
|
616 #include <boost/concept/detail/concept_undef.hpp>
|
Chris@16
|
617
|
Chris@16
|
618 #endif /* BOOST_GRAPH_CONCEPTS_H */
|