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