ns-3 PLC model
|
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