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>
14 #include <boost/graph/adjacency_list.hpp>
15 #include <boost/graph/property_iter_range.hpp>
19 template < typename T
>
20 std::istream
& operator >> (std::istream
& in
, std::pair
< T
, T
> &p
)
22 in
>> p
.first
>> p
.second
;
29 enum vertex_compile_cost_t
{ vertex_compile_cost
};
30 BOOST_INSTALL_PROPERTY(vertex
, compile_cost
);
33 using namespace boost
;
35 typedef adjacency_list
< listS
, // Store out-edges of each vertex in a std::list
36 listS
, // Store vertex set in a std::list
37 directedS
, // The file dependency graph is directed
39 property
< vertex_name_t
, std::string
,
40 property
< vertex_compile_cost_t
, float,
41 property
< vertex_distance_t
, float,
42 property
< vertex_color_t
, default_color_type
> > > >,
44 property
< edge_weight_t
, float > >
47 typedef graph_traits
<file_dep_graph2
>::vertex_descriptor vertex_t
;
48 typedef graph_traits
<file_dep_graph2
>::edge_descriptor edge_t
;
53 std::ifstream
file_in("makefile-dependencies.dat");
54 typedef graph_traits
<file_dep_graph2
>::vertices_size_type size_type
;
56 file_in
>> n_vertices
; // read in number of vertices
57 #if defined(BOOST_MSVC) && BOOST_MSVC <= 1300
58 // std::istream_iterator causes trouble with VC++
59 std::vector
<vertex_t
> id2vertex
;
61 for (std::size_t i
= 0; i
< n_vertices
; ++i
)
62 id2vertex
.push_back(add_vertex(g
));
63 std::pair
<size_type
, size_type
> p
;
65 add_edge(id2vertex
[p
.first
], id2vertex
[p
.second
], g
);
67 std::istream_iterator
<std::pair
<size_type
, size_type
> >
68 input_begin(file_in
), input_end
;
69 file_dep_graph2
g(input_begin
, input_end
, n_vertices
);
72 typedef property_map
< file_dep_graph2
, vertex_name_t
>::type name_map_t
;
73 typedef property_map
< file_dep_graph2
, vertex_compile_cost_t
>::type
75 typedef property_map
<file_dep_graph2
, vertex_distance_t
>::type
77 typedef property_map
<file_dep_graph2
, vertex_color_t
>::type
80 name_map_t name_map
= get(vertex_name
, g
);
81 compile_cost_map_t compile_cost_map
= get(vertex_compile_cost
, g
);
82 distance_map_t distance_map
= get(vertex_distance
, g
);
83 color_map_t color_map
= get(vertex_color
, g
);
85 std::ifstream
name_in("makefile-target-names.dat");
86 std::ifstream
compile_cost_in("target-compile-costs.dat");
87 graph_traits
< file_dep_graph2
>::vertex_iterator vi
, vi_end
;
88 for (tie(vi
, vi_end
) = vertices(g
); vi
!= vi_end
; ++vi
) {
89 name_in
>> name_map
[*vi
];
90 compile_cost_in
>> compile_cost_map
[*vi
];
93 graph_property_iter_range
< file_dep_graph2
,
94 vertex_compile_cost_t
>::iterator ci
, ci_end
;
95 tie(ci
, ci_end
) = get_property_iter_range(g
, vertex_compile_cost
);
96 std::cout
<< "total (sequential) compile time: "
97 << std::accumulate(ci
, ci_end
, 0.0) << std::endl
;