1 | /// This is an example to demonstrate a problem I encountered with the
|
---|
2 | /// Boost Graph Library's (BGL) make_iterator_property_map when used
|
---|
3 | /// in conjunction with my own graph that has its property_map
|
---|
4 | /// specialization for vertex_index_t define the const_type as a true
|
---|
5 | /// const type.
|
---|
6 | ///
|
---|
7 | /// Is there a reason that make_iterator_property_map takes its second
|
---|
8 | /// argumant "by value" rather than "by referenc"e as the property_map
|
---|
9 | /// constructor does? This seems to cause an extra copy construction
|
---|
10 | /// to be performed that results in a non-const type which then does
|
---|
11 | /// does not match the property_map's constructor resulting in a
|
---|
12 | /// compilation error on GCC.
|
---|
13 |
|
---|
14 | #include "bug_report_example_skeleton.hpp"
|
---|
15 | #include <boost/graph/reverse_graph.hpp>
|
---|
16 | // #include "reverse_graph.hpp"
|
---|
17 |
|
---|
18 | void
|
---|
19 | bug_report_example_reverse_graph(MyGraph::Graph& g)
|
---|
20 | {
|
---|
21 | typedef boost::reverse_graph<MyGraph::Graph, MyGraph::Graph&> ReverseMyGraph;
|
---|
22 | /// The following does not compile because reverse_graph assumes
|
---|
23 | /// that the BidirectionalGraph template argument will have an
|
---|
24 | /// edge_property_type and a vertex_property_type. A user defined
|
---|
25 | /// graph that has been adapted by providing a specialization for
|
---|
26 | /// graph_traits and the other associated code may not have these
|
---|
27 | /// types as in this case.
|
---|
28 | ///
|
---|
29 | /// Looking at the code it seems these are only being used to
|
---|
30 | /// allow property_map's to be selected. An alternative way oif
|
---|
31 | /// achieving this is for reverse_graph to provide a
|
---|
32 | /// specialization for property_map that simply defines its
|
---|
33 | /// internals in terms of the base graph's property_map
|
---|
34 | /// specialization. This also simplifies the other code in
|
---|
35 | /// reverse_graph that is currently present to support
|
---|
36 | /// property_map selection.
|
---|
37 | ReverseMyGraph reverse_g = boost::make_reverse_graph(g);
|
---|
38 |
|
---|
39 | /// After fixing the above problem the following does not work
|
---|
40 | /// because the reverse_graph's definition for num_vertices
|
---|
41 | /// specifies the return type in terms of the base graphs
|
---|
42 | /// vertices_size_type. For a user defined graph that has been
|
---|
43 | /// adapted it may not have such a type as in this case.
|
---|
44 | ///
|
---|
45 | /// A solution is to change reverse_graph's num_vertices to use
|
---|
46 | /// graph_traits to obtain the type. This same problem exists on a
|
---|
47 | /// couple of other functions.
|
---|
48 | num_vertices(reverse_g);
|
---|
49 |
|
---|
50 | /// To be consistent some of the other functions need to specify
|
---|
51 | /// both arguments for reverse_graph rather then letting the
|
---|
52 | /// second one default.
|
---|
53 |
|
---|
54 | /// An ammended reverse_graph.hpp is provided that has these
|
---|
55 | /// changes and works with this example. I am not sure if some of
|
---|
56 | /// the property_map related code that is deleted is needed for
|
---|
57 | /// other reasons. It seems that just forwarding the property_map
|
---|
58 | /// of the reverse graph should avoid the need to provide these
|
---|
59 | /// other types that are used by the non-specialized version of
|
---|
60 | /// property_map. By providing an explicit specialization for
|
---|
61 | /// reverse_graph I think these will never be used.
|
---|
62 | }
|
---|