*** depth_first_search.hpp.orig	Thu Aug 28 11:34:20 2003
--- depth_first_search.hpp	Sun Aug 31 23:14:58 2003
***************
*** 50,55 ****
--- 50,56 ----
  
  #include <vector>
  #include <utility>
+ #include <stack>
  
  namespace boost {
  
***************
*** 74,81 ****
--- 75,97 ----
      typename graph_traits<Graph>::edge_descriptor e;
    };
  
+   template <class Graph>
+   class dfs_buffer_traits {
+     typedef typename graph_traits<Graph>::vertex_descriptor Vertex;
+     typedef typename graph_traits<Graph>::out_edge_iterator Iter;
+   public:
+     typedef std::pair<Vertex, std::pair<Iter, Iter> > value_type;
+   };
+ 
    namespace detail {
  
+     template <class Graph>
+     class default_dfs_buffer {
+       typedef typename dfs_buffer_traits<Graph>::value_type BufferValueType;
+     public:
+       typedef std::stack<BufferValueType, std::vector<BufferValueType> > type;
+     };
+ 
      struct nontruth2 {
        template<class T, class T2>
        bool operator()(const T&, const T2&) const { return false; }
***************
*** 99,110 ****
      // See http://lists.boost.org/MailArchives/boost/msg48752.php for FAQ.
  
      template <class IncidenceGraph, class DFSVisitor, class ColorMap,
!             class TerminatorFunc>
      void depth_first_visit_impl
        (const IncidenceGraph& g,
         typename graph_traits<IncidenceGraph>::vertex_descriptor u,
!        DFSVisitor& vis,
!        ColorMap color, TerminatorFunc func = TerminatorFunc())
      {
        function_requires<IncidenceGraphConcept<IncidenceGraph> >();
        function_requires<DFSVisitorConcept<DFSVisitor, IncidenceGraph> >();
--- 115,126 ----
      // See http://lists.boost.org/MailArchives/boost/msg48752.php for FAQ.
  
      template <class IncidenceGraph, class DFSVisitor, class ColorMap,
!               class Buffer, class TerminatorFunc>
      void depth_first_visit_impl
        (const IncidenceGraph& g,
         typename graph_traits<IncidenceGraph>::vertex_descriptor u,
!        DFSVisitor& vis, ColorMap color, Buffer& S,
!        TerminatorFunc func = TerminatorFunc())
      {
        function_requires<IncidenceGraphConcept<IncidenceGraph> >();
        function_requires<DFSVisitorConcept<DFSVisitor, IncidenceGraph> >();
***************
*** 114,126 ****
        function_requires< ColorValueConcept<ColorValue> >();
        typedef color_traits<ColorValue> Color;
        typedef typename graph_traits<IncidenceGraph>::out_edge_iterator Iter;
!       typedef std::pair<Vertex, std::pair<Iter, Iter> > VertexInfo;
  
        Iter ei, ei_end;
-       std::vector<VertexInfo> stack;
- 
-       // Possible optimization for vector
-       //stack.reserve(num_vertices(g));
  
        typedef typename unwrap_reference<TerminatorFunc>::type TF;
  
--- 130,138 ----
        function_requires< ColorValueConcept<ColorValue> >();
        typedef color_traits<ColorValue> Color;
        typedef typename graph_traits<IncidenceGraph>::out_edge_iterator Iter;
!       typedef typename Buffer::value_type VertexInfo;
  
        Iter ei, ei_end;
  
        typedef typename unwrap_reference<TerminatorFunc>::type TF;
  
***************
*** 128,150 ****
        vis.discover_vertex(u, g);
        tie(ei, ei_end) = out_edges(u, g);
        if (static_cast<TF&>(func)(u, g)) {
!           // If this vertex terminates the search, we push empty range
!           stack.push_back(std::make_pair(u, std::make_pair(ei_end, ei_end)));
        } else {
!           stack.push_back(std::make_pair(u, std::make_pair(ei, ei_end)));
        }
!       while (!stack.empty()) {
!         VertexInfo& back = stack.back();
          u = back.first;
          tie(ei, ei_end) = back.second;
!         stack.pop_back();
          while (ei != ei_end) {
            Vertex v = target(*ei, g);
            vis.examine_edge(*ei, g);
            ColorValue v_color = get(color, v);
            if (v_color == Color::white()) {
              vis.tree_edge(*ei, g);
!             stack.push_back(std::make_pair(u, std::make_pair(++ei, ei_end)));
              u = v;
              put(color, u, Color::gray());
              vis.discover_vertex(u, g);
--- 140,162 ----
        vis.discover_vertex(u, g);
        tie(ei, ei_end) = out_edges(u, g);
        if (static_cast<TF&>(func)(u, g)) {
!         // If this vertex terminates the search, we push empty range
!         S.push(std::make_pair(u, std::make_pair(ei_end, ei_end)));
        } else {
!         S.push(std::make_pair(u, std::make_pair(ei, ei_end)));
        }
!       while (!S.empty()) {
!         VertexInfo& back = S.top();
          u = back.first;
          tie(ei, ei_end) = back.second;
!         S.pop();
          while (ei != ei_end) {
            Vertex v = target(*ei, g);
            vis.examine_edge(*ei, g);
            ColorValue v_color = get(color, v);
            if (v_color == Color::white()) {
              vis.tree_edge(*ei, g);
!             S.push(std::make_pair(u, std::make_pair(++ei, ei_end)));
              u = v;
              put(color, u, Color::gray());
              vis.discover_vertex(u, g);
***************
*** 168,179 ****
  #else // BOOST_RECURSIVE_DFS is defined
  
      template <class IncidenceGraph, class DFSVisitor, class ColorMap,
!               class TerminatorFunc>
      void depth_first_visit_impl
        (const IncidenceGraph& g,
         typename graph_traits<IncidenceGraph>::vertex_descriptor u,
         DFSVisitor& vis,  // pass-by-reference here, important!
!        ColorMap color, TerminatorFunc func)
      {
        function_requires<IncidenceGraphConcept<IncidenceGraph> >();
        function_requires<DFSVisitorConcept<DFSVisitor, IncidenceGraph> >();
--- 180,191 ----
  #else // BOOST_RECURSIVE_DFS is defined
  
      template <class IncidenceGraph, class DFSVisitor, class ColorMap,
!               class Buffer, class TerminatorFunc>
      void depth_first_visit_impl
        (const IncidenceGraph& g,
         typename graph_traits<IncidenceGraph>::vertex_descriptor u,
         DFSVisitor& vis,  // pass-by-reference here, important!
!        ColorMap color, Buffer& S, TerminatorFunc func)
      {
        function_requires<IncidenceGraphConcept<IncidenceGraph> >();
        function_requires<DFSVisitorConcept<DFSVisitor, IncidenceGraph> >();
***************
*** 192,198 ****
            Vertex v = target(*ei, g);           vis.examine_edge(*ei, g);
            ColorValue v_color = get(color, v);
            if (v_color == Color::white()) {     vis.tree_edge(*ei, g);
!           depth_first_visit_impl(g, v, vis, color, func);
            } else if (v_color == Color::gray()) vis.back_edge(*ei, g);
            else                                 vis.forward_or_cross_edge(*ei, g);
          }
--- 204,210 ----
            Vertex v = target(*ei, g);           vis.examine_edge(*ei, g);
            ColorValue v_color = get(color, v);
            if (v_color == Color::white()) {     vis.tree_edge(*ei, g);
!           depth_first_visit_impl(g, v, vis, color, S, func);
            } else if (v_color == Color::gray()) vis.back_edge(*ei, g);
            else                                 vis.forward_or_cross_edge(*ei, g);
          }
***************
*** 204,213 ****
    } // namespace detail
  
    template <class VertexListGraph, class DFSVisitor, class ColorMap,
!             class Vertex>
    void
    depth_first_search(const VertexListGraph& g, DFSVisitor vis, ColorMap color,
!                      Vertex start_vertex)
    {
      function_requires<DFSVisitorConcept<DFSVisitor, VertexListGraph> >();
      typedef typename property_traits<ColorMap>::value_type ColorValue;
--- 216,225 ----
    } // namespace detail
  
    template <class VertexListGraph, class DFSVisitor, class ColorMap,
!             class Vertex, class Buffer>
    void
    depth_first_search(const VertexListGraph& g, DFSVisitor vis, ColorMap color,
!                      Vertex start_vertex, Buffer& S)
    {
      function_requires<DFSVisitorConcept<DFSVisitor, VertexListGraph> >();
      typedef typename property_traits<ColorMap>::value_type ColorValue;
***************
*** 219,236 ****
      }
  
      if (start_vertex != *vertices(g).first){ vis.start_vertex(start_vertex, g);
!       detail::depth_first_visit_impl(g, start_vertex, vis, color,
                                       detail::nontruth2());
      }
  
      for (tie(ui, ui_end) = vertices(g); ui != ui_end; ++ui) {
        ColorValue u_color = get(color, *ui);
        if (u_color == Color::white()) {       vis.start_vertex(*ui, g);
!         detail::depth_first_visit_impl(g, *ui, vis, color, detail::nontruth2());
        }
      }
    }
  
    template <class VertexListGraph, class DFSVisitor, class ColorMap>
    void
    depth_first_search(const VertexListGraph& g, DFSVisitor vis, ColorMap color)
--- 231,259 ----
      }
  
      if (start_vertex != *vertices(g).first){ vis.start_vertex(start_vertex, g);
!       detail::depth_first_visit_impl(g, start_vertex, vis, color, S,
                                       detail::nontruth2());
      }
  
      for (tie(ui, ui_end) = vertices(g); ui != ui_end; ++ui) {
        ColorValue u_color = get(color, *ui);
        if (u_color == Color::white()) {       vis.start_vertex(*ui, g);
!         detail::depth_first_visit_impl(g, *ui, vis, color, S,
!                                        detail::nontruth2());
        }
      }
    }
  
+   template <class VertexListGraph, class DFSVisitor, class ColorMap,
+             class Vertex>
+   void
+   depth_first_search(const VertexListGraph& g, DFSVisitor vis, ColorMap color,
+                      Vertex start_vertex)
+   {
+     typename detail::default_dfs_buffer<VertexListGraph>::type S;
+     depth_first_search(g, vis, color, start_vertex, S);
+   }
+ 
    template <class VertexListGraph, class DFSVisitor, class ColorMap>
    void
    depth_first_search(const VertexListGraph& g, DFSVisitor vis, ColorMap color)
***************
*** 243,252 ****
      struct dfs_dispatch {
  
        template <class VertexListGraph, class Vertex, class DFSVisitor,
!                 class P, class T, class R>
        static void
        apply(const VertexListGraph& g, DFSVisitor vis, Vertex start_vertex,
!             const bgl_named_params<P, T, R>&,
              ColorMap color)
        {
          depth_first_search(g, vis, color, start_vertex);
--- 266,275 ----
      struct dfs_dispatch {
  
        template <class VertexListGraph, class Vertex, class DFSVisitor,
!                 class Buffer, class P, class T, class R>
        static void
        apply(const VertexListGraph& g, DFSVisitor vis, Vertex start_vertex,
!             Buffer& S, const bgl_named_params<P, T, R>&,
              ColorMap color)
        {
          depth_first_search(g, vis, color, start_vertex);
***************
*** 256,265 ****
      template <>
      struct dfs_dispatch<detail::error_property_not_found> {
        template <class VertexListGraph, class Vertex, class DFSVisitor,
!                 class P, class T, class R>
        static void
        apply(const VertexListGraph& g, DFSVisitor vis, Vertex start_vertex,
!             const bgl_named_params<P, T, R>& params,
              detail::error_property_not_found)
        {
          std::vector<default_color_type> color_vec(num_vertices(g));
--- 279,288 ----
      template <>
      struct dfs_dispatch<detail::error_property_not_found> {
        template <class VertexListGraph, class Vertex, class DFSVisitor,
!                 class Buffer, class P, class T, class R>
        static void
        apply(const VertexListGraph& g, DFSVisitor vis, Vertex start_vertex,
!             Buffer& S, const bgl_named_params<P, T, R>& params,
              detail::error_property_not_found)
        {
          std::vector<default_color_type> color_vec(num_vertices(g));
***************
*** 269,275 ****
             (color_vec.begin(),
              choose_const_pmap(get_param(params, vertex_index),
                                g, vertex_index), c),
!            start_vertex);
        }
      };
    } // namespace detail
--- 292,298 ----
             (color_vec.begin(),
              choose_const_pmap(get_param(params, vertex_index),
                                g, vertex_index), c),
!            start_vertex, S);
        }
      };
    } // namespace detail
***************
*** 342,353 ****
--- 365,384 ----
    {
      typedef typename property_value< bgl_named_params<P, T, R>,
        vertex_color_t>::type C;
+ 
+     typedef typename detail::default_dfs_buffer<VertexListGraph>::type
+       stack_t;
+     stack_t S;
+     detail::wrap_ref<stack_t> Sref(S);
+ 
      detail::dfs_dispatch<C>::apply
        (g,
         choose_param(get_param(params, graph_visitor),
                      make_dfs_visitor(null_visitor())),
         choose_param(get_param(params, root_vertex_t()),
                      *vertices(g).first),
+        choose_param(get_param(params, buffer_param_t()),
+                     Sref).ref,
         params,
         get_param(params, vertex_color)
         );
***************
*** 359,366 ****
       typename graph_traits<IncidenceGraph>::vertex_descriptor u,
       DFSVisitor vis, ColorMap color)
    {
      vis.start_vertex(u, g);
!     detail::depth_first_visit_impl(g, u, vis, color, detail::nontruth2());
    }
  
    template <class IncidenceGraph, class DFSVisitor, class ColorMap,
--- 390,398 ----
       typename graph_traits<IncidenceGraph>::vertex_descriptor u,
       DFSVisitor vis, ColorMap color)
    {
+     typename detail::default_dfs_buffer<IncidenceGraph>::type S;
      vis.start_vertex(u, g);
!     detail::depth_first_visit_impl(g, u, vis, color, S, detail::nontruth2());
    }
  
    template <class IncidenceGraph, class DFSVisitor, class ColorMap,
***************
*** 370,377 ****
       typename graph_traits<IncidenceGraph>::vertex_descriptor u,
       DFSVisitor vis, ColorMap color, TerminatorFunc func = TerminatorFunc())
    {
      vis.start_vertex(u, g);
!     detail::depth_first_visit_impl(g, u, vis, color, func);
    }
  
  
--- 402,410 ----
       typename graph_traits<IncidenceGraph>::vertex_descriptor u,
       DFSVisitor vis, ColorMap color, TerminatorFunc func = TerminatorFunc())
    {
+     typename detail::default_dfs_buffer<IncidenceGraph>::type S;
      vis.start_vertex(u, g);
!     detail::depth_first_visit_impl(g, u, vis, color, S, func);
    }
  
  
