epoc32/include/stdapis/boost/graph/graph_utility.hpp
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
williamr@2
     1
//
williamr@2
     2
//=======================================================================
williamr@2
     3
// Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
williamr@2
     4
// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
williamr@2
     5
//
williamr@2
     6
// Distributed under the Boost Software License, Version 1.0. (See
williamr@2
     7
// accompanying file LICENSE_1_0.txt or copy at
williamr@2
     8
// http://www.boost.org/LICENSE_1_0.txt)
williamr@2
     9
//=======================================================================
williamr@2
    10
//
williamr@2
    11
#ifndef BOOST_GRAPH_UTILITY_HPP
williamr@2
    12
#define BOOST_GRAPH_UTILITY_HPP
williamr@2
    13
williamr@2
    14
#include <stdlib.h>
williamr@2
    15
#include <iostream>
williamr@2
    16
#include <algorithm>
williamr@2
    17
#include <assert.h>
williamr@2
    18
#include <boost/config.hpp>
williamr@2
    19
#include <boost/tuple/tuple.hpp>
williamr@2
    20
williamr@2
    21
#if !defined BOOST_NO_SLIST
williamr@2
    22
#  ifdef BOOST_SLIST_HEADER
williamr@2
    23
#    include BOOST_SLIST_HEADER
williamr@2
    24
#  else
williamr@2
    25
#    include <slist>
williamr@2
    26
#  endif
williamr@2
    27
#endif
williamr@2
    28
williamr@2
    29
#include <boost/graph/graph_traits.hpp>
williamr@2
    30
#include <boost/graph/properties.hpp>
williamr@2
    31
#include <boost/pending/container_traits.hpp>
williamr@2
    32
#include <boost/graph/depth_first_search.hpp>
williamr@2
    33
// iota moved to detail/algorithm.hpp
williamr@2
    34
#include <boost/detail/algorithm.hpp>
williamr@2
    35
williamr@2
    36
namespace boost {
williamr@2
    37
williamr@2
    38
  // Provide an undirected graph interface alternative to the
williamr@2
    39
  // the source() and target() edge functions.
williamr@2
    40
  template <class UndirectedGraph>
williamr@2
    41
  inline 
williamr@2
    42
  std::pair<typename graph_traits<UndirectedGraph>::vertex_descriptor,
williamr@2
    43
            typename graph_traits<UndirectedGraph>::vertex_descriptor>
williamr@2
    44
  incident(typename graph_traits<UndirectedGraph>::edge_descriptor e,
williamr@2
    45
           UndirectedGraph& g)
williamr@2
    46
  {
williamr@2
    47
    return std::make_pair(source(e,g), target(e,g));
williamr@2
    48
  }
williamr@2
    49
williamr@2
    50
  // Provide an undirected graph interface alternative
williamr@2
    51
  // to the out_edges() function.
williamr@2
    52
  template <class Graph>
williamr@2
    53
  inline 
williamr@2
    54
  std::pair<typename graph_traits<Graph>::out_edge_iterator,
williamr@2
    55
            typename graph_traits<Graph>::out_edge_iterator>
williamr@2
    56
  incident_edges(typename graph_traits<Graph>::vertex_descriptor u,
williamr@2
    57
                 Graph& g)
williamr@2
    58
  {
williamr@2
    59
    return out_edges(u, g);
williamr@2
    60
  }
williamr@2
    61
williamr@2
    62
  template <class Graph>
williamr@2
    63
  inline typename graph_traits<Graph>::vertex_descriptor
williamr@2
    64
  opposite(typename graph_traits<Graph>::edge_descriptor e,
williamr@2
    65
           typename graph_traits<Graph>::vertex_descriptor v,
williamr@2
    66
           const Graph& g)
williamr@2
    67
  {
williamr@2
    68
    typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
williamr@2
    69
    if (v == source(e, g))
williamr@2
    70
      return target(e, g);
williamr@2
    71
    else if (v == target(e, g))
williamr@2
    72
      return source(e, g);
williamr@2
    73
    else
williamr@2
    74
      return vertex_descriptor();
williamr@2
    75
  }
williamr@2
    76
williamr@2
    77
  //===========================================================================
williamr@2
    78
  // Some handy predicates
williamr@2
    79
williamr@2
    80
  template <typename Vertex, typename Graph>
williamr@2
    81
  struct incident_from_predicate {
williamr@2
    82
    incident_from_predicate(Vertex u, const Graph& g)
williamr@2
    83
      : m_u(u), m_g(g) { }
williamr@2
    84
    template <class Edge>
williamr@2
    85
    bool operator()(const Edge& e) const {
williamr@2
    86
      return source(e, m_g) == m_u;
williamr@2
    87
    }
williamr@2
    88
    Vertex m_u;
williamr@2
    89
    const Graph& m_g;
williamr@2
    90
  };
williamr@2
    91
  template <typename Vertex, typename Graph>
williamr@2
    92
  inline incident_from_predicate<Vertex, Graph>
williamr@2
    93
  incident_from(Vertex u, const Graph& g) {
williamr@2
    94
    return incident_from_predicate<Vertex, Graph>(u, g);
williamr@2
    95
  }
williamr@2
    96
  
williamr@2
    97
  template <typename Vertex, typename Graph>
williamr@2
    98
  struct incident_to_predicate {
williamr@2
    99
    incident_to_predicate(Vertex u, const Graph& g)
williamr@2
   100
      : m_u(u), m_g(g) { }
williamr@2
   101
    template <class Edge>
williamr@2
   102
    bool operator()(const Edge& e) const {
williamr@2
   103
      return target(e, m_g) == m_u;
williamr@2
   104
    }
williamr@2
   105
    Vertex m_u;
williamr@2
   106
    const Graph& m_g;
williamr@2
   107
  };
williamr@2
   108
  template <typename Vertex, typename Graph>
williamr@2
   109
  inline incident_to_predicate<Vertex, Graph>
williamr@2
   110
  incident_to(Vertex u, const Graph& g) {
williamr@2
   111
    return incident_to_predicate<Vertex, Graph>(u, g);
williamr@2
   112
  }
williamr@2
   113
williamr@2
   114
  template <typename Vertex, typename Graph>
williamr@2
   115
  struct incident_on_predicate {
williamr@2
   116
    incident_on_predicate(Vertex u, const Graph& g)
williamr@2
   117
      : m_u(u), m_g(g) { }
williamr@2
   118
    template <class Edge>
williamr@2
   119
    bool operator()(const Edge& e) const {
williamr@2
   120
      return source(e, m_g) == m_u || target(e, m_g) == m_u;
williamr@2
   121
    }
williamr@2
   122
    Vertex m_u;
williamr@2
   123
    const Graph& m_g;
williamr@2
   124
  };
williamr@2
   125
  template <typename Vertex, typename Graph>
williamr@2
   126
  inline incident_on_predicate<Vertex, Graph>
williamr@2
   127
  incident_on(Vertex u, const Graph& g) {
williamr@2
   128
    return incident_on_predicate<Vertex, Graph>(u, g);
williamr@2
   129
  }
williamr@2
   130
  
williamr@2
   131
  template <typename Vertex, typename Graph>
williamr@2
   132
  struct connects_predicate {
williamr@2
   133
    connects_predicate(Vertex u, Vertex v, const Graph& g)
williamr@2
   134
      : m_u(u), m_v(v), m_g(g) { }
williamr@2
   135
    template <class Edge>
williamr@2
   136
    bool operator()(const Edge& e) const {
williamr@2
   137
      if (is_directed(m_g))
williamr@2
   138
        return source(e, m_g) == m_u && target(e, m_g) == m_v;
williamr@2
   139
      else
williamr@2
   140
        return (source(e, m_g) == m_u && target(e, m_g) == m_v)
williamr@2
   141
          || (source(e, m_g) == m_v && target(e, m_g) == m_u);
williamr@2
   142
    }
williamr@2
   143
    Vertex m_u, m_v;
williamr@2
   144
    const Graph& m_g;
williamr@2
   145
  };
williamr@2
   146
  template <typename Vertex, typename Graph>
williamr@2
   147
  inline connects_predicate<Vertex, Graph>
williamr@2
   148
  connects(Vertex u, Vertex v, const Graph& g) {
williamr@2
   149
          return connects_predicate<Vertex, Graph>(u, v, g);
williamr@2
   150
  }
williamr@2
   151
williamr@2
   152
williamr@2
   153
  // Need to convert all of these printing functions to take an ostream object
williamr@2
   154
  // -JGS
williamr@2
   155
williamr@2
   156
  template <class IncidenceGraph, class Name>
williamr@2
   157
  void print_in_edges(const IncidenceGraph& G, Name name)
williamr@2
   158
  {
williamr@2
   159
    typename graph_traits<IncidenceGraph>::vertex_iterator ui,ui_end;
williamr@2
   160
    for (tie(ui,ui_end) = vertices(G); ui != ui_end; ++ui) {
williamr@2
   161
      std::cout << get(name,*ui) << " <-- ";
williamr@2
   162
      typename graph_traits<IncidenceGraph>
williamr@2
   163
        ::in_edge_iterator ei, ei_end;
williamr@2
   164
      for(tie(ei,ei_end) = in_edges(*ui,G); ei != ei_end; ++ei)
williamr@2
   165
        std::cout << get(name,source(*ei,G)) << " ";
williamr@2
   166
      std::cout << std::endl;
williamr@2
   167
    }
williamr@2
   168
  }
williamr@2
   169
williamr@2
   170
  template <class IncidenceGraph, class Name>
williamr@2
   171
  void print_graph_dispatch(const IncidenceGraph& G, Name name, directed_tag)
williamr@2
   172
  {
williamr@2
   173
    typename graph_traits<IncidenceGraph>::vertex_iterator ui,ui_end;
williamr@2
   174
    for (tie(ui,ui_end) = vertices(G); ui != ui_end; ++ui) {
williamr@2
   175
      std::cout << get(name,*ui) << " --> ";
williamr@2
   176
      typename graph_traits<IncidenceGraph>
williamr@2
   177
        ::out_edge_iterator ei, ei_end;
williamr@2
   178
      for(tie(ei,ei_end) = out_edges(*ui,G); ei != ei_end; ++ei)
williamr@2
   179
        std::cout << get(name,target(*ei,G)) << " ";
williamr@2
   180
      std::cout << std::endl;
williamr@2
   181
    }
williamr@2
   182
  }
williamr@2
   183
  template <class IncidenceGraph, class Name>
williamr@2
   184
  void print_graph_dispatch(const IncidenceGraph& G, Name name, undirected_tag)
williamr@2
   185
  {
williamr@2
   186
    typename graph_traits<IncidenceGraph>::vertex_iterator ui,ui_end;
williamr@2
   187
    for (tie(ui,ui_end) = vertices(G); ui != ui_end; ++ui) {
williamr@2
   188
      std::cout << get(name,*ui) << " <--> ";
williamr@2
   189
      typename graph_traits<IncidenceGraph>
williamr@2
   190
        ::out_edge_iterator ei, ei_end;
williamr@2
   191
      for(tie(ei,ei_end) = out_edges(*ui,G); ei != ei_end; ++ei)
williamr@2
   192
        std::cout << get(name,target(*ei,G)) << " ";
williamr@2
   193
      std::cout << std::endl;
williamr@2
   194
    }
williamr@2
   195
  }
williamr@2
   196
  template <class IncidenceGraph, class Name>
williamr@2
   197
  void print_graph(const IncidenceGraph& G, Name name)
williamr@2
   198
  {
williamr@2
   199
    typedef typename graph_traits<IncidenceGraph>
williamr@2
   200
      ::directed_category Cat;
williamr@2
   201
    print_graph_dispatch(G, name, Cat());
williamr@2
   202
  }
williamr@2
   203
  template <class IncidenceGraph>
williamr@2
   204
  void print_graph(const IncidenceGraph& G) {
williamr@2
   205
    print_graph(G, get(vertex_index, G));
williamr@2
   206
  }
williamr@2
   207
williamr@2
   208
  template <class EdgeListGraph, class Name>
williamr@2
   209
  void print_edges(const EdgeListGraph& G, Name name)
williamr@2
   210
  {
williamr@2
   211
    typename graph_traits<EdgeListGraph>::edge_iterator ei, ei_end;
williamr@2
   212
    for (tie(ei, ei_end) = edges(G); ei != ei_end; ++ei)
williamr@2
   213
      std::cout << "(" << get(name, source(*ei, G))
williamr@2
   214
                << "," << get(name, target(*ei, G)) << ") ";
williamr@2
   215
    std::cout << std::endl;
williamr@2
   216
  }
williamr@2
   217
williamr@2
   218
  template <class EdgeListGraph, class VertexName, class EdgeName>
williamr@2
   219
  void print_edges2(const EdgeListGraph& G, VertexName vname, EdgeName ename)
williamr@2
   220
  {
williamr@2
   221
    typename graph_traits<EdgeListGraph>::edge_iterator ei, ei_end;
williamr@2
   222
    for (tie(ei, ei_end) = edges(G); ei != ei_end; ++ei)
williamr@2
   223
      std::cout << get(ename, *ei) << "(" << get(vname, source(*ei, G))
williamr@2
   224
                << "," << get(vname, target(*ei, G)) << ") ";
williamr@2
   225
    std::cout << std::endl;
williamr@2
   226
  }
williamr@2
   227
williamr@2
   228
  template <class VertexListGraph, class Name>
williamr@2
   229
  void print_vertices(const VertexListGraph& G, Name name)
williamr@2
   230
  {
williamr@2
   231
    typename graph_traits<VertexListGraph>::vertex_iterator vi,vi_end;
williamr@2
   232
    for (tie(vi,vi_end) = vertices(G); vi != vi_end; ++vi)
williamr@2
   233
      std::cout << get(name,*vi) << " ";
williamr@2
   234
    std::cout << std::endl;
williamr@2
   235
  }
williamr@2
   236
williamr@2
   237
  template <class Graph, class Vertex>
williamr@2
   238
  bool is_adj_dispatch(Graph& g, Vertex a, Vertex b, bidirectional_tag)
williamr@2
   239
  {
williamr@2
   240
    typedef typename graph_traits<Graph>::edge_descriptor 
williamr@2
   241
      edge_descriptor;
williamr@2
   242
    typename graph_traits<Graph>::adjacency_iterator vi, viend, 
williamr@2
   243
      adj_found;
williamr@2
   244
    tie(vi, viend) = adjacent_vertices(a, g);
williamr@2
   245
    adj_found = std::find(vi, viend, b);
williamr@2
   246
    if (adj_found == viend)
williamr@2
   247
      return false;  
williamr@2
   248
williamr@2
   249
    typename graph_traits<Graph>::out_edge_iterator oi, oiend, 
williamr@2
   250
      out_found;
williamr@2
   251
    tie(oi, oiend) = out_edges(a, g);
williamr@2
   252
    out_found = std::find_if(oi, oiend, incident_to(b, g));
williamr@2
   253
    if (out_found == oiend)
williamr@2
   254
      return false;
williamr@2
   255
williamr@2
   256
    typename graph_traits<Graph>::in_edge_iterator ii, iiend, 
williamr@2
   257
      in_found;
williamr@2
   258
    tie(ii, iiend) = in_edges(b, g);
williamr@2
   259
    in_found = std::find_if(ii, iiend, incident_from(a, g));
williamr@2
   260
    if (in_found == iiend)
williamr@2
   261
      return false;
williamr@2
   262
williamr@2
   263
    return true;
williamr@2
   264
  }
williamr@2
   265
  template <class Graph, class Vertex>
williamr@2
   266
  bool is_adj_dispatch(Graph& g, Vertex a, Vertex b, directed_tag)
williamr@2
   267
  {
williamr@2
   268
    typedef typename graph_traits<Graph>::edge_descriptor 
williamr@2
   269
      edge_descriptor;
williamr@2
   270
    typename graph_traits<Graph>::adjacency_iterator vi, viend, found;
williamr@2
   271
    tie(vi, viend) = adjacent_vertices(a, g);
williamr@2
   272
#if defined(BOOST_MSVC) && BOOST_MSVC <= 1300 && defined(__SGI_STL_PORT)
williamr@2
   273
    // Getting internal compiler error with std::find()
williamr@2
   274
    found = viend;
williamr@2
   275
    for (; vi != viend; ++vi)
williamr@2
   276
      if (*vi == b) {
williamr@2
   277
        found = vi;
williamr@2
   278
        break;
williamr@2
   279
      }
williamr@2
   280
#else
williamr@2
   281
    found = std::find(vi, viend, b);
williamr@2
   282
#endif
williamr@2
   283
    if ( found == viend )
williamr@2
   284
      return false;
williamr@2
   285
williamr@2
   286
    typename graph_traits<Graph>::out_edge_iterator oi, oiend, 
williamr@2
   287
      out_found;
williamr@2
   288
    tie(oi, oiend) = out_edges(a, g);
williamr@2
   289
williamr@2
   290
#if defined(BOOST_MSVC) && BOOST_MSVC <= 1300 && defined(__SGI_STL_PORT)
williamr@2
   291
    // Getting internal compiler error with std::find()
williamr@2
   292
    out_found = oiend;
williamr@2
   293
    for (; oi != oiend; ++oi)
williamr@2
   294
      if (target(*oi, g) == b) {
williamr@2
   295
        out_found = oi;
williamr@2
   296
        break;
williamr@2
   297
      }
williamr@2
   298
#else
williamr@2
   299
    out_found = std::find_if(oi, oiend, incident_to(b, g));
williamr@2
   300
#endif
williamr@2
   301
    if (out_found == oiend)
williamr@2
   302
      return false;
williamr@2
   303
    return true;
williamr@2
   304
  }
williamr@2
   305
  template <class Graph, class Vertex>
williamr@2
   306
  bool is_adj_dispatch(Graph& g, Vertex a, Vertex b, undirected_tag)
williamr@2
   307
  {
williamr@2
   308
    return is_adj_dispatch(g, a, b, directed_tag());
williamr@2
   309
  }
williamr@2
   310
williamr@2
   311
  template <class Graph, class Vertex>
williamr@2
   312
  bool is_adjacent(Graph& g, Vertex a, Vertex b) {
williamr@2
   313
    typedef typename graph_traits<Graph>::directed_category Cat;
williamr@2
   314
    return is_adj_dispatch(g, a, b, Cat());
williamr@2
   315
  }
williamr@2
   316
williamr@2
   317
  template <class Graph, class Edge>
williamr@2
   318
  bool in_edge_set(Graph& g, Edge e)
williamr@2
   319
  {
williamr@2
   320
    typename Graph::edge_iterator ei, ei_end, found;
williamr@2
   321
    tie(ei, ei_end) = edges(g);
williamr@2
   322
    found = std::find(ei, ei_end, e);
williamr@2
   323
    return found != ei_end;
williamr@2
   324
  }
williamr@2
   325
williamr@2
   326
  template <class Graph, class Vertex>
williamr@2
   327
  bool in_vertex_set(Graph& g, Vertex v)
williamr@2
   328
  {
williamr@2
   329
    typename Graph::vertex_iterator vi, vi_end, found;
williamr@2
   330
    tie(vi, vi_end) = vertices(g);
williamr@2
   331
    found = std::find(vi, vi_end, v);
williamr@2
   332
    return found != vi_end;
williamr@2
   333
  }
williamr@2
   334
williamr@2
   335
  template <class Graph, class Vertex>
williamr@2
   336
  bool in_edge_set(Graph& g, Vertex u, Vertex v)
williamr@2
   337
  {
williamr@2
   338
    typename Graph::edge_iterator ei, ei_end;
williamr@2
   339
    for (tie(ei,ei_end) = edges(g); ei != ei_end; ++ei)
williamr@2
   340
      if (source(*ei,g) == u && target(*ei,g) == v)
williamr@2
   341
        return true;
williamr@2
   342
    return false;
williamr@2
   343
  }
williamr@2
   344
williamr@2
   345
  // is x a descendant of y?
williamr@2
   346
  template <typename ParentMap>
williamr@2
   347
  inline bool is_descendant
williamr@2
   348
  (typename property_traits<ParentMap>::value_type x,
williamr@2
   349
   typename property_traits<ParentMap>::value_type y,
williamr@2
   350
   ParentMap parent) 
williamr@2
   351
  {
williamr@2
   352
    if (get(parent, x) == x) // x is the root of the tree
williamr@2
   353
      return false;
williamr@2
   354
    else if (get(parent, x) == y)
williamr@2
   355
      return true;
williamr@2
   356
    else
williamr@2
   357
      return is_descendant(get(parent, x), y, parent);
williamr@2
   358
  }
williamr@2
   359
williamr@2
   360
  // is y reachable from x?
williamr@2
   361
  template <typename IncidenceGraph, typename VertexColorMap>
williamr@2
   362
  inline bool is_reachable
williamr@2
   363
    (typename graph_traits<IncidenceGraph>::vertex_descriptor x,
williamr@2
   364
     typename graph_traits<IncidenceGraph>::vertex_descriptor y,
williamr@2
   365
     const IncidenceGraph& g,
williamr@2
   366
     VertexColorMap color) // should start out white for every vertex
williamr@2
   367
  {
williamr@2
   368
    typedef typename property_traits<VertexColorMap>::value_type ColorValue;
williamr@2
   369
    dfs_visitor<> vis;
williamr@2
   370
    depth_first_visit(g, x, vis, color);
williamr@2
   371
    return get(color, y) != color_traits<ColorValue>::white();
williamr@2
   372
  }
williamr@2
   373
williamr@2
   374
  // Is the undirected graph connected?
williamr@2
   375
  // Is the directed graph strongly connected?
williamr@2
   376
  template <typename VertexListGraph, typename VertexColorMap>
williamr@2
   377
  inline bool is_connected(const VertexListGraph& g, VertexColorMap color)
williamr@2
   378
  {
williamr@2
   379
    typedef typename property_traits<VertexColorMap>::value_type ColorValue;
williamr@2
   380
    typedef color_traits<ColorValue> Color;
williamr@2
   381
    typename graph_traits<VertexListGraph>::vertex_iterator 
williamr@2
   382
      ui, ui_end, vi, vi_end, ci, ci_end;
williamr@2
   383
    for (tie(ui, ui_end) = vertices(g); ui != ui_end; ++ui)
williamr@2
   384
      for (tie(vi, vi_end) = vertices(g); vi != vi_end; ++vi)
williamr@2
   385
        if (*ui != *vi) {
williamr@2
   386
          for (tie(ci, ci_end) = vertices(g); ci != ci_end; ++ci) 
williamr@2
   387
            put(color, *ci, Color::white());
williamr@2
   388
          if (! is_reachable(*ui, *vi, color))
williamr@2
   389
            return false;
williamr@2
   390
        }
williamr@2
   391
    return true;
williamr@2
   392
  }
williamr@2
   393
williamr@2
   394
  template <typename Graph>
williamr@2
   395
  bool is_self_loop
williamr@2
   396
    (typename graph_traits<Graph>::edge_descriptor e,
williamr@2
   397
     const Graph& g)
williamr@2
   398
  {
williamr@2
   399
    return source(e, g) == target(e, g);
williamr@2
   400
  }
williamr@2
   401
williamr@2
   402
williamr@2
   403
  template <class T1, class T2>
williamr@2
   404
  std::pair<T1,T2> 
williamr@2
   405
  make_list(const T1& t1, const T2& t2) 
williamr@2
   406
    { return std::make_pair(t1, t2); }
williamr@2
   407
williamr@2
   408
  template <class T1, class T2, class T3>
williamr@2
   409
  std::pair<T1,std::pair<T2,T3> > 
williamr@2
   410
  make_list(const T1& t1, const T2& t2, const T3& t3)
williamr@2
   411
    { return std::make_pair(t1, std::make_pair(t2, t3)); }
williamr@2
   412
williamr@2
   413
  template <class T1, class T2, class T3, class T4>
williamr@2
   414
  std::pair<T1,std::pair<T2,std::pair<T3,T4> > > 
williamr@2
   415
  make_list(const T1& t1, const T2& t2, const T3& t3, const T4& t4)
williamr@2
   416
    { return std::make_pair(t1, std::make_pair(t2, std::make_pair(t3, t4))); }
williamr@2
   417
williamr@2
   418
  template <class T1, class T2, class T3, class T4, class T5>
williamr@2
   419
  std::pair<T1,std::pair<T2,std::pair<T3,std::pair<T4,T5> > > > 
williamr@2
   420
  make_list(const T1& t1, const T2& t2, const T3& t3, const T4& t4, const T5& t5)
williamr@2
   421
    { return std::make_pair(t1, std::make_pair(t2, std::make_pair(t3, std::make_pair(t4, t5)))); }
williamr@2
   422
williamr@2
   423
} /* namespace boost */
williamr@2
   424
williamr@2
   425
#endif /* BOOST_GRAPH_UTILITY_HPP*/