Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_34_1/boost/graph/named_function_params.hpp @ 35

Last change on this file since 35 was 29, checked in by landauf, 16 years ago

updated boost from 1_33_1 to 1_34_1

File size: 24.2 KB
Line 
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
15namespace 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
Note: See TracBrowser for help on using the repository browser.