1 //=======================================================================
2 // Copyright 2001 Jeremy G. Siek, Andrew Lumsdaine, Lie-Quan Lee,
4 // Distributed under the Boost Software License, Version 1.0. (See
5 // accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt)
7 //=======================================================================
8 #include <boost/config.hpp>
12 #include <boost/graph/adjacency_list.hpp>
14 using namespace boost
;
16 template < typename Graph
, typename VertexNamePropertyMap
> void
17 read_graph_file(std::istream
& graph_in
, std::istream
& name_in
,
18 Graph
& g
, VertexNamePropertyMap name_map
)
20 typedef typename graph_traits
< Graph
>::vertices_size_type size_type
;
22 typename graph_traits
< Graph
>::vertex_descriptor u
;
23 typename property_traits
< VertexNamePropertyMap
>::value_type name
;
25 graph_in
>> n_vertices
; // read in number of vertices
26 for (size_type i
= 0; i
< n_vertices
; ++i
) { // Add n vertices to the graph
29 put(name_map
, u
, name
); // ** Attach name property to vertex u **
32 while (graph_in
>> src
) // Read in edges
34 add_edge(src
, targ
, g
); // add an edge to the graph
39 template < typename Graph
, typename VertexNameMap
> void
40 output_adjacent_vertices(std::ostream
& out
,
41 typename graph_traits
< Graph
>::vertex_descriptor u
,
42 const Graph
& g
, VertexNameMap name_map
)
44 typename graph_traits
< Graph
>::adjacency_iterator vi
, vi_end
;
45 out
<< get(name_map
, u
) << " -> { ";
46 for (boost::tie(vi
, vi_end
) = adjacent_vertices(u
, g
); vi
!= vi_end
; ++vi
)
47 out
<< get(name_map
, *vi
) << " ";
48 out
<< "}" << std::endl
;
51 template < typename NameMap
> class name_equals_t
{
53 name_equals_t(const std::string
& n
, NameMap map
)
54 : m_name(n
), m_name_map(map
)
57 template < typename Vertex
> bool operator()(Vertex u
) const
59 return get(m_name_map
, u
) == m_name
;
66 // object generator function
67 template < typename NameMap
>
68 inline name_equals_t
< NameMap
>
69 name_equals(const std::string
& str
, NameMap name
)
71 return name_equals_t
< NameMap
> (str
, name
);
78 typedef adjacency_list
< listS
, // Store out-edges of each vertex in a std::list
79 vecS
, // Store vertex set in a std::vector
80 directedS
, // The graph is directed
81 property
< vertex_name_t
, std::string
> // Add a vertex property
84 graph_type g
; // use default constructor to create empty graph
85 const char* dep_file_name
= "makefile-dependencies.dat";
86 const char* target_file_name
= "makefile-target-names.dat";
87 std::ifstream
file_in(dep_file_name
), name_in(target_file_name
);
89 std::cerr
<< "** Error: could not open file " << dep_file_name
94 std::cerr
<< "** Error: could not open file " << target_file_name
98 // Obtain internal property map from the graph
99 property_map
< graph_type
, vertex_name_t
>::type name_map
=
101 read_graph_file(file_in
, name_in
, g
, name_map
);
103 graph_traits
< graph_type
>::vertex_iterator i
, end
;
104 boost::tie(i
, end
) = vertices(g
);
105 i
= std::find_if(i
, end
, name_equals("dax.h", get(vertex_name
, g
)));
106 output_adjacent_vertices(std::cout
, *i
, g
, get(vertex_name
, g
));
108 assert(num_vertices(g
) == 15);
109 assert(num_edges(g
) == 19);