]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | //======================================================================= |
2 | // Copyright 2001 Jeremy G. Siek, Andrew Lumsdaine, Lie-Quan Lee, | |
3 | // | |
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> | |
9 | #include <iostream> | |
10 | #include <fstream> | |
11 | #include <string> | |
12 | #include <boost/graph/adjacency_list.hpp> | |
13 | ||
14 | using namespace boost; | |
15 | ||
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) | |
19 | { | |
20 | typedef typename graph_traits < Graph >::vertices_size_type size_type; | |
21 | size_type n_vertices; | |
22 | typename graph_traits < Graph >::vertex_descriptor u; | |
23 | typename property_traits < VertexNamePropertyMap >::value_type name; | |
24 | ||
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 | |
27 | u = add_vertex(g); | |
28 | name_in >> name; | |
29 | put(name_map, u, name); // ** Attach name property to vertex u ** | |
30 | } | |
31 | size_type src, targ; | |
32 | while (graph_in >> src) // Read in edges | |
33 | if (graph_in >> targ) | |
34 | add_edge(src, targ, g); // add an edge to the graph | |
35 | else | |
36 | break; | |
37 | } | |
38 | ||
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) | |
43 | { | |
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; | |
48 | } | |
49 | ||
50 | template < typename NameMap > class name_equals_t { | |
51 | public: | |
52 | name_equals_t(const std::string & n, NameMap map) | |
53 | : m_name(n), m_name_map(map) | |
54 | { | |
55 | } | |
56 | template < typename Vertex > bool operator()(Vertex u) const | |
57 | { | |
58 | return get(m_name_map, u) == m_name; | |
59 | } | |
60 | private: | |
61 | std::string m_name; | |
62 | NameMap m_name_map; | |
63 | }; | |
64 | ||
65 | // object generator function | |
66 | template < typename NameMap > | |
67 | inline name_equals_t < NameMap > | |
68 | name_equals(const std::string & str, NameMap name) | |
69 | { | |
70 | return name_equals_t < NameMap > (str, name); | |
71 | } | |
72 | ||
73 | ||
74 | int | |
92f5a8d4 | 75 | main(int argc, const char** argv) |
7c673cae FG |
76 | { |
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 | |
81 | >graph_type; | |
82 | ||
83 | graph_type g; // use default constructor to create empty graph | |
92f5a8d4 TL |
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"; | |
7c673cae FG |
86 | std::ifstream file_in(dep_file_name), name_in(target_file_name); |
87 | if (!file_in) { | |
88 | std::cerr << "** Error: could not open file " << dep_file_name | |
89 | << std::endl; | |
90 | return -1; | |
91 | } | |
92 | if (!name_in) { | |
93 | std::cerr << "** Error: could not open file " << target_file_name | |
94 | << std::endl; | |
95 | return -1; | |
96 | } | |
97 | // Obtain internal property map from the graph | |
98 | property_map < graph_type, vertex_name_t >::type name_map = | |
99 | get(vertex_name, g); | |
100 | read_graph_file(file_in, name_in, g, name_map); | |
101 | ||
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)); | |
108 | ||
109 | assert(num_vertices(g) == 15); | |
110 | assert(num_edges(g) == 19); | |
111 | return 0; | |
112 | } |