ns-3 PLC model
model/plc-undirected-dfs.h
00001 //
00002 //=======================================================================
00003 // Copyright 1997, 1998, 1999, 2000 University of Notre Dame.
00004 // Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
00005 //
00006 // Distributed under the Boost Software License, Version 1.0. (See
00007 // accompanying file LICENSE_1_0.txt or copy at
00008 // http://www.boost.org/LICENSE_1_0.txt)
00009 //=======================================================================
00010 //
00011 #ifndef PLC_BOOST_GRAPH_UNDIRECTED_DFS_HPP
00012 #define PLC_BOOST_GRAPH_UNDIRECTED_DFS_HPP
00013 
00014 #include <boost/graph/depth_first_search.hpp>
00015 #include <vector>
00016 
00017 #include "ns3/plc-graph.h"
00018 
00019 namespace boost {
00020 
00021   namespace detail {
00022 
00023 // Define BOOST_RECURSIVE_DFS to use older, recursive version.
00024 // It is retained for a while in order to perform performance
00025 // comparison.
00026     template <typename IncidenceGraph, typename DFSVisitor, 
00027               typename VertexColorMap, typename EdgeColorMap>
00028     void plc_undir_dfv_impl
00029       (
00030        const IncidenceGraph& g,
00031        typename graph_traits<IncidenceGraph>::vertex_descriptor u, 
00032        DFSVisitor& vis,
00033        VertexColorMap vertex_color,
00034        EdgeColorMap edge_color,
00035        ns3::PLC_Mutex *graph_copy_mutex
00036       )
00037     {
00038       function_requires<IncidenceGraphConcept<IncidenceGraph> >();
00039       function_requires<DFSVisitorConcept<DFSVisitor, IncidenceGraph> >();
00040       typedef typename graph_traits<IncidenceGraph>::vertex_descriptor Vertex;
00041       typedef typename graph_traits<IncidenceGraph>::edge_descriptor Edge;
00042       function_requires<ReadWritePropertyMapConcept<VertexColorMap,Vertex> >();
00043       function_requires<ReadWritePropertyMapConcept<EdgeColorMap,Edge> >();
00044       typedef typename property_traits<VertexColorMap>::value_type ColorValue;
00045       typedef typename property_traits<EdgeColorMap>::value_type EColorValue;
00046       function_requires< ColorValueConcept<ColorValue> >();
00047       function_requires< ColorValueConcept<EColorValue> >();
00048       typedef color_traits<ColorValue> Color;
00049       typedef color_traits<EColorValue> EColor;
00050       typedef typename graph_traits<IncidenceGraph>::out_edge_iterator Iter;
00051       typedef std::pair<Vertex, std::pair<Iter, Iter> > VertexInfo;
00052 
00053       std::vector<VertexInfo> stack;
00054 
00055       graph_copy_mutex->Lock();
00056       put(vertex_color, u, Color::gray());
00057       graph_copy_mutex->Unlock();
00058 
00059       vis.discover_vertex(u, g);
00060       stack.push_back(std::make_pair(u, out_edges(u, g)));
00061       while (!stack.empty()) {
00062         VertexInfo& back = stack.back();
00063         u = back.first;
00064         Iter ei, ei_end;
00065         boost::tie(ei, ei_end) = back.second;
00066         stack.pop_back();
00067         while (ei != ei_end) {
00068           Vertex v = target(*ei, g);
00069           vis.examine_edge(*ei, g);
00070 
00071           graph_copy_mutex->Lock();
00072           ColorValue v_color = get(vertex_color, v);
00073           EColorValue uv_color = get(edge_color, *ei);
00074           put(edge_color, *ei, EColor::black());
00075           graph_copy_mutex->Unlock();
00076 
00077           if (v_color == Color::white()) {
00078             vis.tree_edge(*ei, g);
00079             stack.push_back(std::make_pair(u, std::make_pair(++ei, ei_end)));
00080             u = v;
00081 
00082             graph_copy_mutex->Lock();
00083             put(vertex_color, u, Color::gray());
00084             graph_copy_mutex->Unlock();
00085 
00086             vis.discover_vertex(u, g);
00087             boost::tie(ei, ei_end) = out_edges(u, g);
00088           } else if (v_color == Color::gray()) {
00089             if (uv_color == EColor::white()) vis.back_edge(*ei, g);
00090             ++ei;
00091           } else { // if (v_color == Color::black())
00092             ++ei;
00093           }
00094         }
00095 
00096         graph_copy_mutex->Lock();
00097         put(vertex_color, u, Color::black());
00098         graph_copy_mutex->Unlock();
00099 
00100         vis.finish_vertex(u, g);
00101       }
00102     }
00103 
00104   } // namespace detail
00105 
00106 } // namespace boost
00107 
00108 #endif
 All Classes Functions Variables Enumerations