1 | //======================================================================= |
---|
2 | // Copyright 1997, 1998, 1999, 2000 University of Notre Dame. |
---|
3 | // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek |
---|
4 | // |
---|
5 | // Distributed under the Boost Software License, Version 1.0. (See |
---|
6 | // accompanying file LICENSE_1_0.txt or copy at |
---|
7 | // http://www.boost.org/LICENSE_1_0.txt) |
---|
8 | //======================================================================= |
---|
9 | |
---|
10 | #ifndef BOOST_GRAPH_NAMED_FUNCTION_PARAMS_HPP |
---|
11 | #define BOOST_GRAPH_NAMED_FUNCTION_PARAMS_HPP |
---|
12 | |
---|
13 | #include <boost/graph/properties.hpp> |
---|
14 | |
---|
15 | namespace boost { |
---|
16 | |
---|
17 | struct distance_compare_t { }; |
---|
18 | struct distance_combine_t { }; |
---|
19 | struct distance_inf_t { }; |
---|
20 | struct distance_zero_t { }; |
---|
21 | struct buffer_param_t { }; |
---|
22 | struct edge_copy_t { }; |
---|
23 | struct vertex_copy_t { }; |
---|
24 | struct vertex_isomorphism_t { }; |
---|
25 | struct vertex_invariant_t { }; |
---|
26 | struct vertex_invariant1_t { }; |
---|
27 | struct vertex_invariant2_t { }; |
---|
28 | struct edge_compare_t { }; |
---|
29 | struct vertex_max_invariant_t { }; |
---|
30 | struct orig_to_copy_t { }; |
---|
31 | struct root_vertex_t { }; |
---|
32 | struct attractive_force_t { }; |
---|
33 | struct repulsive_force_t { }; |
---|
34 | struct force_pairs_t { }; |
---|
35 | struct cooling_t { }; |
---|
36 | struct vertex_displacement_t { }; |
---|
37 | struct iterations_t { }; |
---|
38 | struct diameter_range_t { }; |
---|
39 | struct learning_constant_range_t { }; |
---|
40 | |
---|
41 | namespace detail { |
---|
42 | template <class T> |
---|
43 | struct wrap_ref { |
---|
44 | wrap_ref(T& r) : ref(r) {} |
---|
45 | T& ref; |
---|
46 | }; |
---|
47 | } |
---|
48 | |
---|
49 | template <typename T, typename Tag, typename Base = no_property> |
---|
50 | struct bgl_named_params : public Base |
---|
51 | { |
---|
52 | typedef bgl_named_params self; |
---|
53 | typedef Base next_type; |
---|
54 | typedef Tag tag_type; |
---|
55 | typedef T value_type; |
---|
56 | bgl_named_params(T v) : m_value(v) { } |
---|
57 | bgl_named_params(T v, const Base& b) : Base(b), m_value(v) { } |
---|
58 | T m_value; |
---|
59 | |
---|
60 | template <typename WeightMap> |
---|
61 | bgl_named_params<WeightMap, edge_weight_t, self> |
---|
62 | weight_map(const WeightMap& pmap) const { |
---|
63 | typedef bgl_named_params<WeightMap, edge_weight_t, self> Params; |
---|
64 | return Params(pmap, *this); |
---|
65 | } |
---|
66 | |
---|
67 | template <typename WeightMap> |
---|
68 | bgl_named_params<WeightMap, edge_weight2_t, self> |
---|
69 | weight_map2(const WeightMap& pmap) const { |
---|
70 | typedef bgl_named_params<WeightMap, edge_weight2_t, self> Params; |
---|
71 | return Params(pmap, *this); |
---|
72 | } |
---|
73 | |
---|
74 | template <typename DistanceMap> |
---|
75 | bgl_named_params<DistanceMap, vertex_distance_t, self> |
---|
76 | distance_map(const DistanceMap& pmap) const { |
---|
77 | typedef bgl_named_params<DistanceMap, vertex_distance_t, self> Params; |
---|
78 | return Params(pmap, *this); |
---|
79 | } |
---|
80 | |
---|
81 | template <typename PredecessorMap> |
---|
82 | bgl_named_params<PredecessorMap, vertex_predecessor_t, self> |
---|
83 | predecessor_map(const PredecessorMap& pmap) const { |
---|
84 | typedef bgl_named_params<PredecessorMap, vertex_predecessor_t, self> |
---|
85 | Params; |
---|
86 | return Params(pmap, *this); |
---|
87 | } |
---|
88 | |
---|
89 | template <typename RankMap> |
---|
90 | bgl_named_params<RankMap, vertex_rank_t, self> |
---|
91 | rank_map(const RankMap& pmap) const { |
---|
92 | typedef bgl_named_params<RankMap, vertex_rank_t, self> |
---|
93 | Params; |
---|
94 | return Params(pmap, *this); |
---|
95 | } |
---|
96 | |
---|
97 | template <typename RootMap> |
---|
98 | bgl_named_params<RootMap, vertex_root_t, self> |
---|
99 | root_map(const RootMap& pmap) const { |
---|
100 | typedef bgl_named_params<RootMap, vertex_root_t, self> |
---|
101 | Params; |
---|
102 | return Params(pmap, *this); |
---|
103 | } |
---|
104 | |
---|
105 | template <typename Vertex> |
---|
106 | bgl_named_params<Vertex, root_vertex_t, self> |
---|
107 | root_vertex(const Vertex& r) const { |
---|
108 | typedef bgl_named_params<Vertex, root_vertex_t, self> Params; |
---|
109 | return Params(r, *this); |
---|
110 | } |
---|
111 | |
---|
112 | template <typename EdgeCentralityMap> |
---|
113 | bgl_named_params<EdgeCentralityMap, edge_centrality_t, self> |
---|
114 | edge_centrality_map(const EdgeCentralityMap& r) const { |
---|
115 | typedef bgl_named_params<EdgeCentralityMap, edge_centrality_t, self> Params; |
---|
116 | return Params(r, *this); |
---|
117 | } |
---|
118 | |
---|
119 | template <typename CentralityMap> |
---|
120 | bgl_named_params<CentralityMap, vertex_centrality_t, self> |
---|
121 | centrality_map(const CentralityMap& r) const { |
---|
122 | typedef bgl_named_params<CentralityMap, vertex_centrality_t, self> Params; |
---|
123 | return Params(r, *this); |
---|
124 | } |
---|
125 | |
---|
126 | template <typename ColorMap> |
---|
127 | bgl_named_params<ColorMap, vertex_color_t, self> |
---|
128 | color_map(const ColorMap& pmap) const { |
---|
129 | typedef bgl_named_params<ColorMap, vertex_color_t, self> Params; |
---|
130 | return Params(pmap, *this); |
---|
131 | } |
---|
132 | |
---|
133 | template <typename ColorMap> |
---|
134 | bgl_named_params<ColorMap, vertex_color_t, self> |
---|
135 | vertex_color_map(const ColorMap& pmap) const { |
---|
136 | typedef bgl_named_params<ColorMap, vertex_color_t, self> Params; |
---|
137 | return Params(pmap, *this); |
---|
138 | } |
---|
139 | |
---|
140 | template <typename ColorMap> |
---|
141 | bgl_named_params<ColorMap, edge_color_t, self> |
---|
142 | edge_color_map(const ColorMap& pmap) const { |
---|
143 | typedef bgl_named_params<ColorMap, edge_color_t, self> Params; |
---|
144 | return Params(pmap, *this); |
---|
145 | } |
---|
146 | |
---|
147 | template <typename CapacityMap> |
---|
148 | bgl_named_params<CapacityMap, edge_capacity_t, self> |
---|
149 | capacity_map(CapacityMap pmap) { |
---|
150 | typedef bgl_named_params<CapacityMap, edge_capacity_t, self> Params; |
---|
151 | return Params(pmap, *this); |
---|
152 | } |
---|
153 | |
---|
154 | template <typename Residual_CapacityMap> |
---|
155 | bgl_named_params<Residual_CapacityMap, edge_residual_capacity_t, self> |
---|
156 | residual_capacity_map(Residual_CapacityMap pmap) { |
---|
157 | typedef bgl_named_params<Residual_CapacityMap, |
---|
158 | edge_residual_capacity_t, self> |
---|
159 | Params; |
---|
160 | return Params(pmap, *this); |
---|
161 | } |
---|
162 | |
---|
163 | template <typename ReverseMap> |
---|
164 | bgl_named_params<ReverseMap, edge_reverse_t, self> |
---|
165 | reverse_edge_map(ReverseMap pmap) { |
---|
166 | typedef bgl_named_params<ReverseMap, |
---|
167 | edge_reverse_t, self> |
---|
168 | Params; |
---|
169 | return Params(pmap, *this); |
---|
170 | } |
---|
171 | |
---|
172 | template <typename DiscoverTimeMap> |
---|
173 | bgl_named_params<DiscoverTimeMap, vertex_discover_time_t, self> |
---|
174 | discover_time_map(const DiscoverTimeMap& pmap) const { |
---|
175 | typedef bgl_named_params<DiscoverTimeMap, vertex_discover_time_t, self> |
---|
176 | Params; |
---|
177 | return Params(pmap, *this); |
---|
178 | } |
---|
179 | |
---|
180 | template <typename LowPointMap> |
---|
181 | bgl_named_params<LowPointMap, vertex_lowpoint_t, self> |
---|
182 | lowpoint_map(const LowPointMap& pmap) const { |
---|
183 | typedef bgl_named_params<LowPointMap, vertex_lowpoint_t, self> |
---|
184 | Params; |
---|
185 | return Params(pmap, *this); |
---|
186 | } |
---|
187 | |
---|
188 | template <typename IndexMap> |
---|
189 | bgl_named_params<IndexMap, vertex_index_t, self> |
---|
190 | vertex_index_map(const IndexMap& pmap) const { |
---|
191 | typedef bgl_named_params<IndexMap, vertex_index_t, self> Params; |
---|
192 | return Params(pmap, *this); |
---|
193 | } |
---|
194 | |
---|
195 | template <typename IndexMap> |
---|
196 | bgl_named_params<IndexMap, vertex_index1_t, self> |
---|
197 | vertex_index1_map(const IndexMap& pmap) const { |
---|
198 | typedef bgl_named_params<IndexMap, vertex_index1_t, self> Params; |
---|
199 | return Params(pmap, *this); |
---|
200 | } |
---|
201 | |
---|
202 | template <typename IndexMap> |
---|
203 | bgl_named_params<IndexMap, vertex_index2_t, self> |
---|
204 | vertex_index2_map(const IndexMap& pmap) const { |
---|
205 | typedef bgl_named_params<IndexMap, vertex_index2_t, self> Params; |
---|
206 | return Params(pmap, *this); |
---|
207 | } |
---|
208 | |
---|
209 | template <typename Visitor> |
---|
210 | bgl_named_params<Visitor, graph_visitor_t, self> |
---|
211 | visitor(const Visitor& vis) const { |
---|
212 | typedef bgl_named_params<Visitor, graph_visitor_t, self> Params; |
---|
213 | return Params(vis, *this); |
---|
214 | } |
---|
215 | |
---|
216 | template <typename Compare> |
---|
217 | bgl_named_params<Compare, distance_compare_t, self> |
---|
218 | distance_compare(Compare cmp) const { |
---|
219 | typedef bgl_named_params<Compare, distance_compare_t, self> Params; |
---|
220 | return Params(cmp, *this); |
---|
221 | } |
---|
222 | |
---|
223 | template <typename Combine> |
---|
224 | bgl_named_params<Combine, distance_combine_t, self> |
---|
225 | distance_combine(Combine cmb) const { |
---|
226 | typedef bgl_named_params<Combine, distance_combine_t, self> Params; |
---|
227 | return Params(cmb, *this); |
---|
228 | } |
---|
229 | |
---|
230 | template <typename Init> |
---|
231 | bgl_named_params<Init, distance_inf_t, self> |
---|
232 | distance_inf(Init init) const { |
---|
233 | typedef bgl_named_params<Init, distance_inf_t, self> Params; |
---|
234 | return Params(init, *this); |
---|
235 | } |
---|
236 | |
---|
237 | template <typename Init> |
---|
238 | bgl_named_params<Init, distance_zero_t, self> |
---|
239 | distance_zero(Init init) const { |
---|
240 | typedef bgl_named_params<Init, distance_zero_t, self> Params; |
---|
241 | return Params(init, *this); |
---|
242 | } |
---|
243 | |
---|
244 | template <typename Buffer> |
---|
245 | bgl_named_params<detail::wrap_ref<Buffer>, buffer_param_t, self> |
---|
246 | buffer(Buffer& b) const { |
---|
247 | typedef bgl_named_params<detail::wrap_ref<Buffer>, buffer_param_t, self> |
---|
248 | Params; |
---|
249 | return Params(detail::wrap_ref<Buffer>(b), *this); |
---|
250 | } |
---|
251 | |
---|
252 | template <typename Copier> |
---|
253 | bgl_named_params<Copier, edge_copy_t, self> |
---|
254 | edge_copy(const Copier& c) const { |
---|
255 | typedef bgl_named_params<Copier, edge_copy_t, self> Params; |
---|
256 | return Params(c, *this); |
---|
257 | } |
---|
258 | |
---|
259 | template <typename Copier> |
---|
260 | bgl_named_params<Copier, vertex_copy_t, self> |
---|
261 | vertex_copy(const Copier& c) const { |
---|
262 | typedef bgl_named_params<Copier, vertex_copy_t, self> Params; |
---|
263 | return Params(c, *this); |
---|
264 | } |
---|
265 | |
---|
266 | template <typename Orig2CopyMap> |
---|
267 | bgl_named_params<Orig2CopyMap, orig_to_copy_t, self> |
---|
268 | orig_to_copy(const Orig2CopyMap& c) const { |
---|
269 | typedef bgl_named_params<Orig2CopyMap, orig_to_copy_t, self> Params; |
---|
270 | return Params(c, *this); |
---|
271 | } |
---|
272 | |
---|
273 | template <typename IsoMap> |
---|
274 | bgl_named_params<IsoMap, vertex_isomorphism_t, self> |
---|
275 | isomorphism_map(const IsoMap& c) const { |
---|
276 | typedef bgl_named_params<IsoMap, vertex_isomorphism_t, self> Params; |
---|
277 | return Params(c, *this); |
---|
278 | } |
---|
279 | |
---|
280 | template <typename VertexInvar> |
---|
281 | bgl_named_params<VertexInvar, vertex_invariant_t, self> |
---|
282 | vertex_invariant(const VertexInvar& c) const { |
---|
283 | typedef bgl_named_params<VertexInvar, vertex_invariant_t, self> Params; |
---|
284 | return Params(c, *this); |
---|
285 | } |
---|
286 | |
---|
287 | template <typename VertexDisplacement> |
---|
288 | bgl_named_params<VertexDisplacement, vertex_displacement_t, self> |
---|
289 | displacement_map(const VertexDisplacement& c) const { |
---|
290 | typedef bgl_named_params<VertexDisplacement, vertex_displacement_t, self> Params; |
---|
291 | return Params(c, *this); |
---|
292 | } |
---|
293 | |
---|
294 | template <typename AttractiveForce> |
---|
295 | bgl_named_params<AttractiveForce, attractive_force_t, self> |
---|
296 | attractive_force(const AttractiveForce& c) { |
---|
297 | typedef bgl_named_params<AttractiveForce, attractive_force_t, self> Params; |
---|
298 | return Params(c, *this); |
---|
299 | } |
---|
300 | |
---|
301 | template <typename RepulsiveForce> |
---|
302 | bgl_named_params<RepulsiveForce, repulsive_force_t, self> |
---|
303 | repulsive_force(const RepulsiveForce& c) { |
---|
304 | typedef bgl_named_params<RepulsiveForce, repulsive_force_t, self> Params; |
---|
305 | return Params(c, *this); |
---|
306 | } |
---|
307 | |
---|
308 | template <typename ForcePairs> |
---|
309 | bgl_named_params<ForcePairs, force_pairs_t, self> |
---|
310 | force_pairs(const ForcePairs& c) { |
---|
311 | typedef bgl_named_params<ForcePairs, force_pairs_t, self> Params; |
---|
312 | return Params(c, *this); |
---|
313 | } |
---|
314 | |
---|
315 | template <typename Cooling> |
---|
316 | bgl_named_params<Cooling, cooling_t, self> |
---|
317 | cooling(const Cooling& c) { |
---|
318 | typedef bgl_named_params<Cooling, cooling_t, self> Params; |
---|
319 | return Params(c, *this); |
---|
320 | } |
---|
321 | |
---|
322 | template <typename TP> |
---|
323 | bgl_named_params<TP, iterations_t, self> |
---|
324 | iterations(const TP& c) { |
---|
325 | typedef bgl_named_params<TP, iterations_t, self> Params; |
---|
326 | return Params(c, *this); |
---|
327 | } |
---|
328 | |
---|
329 | template<typename TP> |
---|
330 | bgl_named_params<std::pair<TP, TP>, diameter_range_t, self> |
---|
331 | diameter_range(const std::pair<TP, TP>& c) { |
---|
332 | typedef bgl_named_params<std::pair<TP, TP>, diameter_range_t, self> Params; |
---|
333 | return Params(c, *this); |
---|
334 | } |
---|
335 | |
---|
336 | template<typename TP> |
---|
337 | bgl_named_params<std::pair<TP, TP>, learning_constant_range_t, self> |
---|
338 | learning_constant_range(const std::pair<TP, TP>& c) { |
---|
339 | typedef bgl_named_params<std::pair<TP, TP>, learning_constant_range_t, self> |
---|
340 | Params; |
---|
341 | return Params(c, *this); |
---|
342 | } |
---|
343 | }; |
---|
344 | |
---|
345 | template <typename WeightMap> |
---|
346 | bgl_named_params<WeightMap, edge_weight_t> |
---|
347 | weight_map(WeightMap pmap) { |
---|
348 | typedef bgl_named_params<WeightMap, edge_weight_t> Params; |
---|
349 | return Params(pmap); |
---|
350 | } |
---|
351 | |
---|
352 | template <typename WeightMap> |
---|
353 | bgl_named_params<WeightMap, edge_weight2_t> |
---|
354 | weight_map2(WeightMap pmap) { |
---|
355 | typedef bgl_named_params<WeightMap, edge_weight2_t> Params; |
---|
356 | return Params(pmap); |
---|
357 | } |
---|
358 | |
---|
359 | template <typename DistanceMap> |
---|
360 | bgl_named_params<DistanceMap, vertex_distance_t> |
---|
361 | distance_map(DistanceMap pmap) { |
---|
362 | typedef bgl_named_params<DistanceMap, vertex_distance_t> Params; |
---|
363 | return Params(pmap); |
---|
364 | } |
---|
365 | |
---|
366 | template <typename PredecessorMap> |
---|
367 | bgl_named_params<PredecessorMap, vertex_predecessor_t> |
---|
368 | predecessor_map(PredecessorMap pmap) { |
---|
369 | typedef bgl_named_params<PredecessorMap, vertex_predecessor_t> Params; |
---|
370 | return Params(pmap); |
---|
371 | } |
---|
372 | |
---|
373 | template <typename RankMap> |
---|
374 | bgl_named_params<RankMap, vertex_rank_t> |
---|
375 | rank_map(RankMap pmap) { |
---|
376 | typedef bgl_named_params<RankMap, vertex_rank_t> Params; |
---|
377 | return Params(pmap); |
---|
378 | } |
---|
379 | |
---|
380 | template <typename RootMap> |
---|
381 | bgl_named_params<RootMap, vertex_root_t> |
---|
382 | root_map(RootMap pmap) { |
---|
383 | typedef bgl_named_params<RootMap, vertex_root_t> Params; |
---|
384 | return Params(pmap); |
---|
385 | } |
---|
386 | |
---|
387 | template <typename Vertex> |
---|
388 | bgl_named_params<Vertex, root_vertex_t> |
---|
389 | root_vertex(const Vertex& r) { |
---|
390 | typedef bgl_named_params<Vertex, root_vertex_t> Params; |
---|
391 | return Params(r); |
---|
392 | } |
---|
393 | |
---|
394 | template <typename EdgeCentralityMap> |
---|
395 | bgl_named_params<EdgeCentralityMap, edge_centrality_t> |
---|
396 | edge_centrality_map(const EdgeCentralityMap& r) { |
---|
397 | typedef bgl_named_params<EdgeCentralityMap, edge_centrality_t> Params; |
---|
398 | return Params(r); |
---|
399 | } |
---|
400 | |
---|
401 | template <typename CentralityMap> |
---|
402 | bgl_named_params<CentralityMap, vertex_centrality_t> |
---|
403 | centrality_map(const CentralityMap& r) { |
---|
404 | typedef bgl_named_params<CentralityMap, vertex_centrality_t> Params; |
---|
405 | return Params(r); |
---|
406 | } |
---|
407 | |
---|
408 | template <typename ColorMap> |
---|
409 | bgl_named_params<ColorMap, vertex_color_t> |
---|
410 | color_map(ColorMap pmap) { |
---|
411 | typedef bgl_named_params<ColorMap, vertex_color_t> Params; |
---|
412 | return Params(pmap); |
---|
413 | } |
---|
414 | |
---|
415 | template <typename CapacityMap> |
---|
416 | bgl_named_params<CapacityMap, edge_capacity_t> |
---|
417 | capacity_map(CapacityMap pmap) { |
---|
418 | typedef bgl_named_params<CapacityMap, edge_capacity_t> Params; |
---|
419 | return Params(pmap); |
---|
420 | } |
---|
421 | |
---|
422 | template <typename Residual_CapacityMap> |
---|
423 | bgl_named_params<Residual_CapacityMap, edge_residual_capacity_t> |
---|
424 | residual_capacity_map(Residual_CapacityMap pmap) { |
---|
425 | typedef bgl_named_params<Residual_CapacityMap, edge_residual_capacity_t> |
---|
426 | Params; |
---|
427 | return Params(pmap); |
---|
428 | } |
---|
429 | |
---|
430 | template <typename ReverseMap> |
---|
431 | bgl_named_params<ReverseMap, edge_reverse_t> |
---|
432 | reverse_edge_map(ReverseMap pmap) { |
---|
433 | typedef bgl_named_params<ReverseMap, edge_reverse_t> |
---|
434 | Params; |
---|
435 | return Params(pmap); |
---|
436 | } |
---|
437 | |
---|
438 | template <typename DiscoverTimeMap> |
---|
439 | bgl_named_params<DiscoverTimeMap, vertex_discover_time_t> |
---|
440 | discover_time_map(DiscoverTimeMap pmap) { |
---|
441 | typedef bgl_named_params<DiscoverTimeMap, vertex_discover_time_t> Params; |
---|
442 | return Params(pmap); |
---|
443 | } |
---|
444 | |
---|
445 | template <typename LowPointMap> |
---|
446 | bgl_named_params<LowPointMap, vertex_lowpoint_t> |
---|
447 | lowpoint_map(LowPointMap pmap) { |
---|
448 | typedef bgl_named_params<LowPointMap, vertex_lowpoint_t> Params; |
---|
449 | return Params(pmap); |
---|
450 | } |
---|
451 | |
---|
452 | template <typename IndexMap> |
---|
453 | bgl_named_params<IndexMap, vertex_index_t> |
---|
454 | vertex_index_map(IndexMap pmap) { |
---|
455 | typedef bgl_named_params<IndexMap, vertex_index_t> Params; |
---|
456 | return Params(pmap); |
---|
457 | } |
---|
458 | |
---|
459 | template <typename IndexMap> |
---|
460 | bgl_named_params<IndexMap, vertex_index1_t> |
---|
461 | vertex_index1_map(const IndexMap& pmap) { |
---|
462 | typedef bgl_named_params<IndexMap, vertex_index1_t> Params; |
---|
463 | return Params(pmap); |
---|
464 | } |
---|
465 | |
---|
466 | template <typename IndexMap> |
---|
467 | bgl_named_params<IndexMap, vertex_index2_t> |
---|
468 | vertex_index2_map(const IndexMap& pmap) { |
---|
469 | typedef bgl_named_params<IndexMap, vertex_index2_t> Params; |
---|
470 | return Params(pmap); |
---|
471 | } |
---|
472 | |
---|
473 | template <typename Visitor> |
---|
474 | bgl_named_params<Visitor, graph_visitor_t> |
---|
475 | visitor(const Visitor& vis) { |
---|
476 | typedef bgl_named_params<Visitor, graph_visitor_t> Params; |
---|
477 | return Params(vis); |
---|
478 | } |
---|
479 | |
---|
480 | template <typename Compare> |
---|
481 | bgl_named_params<Compare, distance_compare_t> |
---|
482 | distance_compare(Compare cmp) { |
---|
483 | typedef bgl_named_params<Compare, distance_compare_t> Params; |
---|
484 | return Params(cmp); |
---|
485 | } |
---|
486 | |
---|
487 | template <typename Combine> |
---|
488 | bgl_named_params<Combine, distance_combine_t> |
---|
489 | distance_combine(Combine cmb) { |
---|
490 | typedef bgl_named_params<Combine, distance_combine_t> Params; |
---|
491 | return Params(cmb); |
---|
492 | } |
---|
493 | |
---|
494 | template <typename Init> |
---|
495 | bgl_named_params<Init, distance_inf_t> |
---|
496 | distance_inf(Init init) { |
---|
497 | typedef bgl_named_params<Init, distance_inf_t> Params; |
---|
498 | return Params(init); |
---|
499 | } |
---|
500 | |
---|
501 | template <typename Init> |
---|
502 | bgl_named_params<Init, distance_zero_t> |
---|
503 | distance_zero(Init init) { |
---|
504 | typedef bgl_named_params<Init, distance_zero_t> Params; |
---|
505 | return Params(init); |
---|
506 | } |
---|
507 | |
---|
508 | template <typename Buffer> |
---|
509 | bgl_named_params<detail::wrap_ref<Buffer>, buffer_param_t> |
---|
510 | buffer(Buffer& b) { |
---|
511 | typedef bgl_named_params<detail::wrap_ref<Buffer>, buffer_param_t> Params; |
---|
512 | return Params(detail::wrap_ref<Buffer>(b)); |
---|
513 | } |
---|
514 | |
---|
515 | template <typename Copier> |
---|
516 | bgl_named_params<Copier, edge_copy_t> |
---|
517 | edge_copy(const Copier& c) { |
---|
518 | typedef bgl_named_params<Copier, edge_copy_t> Params; |
---|
519 | return Params(c); |
---|
520 | } |
---|
521 | |
---|
522 | template <typename Copier> |
---|
523 | bgl_named_params<Copier, vertex_copy_t> |
---|
524 | vertex_copy(const Copier& c) { |
---|
525 | typedef bgl_named_params<Copier, vertex_copy_t> Params; |
---|
526 | return Params(c); |
---|
527 | } |
---|
528 | |
---|
529 | template <typename Orig2CopyMap> |
---|
530 | bgl_named_params<Orig2CopyMap, orig_to_copy_t> |
---|
531 | orig_to_copy(const Orig2CopyMap& c) { |
---|
532 | typedef bgl_named_params<Orig2CopyMap, orig_to_copy_t> Params; |
---|
533 | return Params(c); |
---|
534 | } |
---|
535 | |
---|
536 | template <typename IsoMap> |
---|
537 | bgl_named_params<IsoMap, vertex_isomorphism_t> |
---|
538 | isomorphism_map(const IsoMap& c) { |
---|
539 | typedef bgl_named_params<IsoMap, vertex_isomorphism_t> Params; |
---|
540 | return Params(c); |
---|
541 | } |
---|
542 | |
---|
543 | template <typename VertexInvar> |
---|
544 | bgl_named_params<VertexInvar, vertex_invariant_t> |
---|
545 | vertex_invariant(const VertexInvar& c) { |
---|
546 | typedef bgl_named_params<VertexInvar, vertex_invariant_t> Params; |
---|
547 | return Params(c); |
---|
548 | } |
---|
549 | |
---|
550 | template <typename VertexDisplacement> |
---|
551 | bgl_named_params<VertexDisplacement, vertex_displacement_t> |
---|
552 | displacement_map(const VertexDisplacement& c) { |
---|
553 | typedef bgl_named_params<VertexDisplacement, vertex_displacement_t> Params; |
---|
554 | return Params(c); |
---|
555 | } |
---|
556 | |
---|
557 | template <typename AttractiveForce> |
---|
558 | bgl_named_params<AttractiveForce, attractive_force_t> |
---|
559 | attractive_force(const AttractiveForce& c) { |
---|
560 | typedef bgl_named_params<AttractiveForce, attractive_force_t> Params; |
---|
561 | return Params(c); |
---|
562 | } |
---|
563 | |
---|
564 | template <typename RepulsiveForce> |
---|
565 | bgl_named_params<RepulsiveForce, repulsive_force_t> |
---|
566 | repulsive_force(const RepulsiveForce& c) { |
---|
567 | typedef bgl_named_params<RepulsiveForce, repulsive_force_t> Params; |
---|
568 | return Params(c); |
---|
569 | } |
---|
570 | |
---|
571 | template <typename ForcePairs> |
---|
572 | bgl_named_params<ForcePairs, force_pairs_t> |
---|
573 | force_pairs(const ForcePairs& c) { |
---|
574 | typedef bgl_named_params<ForcePairs, force_pairs_t> Params; |
---|
575 | return Params(c); |
---|
576 | } |
---|
577 | |
---|
578 | template <typename Cooling> |
---|
579 | bgl_named_params<Cooling, cooling_t> |
---|
580 | cooling(const Cooling& c) { |
---|
581 | typedef bgl_named_params<Cooling, cooling_t> Params; |
---|
582 | return Params(c); |
---|
583 | } |
---|
584 | |
---|
585 | template <typename T> |
---|
586 | bgl_named_params<T, iterations_t> |
---|
587 | iterations(const T& c) { |
---|
588 | typedef bgl_named_params<T, iterations_t> Params; |
---|
589 | return Params(c); |
---|
590 | } |
---|
591 | |
---|
592 | template<typename T> |
---|
593 | bgl_named_params<std::pair<T, T>, diameter_range_t> |
---|
594 | diameter_range(const std::pair<T, T>& c) { |
---|
595 | typedef bgl_named_params<std::pair<T, T>, diameter_range_t> Params; |
---|
596 | return Params(c); |
---|
597 | } |
---|
598 | |
---|
599 | template<typename T> |
---|
600 | bgl_named_params<std::pair<T, T>, learning_constant_range_t> |
---|
601 | learning_constant_range(const std::pair<T, T>& c) { |
---|
602 | typedef bgl_named_params<std::pair<T, T>, learning_constant_range_t> |
---|
603 | Params; |
---|
604 | return Params(c); |
---|
605 | } |
---|
606 | |
---|
607 | //=========================================================================== |
---|
608 | // Functions for extracting parameters from bgl_named_params |
---|
609 | |
---|
610 | template <class Tag1, class Tag2, class T1, class Base> |
---|
611 | inline |
---|
612 | typename property_value< bgl_named_params<T1,Tag1,Base>, Tag2>::type |
---|
613 | get_param(const bgl_named_params<T1,Tag1,Base>& p, Tag2 tag2) |
---|
614 | { |
---|
615 | enum { match = detail::same_property<Tag1,Tag2>::value }; |
---|
616 | typedef typename |
---|
617 | property_value< bgl_named_params<T1,Tag1,Base>, Tag2>::type T2; |
---|
618 | T2* t2 = 0; |
---|
619 | typedef detail::property_value_dispatch<match> Dispatcher; |
---|
620 | return Dispatcher::const_get_value(p, t2, tag2); |
---|
621 | } |
---|
622 | |
---|
623 | |
---|
624 | namespace detail { |
---|
625 | // MSVC++ workaround |
---|
626 | template <class Param> |
---|
627 | struct choose_param_helper { |
---|
628 | template <class Default> struct result { typedef Param type; }; |
---|
629 | template <typename Default> |
---|
630 | static const Param& apply(const Param& p, const Default&) { return p; } |
---|
631 | }; |
---|
632 | template <> |
---|
633 | struct choose_param_helper<error_property_not_found> { |
---|
634 | template <class Default> struct result { typedef Default type; }; |
---|
635 | template <typename Default> |
---|
636 | static const Default& apply(const error_property_not_found&, const Default& d) |
---|
637 | { return d; } |
---|
638 | }; |
---|
639 | } // namespace detail |
---|
640 | |
---|
641 | template <class P, class Default> |
---|
642 | const typename detail::choose_param_helper<P>::template result<Default>::type& |
---|
643 | choose_param(const P& param, const Default& d) { |
---|
644 | return detail::choose_param_helper<P>::apply(param, d); |
---|
645 | } |
---|
646 | |
---|
647 | template <typename T> |
---|
648 | inline bool is_default_param(const T&) { return false; } |
---|
649 | |
---|
650 | inline bool is_default_param(const detail::error_property_not_found&) |
---|
651 | { return true; } |
---|
652 | |
---|
653 | namespace detail { |
---|
654 | |
---|
655 | struct choose_parameter { |
---|
656 | template <class P, class Graph, class Tag> |
---|
657 | struct bind_ { |
---|
658 | typedef const P& const_result_type; |
---|
659 | typedef const P& result_type; |
---|
660 | typedef P type; |
---|
661 | }; |
---|
662 | |
---|
663 | template <class P, class Graph, class Tag> |
---|
664 | static typename bind_<P, Graph, Tag>::const_result_type |
---|
665 | const_apply(const P& p, const Graph&, Tag&) |
---|
666 | { return p; } |
---|
667 | |
---|
668 | template <class P, class Graph, class Tag> |
---|
669 | static typename bind_<P, Graph, Tag>::result_type |
---|
670 | apply(const P& p, Graph&, Tag&) |
---|
671 | { return p; } |
---|
672 | }; |
---|
673 | |
---|
674 | struct choose_default_param { |
---|
675 | template <class P, class Graph, class Tag> |
---|
676 | struct bind_ { |
---|
677 | typedef typename property_map<Graph, Tag>::type |
---|
678 | result_type; |
---|
679 | typedef typename property_map<Graph, Tag>::const_type |
---|
680 | const_result_type; |
---|
681 | typedef typename property_map<Graph, Tag>::const_type |
---|
682 | type; |
---|
683 | }; |
---|
684 | |
---|
685 | template <class P, class Graph, class Tag> |
---|
686 | static typename bind_<P, Graph, Tag>::const_result_type |
---|
687 | const_apply(const P&, const Graph& g, Tag tag) { |
---|
688 | return get(tag, g); |
---|
689 | } |
---|
690 | template <class P, class Graph, class Tag> |
---|
691 | static typename bind_<P, Graph, Tag>::result_type |
---|
692 | apply(const P&, Graph& g, Tag tag) { |
---|
693 | return get(tag, g); |
---|
694 | } |
---|
695 | }; |
---|
696 | |
---|
697 | template <class Param> |
---|
698 | struct choose_property_map { |
---|
699 | typedef choose_parameter type; |
---|
700 | }; |
---|
701 | template <> |
---|
702 | struct choose_property_map<detail::error_property_not_found> { |
---|
703 | typedef choose_default_param type; |
---|
704 | }; |
---|
705 | |
---|
706 | template <class Param, class Graph, class Tag> |
---|
707 | struct choose_pmap_helper { |
---|
708 | typedef typename choose_property_map<Param>::type Selector; |
---|
709 | typedef typename Selector:: template bind_<Param, Graph, Tag> Bind; |
---|
710 | typedef Bind type; |
---|
711 | typedef typename Bind::result_type result_type; |
---|
712 | typedef typename Bind::const_result_type const_result_type; |
---|
713 | typedef typename Bind::type result; |
---|
714 | }; |
---|
715 | |
---|
716 | // used in the max-flow algorithms |
---|
717 | template <class Graph, class P, class T, class R> |
---|
718 | struct edge_capacity_value |
---|
719 | { |
---|
720 | typedef bgl_named_params<P, T, R> Params; |
---|
721 | typedef typename property_value< Params, edge_capacity_t>::type Param; |
---|
722 | typedef typename detail::choose_pmap_helper<Param, Graph, |
---|
723 | edge_capacity_t>::result CapacityEdgeMap; |
---|
724 | typedef typename property_traits<CapacityEdgeMap>::value_type type; |
---|
725 | }; |
---|
726 | |
---|
727 | } // namespace detail |
---|
728 | |
---|
729 | |
---|
730 | // Use this function instead of choose_param() when you want |
---|
731 | // to avoid requiring get(tag, g) when it is not used. |
---|
732 | template <typename Param, typename Graph, typename PropertyTag> |
---|
733 | typename |
---|
734 | detail::choose_pmap_helper<Param,Graph,PropertyTag>::const_result_type |
---|
735 | choose_const_pmap(const Param& p, const Graph& g, PropertyTag tag) |
---|
736 | { |
---|
737 | typedef typename |
---|
738 | detail::choose_pmap_helper<Param,Graph,PropertyTag>::Selector Choice; |
---|
739 | return Choice::const_apply(p, g, tag); |
---|
740 | } |
---|
741 | |
---|
742 | template <typename Param, typename Graph, typename PropertyTag> |
---|
743 | typename detail::choose_pmap_helper<Param,Graph,PropertyTag>::result_type |
---|
744 | choose_pmap(const Param& p, Graph& g, PropertyTag tag) |
---|
745 | { |
---|
746 | typedef typename |
---|
747 | detail::choose_pmap_helper<Param,Graph,PropertyTag>::Selector Choice; |
---|
748 | return Choice::apply(p, g, tag); |
---|
749 | } |
---|
750 | |
---|
751 | } // namespace boost |
---|
752 | |
---|
753 | #endif // BOOST_GRAPH_NAMED_FUNCTION_PARAMS_HPP |
---|