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_out_edges(std::ostream
& out
, const Graph
& g
,
41 typename graph_traits
< Graph
>::vertex_descriptor u
,
42 VertexNameMap name_map
)
44 typename graph_traits
< Graph
>::out_edge_iterator ei
, ei_end
;
45 for (boost::tie(ei
, ei_end
) = out_edges(u
, g
); ei
!= ei_end
; ++ei
)
46 out
<< get(name_map
, source(*ei
, g
)) << " -> "
47 << get(name_map
, target(*ei
, g
)) << std::endl
;
50 template < typename NameMap
> class name_equals_t
{
52 name_equals_t(const std::string
& n
, NameMap map
)
53 : m_name(n
), m_name_map(map
)
56 template < typename Vertex
> bool operator()(Vertex u
) const
58 return get(m_name_map
, u
) == m_name
;
65 // object generator function
66 template < typename NameMap
>
67 inline name_equals_t
< NameMap
>
68 name_equals(const std::string
& str
, NameMap name
)
70 return name_equals_t
< NameMap
> (str
, name
);
75 main(int argc
, const char** argv
)
77 typedef adjacency_list
< listS
, // Store out-edges of each vertex in a std::list
78 vecS
, // Store vertex set in a std::vector
79 directedS
, // The graph is directed
80 property
< vertex_name_t
, std::string
> // Add a vertex property
83 graph_type g
; // use default constructor to create empty graph
84 const char* dep_file_name
= argc
>= 2 ? argv
[1] : "makefile-dependencies.dat";
85 const char* target_file_name
= argc
>= 3 ? argv
[2] : "makefile-target-names.dat";
86 std::ifstream
file_in(dep_file_name
), name_in(target_file_name
);
88 std::cerr
<< "** Error: could not open file " << dep_file_name
93 std::cerr
<< "** Error: could not open file " << target_file_name
97 // Obtain internal property map from the graph
98 property_map
< graph_type
, vertex_name_t
>::type name_map
=
100 read_graph_file(file_in
, name_in
, g
, name_map
);
102 graph_traits
< graph_type
>::vertex_iterator i
, end
;
103 boost::tie(i
, end
) = vertices(g
);
104 typedef property_map
< graph_type
, vertex_name_t
>::type name_map_t
;
105 name_equals_t
< name_map_t
> predicate("dax.h", get(vertex_name
, g
));
106 i
= std::find_if(i
, end
, predicate
);
107 output_out_edges(std::cout
, g
, *i
, get(vertex_name
, g
));
109 assert(num_vertices(g
) == 15);
110 assert(num_edges(g
) == 19);