epoc32/include/stdapis/boost/graph/undirected_dfs.hpp
branchSymbian2
changeset 2 2fe1408b6811
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/epoc32/include/stdapis/boost/graph/undirected_dfs.hpp	Tue Mar 16 16:12:26 2010 +0000
     1.3 @@ -0,0 +1,250 @@
     1.4 +//
     1.5 +//=======================================================================
     1.6 +// Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
     1.7 +// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
     1.8 +//
     1.9 +// Distributed under the Boost Software License, Version 1.0. (See
    1.10 +// accompanying file LICENSE_1_0.txt or copy at
    1.11 +// http://www.boost.org/LICENSE_1_0.txt)
    1.12 +//=======================================================================
    1.13 +//
    1.14 +#ifndef BOOST_GRAPH_UNDIRECTED_DFS_HPP
    1.15 +#define BOOST_GRAPH_UNDIRECTED_DFS_HPP
    1.16 +
    1.17 +#include <boost/graph/depth_first_search.hpp>
    1.18 +#include <vector>
    1.19 +
    1.20 +namespace boost {
    1.21 +
    1.22 +  namespace detail {
    1.23 +
    1.24 +// Define BOOST_RECURSIVE_DFS to use older, recursive version.
    1.25 +// It is retained for a while in order to perform performance
    1.26 +// comparison.
    1.27 +#ifndef BOOST_RECURSIVE_DFS
    1.28 +
    1.29 +    template <typename IncidenceGraph, typename DFSVisitor, 
    1.30 +              typename VertexColorMap, typename EdgeColorMap>
    1.31 +    void undir_dfv_impl
    1.32 +      (const IncidenceGraph& g,
    1.33 +       typename graph_traits<IncidenceGraph>::vertex_descriptor u, 
    1.34 +       DFSVisitor& vis,
    1.35 +       VertexColorMap vertex_color,
    1.36 +       EdgeColorMap edge_color)
    1.37 +    {
    1.38 +      function_requires<IncidenceGraphConcept<IncidenceGraph> >();
    1.39 +      function_requires<DFSVisitorConcept<DFSVisitor, IncidenceGraph> >();
    1.40 +      typedef typename graph_traits<IncidenceGraph>::vertex_descriptor Vertex;
    1.41 +      typedef typename graph_traits<IncidenceGraph>::edge_descriptor Edge;
    1.42 +      function_requires<ReadWritePropertyMapConcept<VertexColorMap,Vertex> >();
    1.43 +      function_requires<ReadWritePropertyMapConcept<EdgeColorMap,Edge> >();
    1.44 +      typedef typename property_traits<VertexColorMap>::value_type ColorValue;
    1.45 +      typedef typename property_traits<EdgeColorMap>::value_type EColorValue;
    1.46 +      function_requires< ColorValueConcept<ColorValue> >();
    1.47 +      function_requires< ColorValueConcept<EColorValue> >();
    1.48 +      typedef color_traits<ColorValue> Color;
    1.49 +      typedef color_traits<EColorValue> EColor;
    1.50 +      typedef typename graph_traits<IncidenceGraph>::out_edge_iterator Iter;
    1.51 +      typedef std::pair<Vertex, std::pair<Iter, Iter> > VertexInfo;
    1.52 +
    1.53 +      std::vector<VertexInfo> stack;
    1.54 +
    1.55 +      put(vertex_color, u, Color::gray());
    1.56 +      vis.discover_vertex(u, g);
    1.57 +      stack.push_back(std::make_pair(u, out_edges(u, g)));
    1.58 +      while (!stack.empty()) {
    1.59 +        VertexInfo& back = stack.back();
    1.60 +        u = back.first;
    1.61 +        Iter ei, ei_end;
    1.62 +        tie(ei, ei_end) = back.second;
    1.63 +        stack.pop_back();
    1.64 +        while (ei != ei_end) {
    1.65 +          Vertex v = target(*ei, g);
    1.66 +          vis.examine_edge(*ei, g);
    1.67 +          ColorValue v_color = get(vertex_color, v);
    1.68 +          EColorValue uv_color = get(edge_color, *ei);
    1.69 +          put(edge_color, *ei, EColor::black());
    1.70 +          if (v_color == Color::white()) {
    1.71 +            vis.tree_edge(*ei, g);
    1.72 +            stack.push_back(std::make_pair(u, std::make_pair(++ei, ei_end)));
    1.73 +            u = v;
    1.74 +            put(vertex_color, u, Color::gray());
    1.75 +            vis.discover_vertex(u, g);
    1.76 +            tie(ei, ei_end) = out_edges(u, g);
    1.77 +          } else if (v_color == Color::gray()) {
    1.78 +            if (uv_color == EColor::white()) vis.back_edge(*ei, g);
    1.79 +            ++ei;
    1.80 +          } else { // if (v_color == Color::black())
    1.81 +            ++ei;
    1.82 +          }
    1.83 +        }
    1.84 +        put(vertex_color, u, Color::black());
    1.85 +        vis.finish_vertex(u, g);
    1.86 +      }
    1.87 +    }
    1.88 +
    1.89 +#else // BOOST_RECURSIVE_DFS
    1.90 +
    1.91 +    template <typename IncidenceGraph, typename DFSVisitor, 
    1.92 +              typename VertexColorMap, typename EdgeColorMap>
    1.93 +    void undir_dfv_impl
    1.94 +      (const IncidenceGraph& g,
    1.95 +       typename graph_traits<IncidenceGraph>::vertex_descriptor u, 
    1.96 +       DFSVisitor& vis,  // pass-by-reference here, important!
    1.97 +       VertexColorMap vertex_color,
    1.98 +       EdgeColorMap edge_color)
    1.99 +    {
   1.100 +      function_requires<IncidenceGraphConcept<IncidenceGraph> >();
   1.101 +      function_requires<DFSVisitorConcept<DFSVisitor, IncidenceGraph> >();
   1.102 +      typedef typename graph_traits<IncidenceGraph>::vertex_descriptor Vertex;
   1.103 +      typedef typename graph_traits<IncidenceGraph>::edge_descriptor Edge;
   1.104 +      function_requires<ReadWritePropertyMapConcept<VertexColorMap,Vertex> >();
   1.105 +      function_requires<ReadWritePropertyMapConcept<EdgeColorMap,Edge> >();
   1.106 +      typedef typename property_traits<VertexColorMap>::value_type ColorValue;
   1.107 +      typedef typename property_traits<EdgeColorMap>::value_type EColorValue;
   1.108 +      function_requires< ColorValueConcept<ColorValue> >();
   1.109 +      function_requires< ColorValueConcept<EColorValue> >();
   1.110 +      typedef color_traits<ColorValue> Color;
   1.111 +      typedef color_traits<EColorValue> EColor;
   1.112 +      typename graph_traits<IncidenceGraph>::out_edge_iterator ei, ei_end;
   1.113 +
   1.114 +      put(vertex_color, u, Color::gray());   vis.discover_vertex(u, g);
   1.115 +      for (tie(ei, ei_end) = out_edges(u, g); ei != ei_end; ++ei) {
   1.116 +        Vertex v = target(*ei, g);           vis.examine_edge(*ei, g);
   1.117 +        ColorValue v_color = get(vertex_color, v);
   1.118 +        EColorValue uv_color = get(edge_color, *ei);
   1.119 +        put(edge_color, *ei, EColor::black());
   1.120 +        if (v_color == Color::white()) {     vis.tree_edge(*ei, g);
   1.121 +          undir_dfv_impl(g, v, vis, vertex_color, edge_color);
   1.122 +        } else if (v_color == Color::gray() && uv_color == EColor::white())
   1.123 +                                             vis.back_edge(*ei, g);
   1.124 +      }
   1.125 +      put(vertex_color, u, Color::black());  vis.finish_vertex(u, g);
   1.126 +    }
   1.127 +
   1.128 +#endif // ! BOOST_RECURSIVE_DFS
   1.129 +
   1.130 +  } // namespace detail
   1.131 +
   1.132 +  template <typename Graph, typename DFSVisitor, 
   1.133 +            typename VertexColorMap, typename EdgeColorMap, 
   1.134 +            typename Vertex>
   1.135 +  void
   1.136 +  undirected_dfs(const Graph& g, DFSVisitor vis, 
   1.137 +                 VertexColorMap vertex_color, EdgeColorMap edge_color,
   1.138 +                 Vertex start_vertex)
   1.139 +  {
   1.140 +    function_requires<DFSVisitorConcept<DFSVisitor, Graph> >();
   1.141 +      function_requires<EdgeListGraphConcept<Graph> >();
   1.142 +
   1.143 +    typedef typename property_traits<VertexColorMap>::value_type ColorValue;
   1.144 +    typedef color_traits<ColorValue> Color;
   1.145 +
   1.146 +    typename graph_traits<Graph>::vertex_iterator ui, ui_end;
   1.147 +    for (tie(ui, ui_end) = vertices(g); ui != ui_end; ++ui) {
   1.148 +      put(vertex_color, *ui, Color::white());   vis.initialize_vertex(*ui, g);
   1.149 +    }
   1.150 +    typename graph_traits<Graph>::edge_iterator ei, ei_end;
   1.151 +    for (tie(ei, ei_end) = edges(g); ei != ei_end; ++ei)
   1.152 +      put(edge_color, *ei, Color::white());
   1.153 +
   1.154 +    if (start_vertex != *vertices(g).first){ vis.start_vertex(start_vertex, g);
   1.155 +      detail::undir_dfv_impl(g, start_vertex, vis, vertex_color, edge_color);
   1.156 +    }
   1.157 +
   1.158 +    for (tie(ui, ui_end) = vertices(g); ui != ui_end; ++ui) {
   1.159 +      ColorValue u_color = get(vertex_color, *ui);
   1.160 +      if (u_color == Color::white()) {       vis.start_vertex(*ui, g);
   1.161 +        detail::undir_dfv_impl(g, *ui, vis, vertex_color, edge_color);
   1.162 +      }
   1.163 +    }
   1.164 +  }
   1.165 +
   1.166 +  template <typename Graph, typename DFSVisitor, typename VertexColorMap,
   1.167 +    typename EdgeColorMap>
   1.168 +  void
   1.169 +  undirected_dfs(const Graph& g, DFSVisitor vis, 
   1.170 +                 VertexColorMap vertex_color, EdgeColorMap edge_color)
   1.171 +  {
   1.172 +    undirected_dfs(g, vis, vertex_color, edge_color, *vertices(g).first);
   1.173 +  }
   1.174 +
   1.175 +  namespace detail {
   1.176 +    template <typename VertexColorMap>
   1.177 +    struct udfs_dispatch {
   1.178 +
   1.179 +      template <typename Graph, typename Vertex, 
   1.180 +                typename DFSVisitor, typename EdgeColorMap,
   1.181 +                typename P, typename T, typename R>
   1.182 +      static void
   1.183 +      apply(const Graph& g, DFSVisitor vis, Vertex start_vertex,
   1.184 +            const bgl_named_params<P, T, R>&,
   1.185 +            EdgeColorMap edge_color,
   1.186 +            VertexColorMap vertex_color)
   1.187 +      {
   1.188 +        undirected_dfs(g, vis, vertex_color, edge_color, start_vertex);
   1.189 +      }
   1.190 +    };
   1.191 +
   1.192 +    template <>
   1.193 +    struct udfs_dispatch<detail::error_property_not_found> {
   1.194 +      template <typename Graph, typename Vertex, typename DFSVisitor,
   1.195 +                typename EdgeColorMap,
   1.196 +                typename P, typename T, typename R>
   1.197 +      static void
   1.198 +      apply(const Graph& g, DFSVisitor vis, Vertex start_vertex,
   1.199 +            const bgl_named_params<P, T, R>& params,
   1.200 +            EdgeColorMap edge_color,
   1.201 +            detail::error_property_not_found)
   1.202 +      {
   1.203 +        std::vector<default_color_type> color_vec(num_vertices(g));
   1.204 +        default_color_type c = white_color; // avoid warning about un-init
   1.205 +        undirected_dfs
   1.206 +          (g, vis, make_iterator_property_map
   1.207 +           (color_vec.begin(),
   1.208 +            choose_const_pmap(get_param(params, vertex_index),
   1.209 +                              g, vertex_index), c),
   1.210 +           edge_color,
   1.211 +           start_vertex);
   1.212 +      }
   1.213 +    };
   1.214 +
   1.215 +  } // namespace detail
   1.216 +  
   1.217 +
   1.218 +  // Named Parameter Variant
   1.219 +  template <typename Graph, typename P, typename T, typename R>
   1.220 +  void
   1.221 +  undirected_dfs(const Graph& g, 
   1.222 +                 const bgl_named_params<P, T, R>& params)
   1.223 +  {
   1.224 +    typedef typename property_value< bgl_named_params<P, T, R>, 
   1.225 +      vertex_color_t>::type C;
   1.226 +    detail::udfs_dispatch<C>::apply
   1.227 +      (g,
   1.228 +       choose_param(get_param(params, graph_visitor),
   1.229 +                    make_dfs_visitor(null_visitor())),
   1.230 +       choose_param(get_param(params, root_vertex_t()),
   1.231 +                    *vertices(g).first),
   1.232 +       params,
   1.233 +       get_param(params, edge_color),
   1.234 +       get_param(params, vertex_color)
   1.235 +       );
   1.236 +  }
   1.237 +  
   1.238 +
   1.239 +  template <typename IncidenceGraph, typename DFSVisitor, 
   1.240 +    typename VertexColorMap, typename EdgeColorMap>
   1.241 +  void undirected_depth_first_visit
   1.242 +    (const IncidenceGraph& g,
   1.243 +     typename graph_traits<IncidenceGraph>::vertex_descriptor u, 
   1.244 +     DFSVisitor vis, VertexColorMap vertex_color, EdgeColorMap edge_color)
   1.245 +  {
   1.246 +    detail::undir_dfv_impl(g, u, vis, vertex_color, edge_color);
   1.247 +  }
   1.248 +
   1.249 +
   1.250 +} // namespace boost
   1.251 +
   1.252 +
   1.253 +#endif