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
33 BOOST_INSTALL_PROPERTY(vertex
, compile_cost
);
36 using namespace boost
;
38 typedef adjacency_list
< listS
, // Store out-edges of each vertex in a std::list
39 listS
, // Store vertex set in a std::list
40 directedS
, // The file dependency graph is directed
42 property
< vertex_name_t
, std::string
,
43 property
< vertex_compile_cost_t
, float,
44 property
< vertex_distance_t
, float,
45 property
< vertex_color_t
, default_color_type
> > > >,
47 property
< edge_weight_t
, float > >
50 typedef graph_traits
< file_dep_graph2
>::vertex_descriptor vertex_t
;
51 typedef graph_traits
< file_dep_graph2
>::edge_descriptor edge_t
;
53 int main(int argc
, const char** argv
)
55 std::ifstream
file_in(argc
>= 2 ? argv
[1] : "makefile-dependencies.dat");
56 typedef graph_traits
< file_dep_graph2
>::vertices_size_type size_type
;
58 file_in
>> n_vertices
; // read in number of vertices
59 #if defined(BOOST_MSVC) && BOOST_MSVC <= 1300
60 // std::istream_iterator causes trouble with VC++
61 std::vector
< vertex_t
> id2vertex
;
63 for (std::size_t i
= 0; i
< n_vertices
; ++i
)
64 id2vertex
.push_back(add_vertex(g
));
65 std::pair
< size_type
, size_type
> p
;
67 add_edge(id2vertex
[p
.first
], id2vertex
[p
.second
], g
);
69 std::istream_iterator
< std::pair
< size_type
, size_type
> > input_begin(
72 file_dep_graph2
g(input_begin
, input_end
, n_vertices
);
75 typedef property_map
< file_dep_graph2
, vertex_name_t
>::type name_map_t
;
76 typedef property_map
< file_dep_graph2
, vertex_compile_cost_t
>::type
79 name_map_t name_map
= get(vertex_name
, g
);
80 compile_cost_map_t compile_cost_map
= get(vertex_compile_cost
, g
);
82 std::ifstream
name_in(argc
>= 3 ? argv
[2] : "makefile-target-names.dat");
83 std::ifstream
compile_cost_in(
84 argc
>= 4 ? argv
[3] : "target-compile-costs.dat");
85 graph_traits
< file_dep_graph2
>::vertex_iterator vi
, vi_end
;
86 for (boost::tie(vi
, vi_end
) = vertices(g
); vi
!= vi_end
; ++vi
)
88 name_in
>> name_map
[*vi
];
89 compile_cost_in
>> compile_cost_map
[*vi
];
92 graph_property_iter_range
< file_dep_graph2
,
93 vertex_compile_cost_t
>::iterator ci
,
95 boost::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
;