• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // (C) Copyright Andrew Sutton 2009
2 // Distributed under the Boost Software License, Version 1.0. (See
3 // accompanying file LICENSE_1_0.txt or copy at
4 // http://www.boost.org/LICENSE_1_0.txt)
5 
6 #include <iostream>
7 
8 #include <boost/graph/adjacency_list.hpp>
9 #include <boost/graph/subgraph.hpp>
10 #include "typestr.hpp"
11 
12 using namespace boost;
13 
14 struct TestProps
15 {
16     typedef property< vertex_name_t, std::size_t > VertexProp;
17     typedef property< edge_name_t, std::size_t > EdgeName;
18     typedef property< edge_index_t, std::size_t, EdgeName > EdgeProp;
19 
20     typedef adjacency_list< vecS, vecS, bidirectionalS, VertexProp, EdgeProp >
21         Graph;
22 
23     typedef subgraph< Graph > Subgraph;
24     typedef graph_traits< Subgraph >::vertex_descriptor Vertex;
25     typedef graph_traits< Subgraph >::edge_descriptor Edge;
26     typedef graph_traits< Subgraph >::vertex_iterator VertexIter;
27     typedef std::pair< VertexIter, VertexIter > VertexRange;
28 
runTestProps29     static void run()
30     {
31         // Create a graph with some vertices.
32         Subgraph g(5);
33         VertexRange r = vertices(g);
34 
35         // Create a child subgraph and add some vertices.
36         Subgraph& sg = g.create_subgraph();
37         Vertex v = add_vertex(*r.first, sg);
38 
39         typedef property_map< Subgraph, vertex_name_t >::type DefaultMap;
40         DefaultMap map = get(vertex_name, g);
41         BOOST_ASSERT(get(map, v) == 0);
42         put(map, v, 5);
43         BOOST_ASSERT(get(map, v) == 5);
44 
45         typedef global_property< vertex_name_t > GlobalProp;
46         typedef property_map< Subgraph, GlobalProp >::type GlobalVertMap;
47         GlobalVertMap groot = get(global(vertex_name), g);
48         GlobalVertMap gsub = get(global(vertex_name), sg);
49         BOOST_ASSERT(get(groot, v) == 5);
50         BOOST_ASSERT(get(gsub, v) == 5);
51         put(gsub, v, 10);
52         BOOST_ASSERT(get(groot, v) == 10);
53         BOOST_ASSERT(get(gsub, v) == 10);
54         BOOST_ASSERT(get(map, v) == 10);
55 
56         typedef local_property< vertex_name_t > LocalProp;
57         typedef property_map< Subgraph, LocalProp >::type LocalVertMap;
58         LocalVertMap lroot = get(local(vertex_name), g); // Actually global!
59         LocalVertMap lsub = get(local(vertex_name), sg);
60         BOOST_ASSERT(get(lroot, v) == 10); // Recall it's 10 from above!
61         BOOST_ASSERT(get(lsub, v) == 0);
62         put(lsub, v, 5);
63         BOOST_ASSERT(get(lsub, v) == 5);
64         BOOST_ASSERT(get(lroot, v) == 10); // Don't change the root prop
65         BOOST_ASSERT(get(map, v) == 10); // Don't change the root prop
66 
67         //         typedef detail::subgraph_local_pmap::bind_<LocalProp,
68         //         Subgraph, void> PM; std::cout << typestr<PM::TagType>() <<
69         //         "\n"; std::cout << typestr<PM::PMap>() << "\n";
70     }
71 };
72 
73 struct TestBundles
74 {
75     struct Node
76     {
NodeTestBundles::Node77         Node() : value(-1) {}
78         int value;
79     };
80     struct Arc
81     {
ArcTestBundles::Arc82         Arc() : value(-1) {}
83         int value;
84     };
85     typedef property< edge_index_t, std::size_t, Arc > EdgeProp;
86 
87     typedef adjacency_list< vecS, vecS, bidirectionalS, Node, EdgeProp > Graph;
88 
89     typedef subgraph< Graph > Subgraph;
90     typedef graph_traits< Subgraph >::vertex_descriptor Vertex;
91     typedef graph_traits< Subgraph >::edge_descriptor Edge;
92     typedef graph_traits< Subgraph >::vertex_iterator VertexIter;
93     typedef std::pair< VertexIter, VertexIter > VertexRange;
94 
runTestBundles95     static void run()
96     {
97         // Create a graph with some vertices.
98         Subgraph g(5);
99         VertexRange r = vertices(g);
100 
101         // Create a child subgraph and add some vertices.
102         Subgraph& sg = g.create_subgraph();
103         Vertex v = add_vertex(*r.first, sg);
104 
105         sg[v].value = 1;
106         BOOST_ASSERT(sg[v].value == 1);
107         BOOST_ASSERT(sg[global(v)].value == 1);
108         BOOST_ASSERT(sg[local(v)].value == -1);
109 
110         sg[local(v)].value = 5;
111         BOOST_ASSERT(sg[local(v)].value == 5);
112         BOOST_ASSERT(sg[global(v)].value == 1);
113         BOOST_ASSERT(sg[v].value == 1);
114 
115         typedef property_map< Subgraph, local_property< int Node::* > >::type
116             LocalVertMap;
117         LocalVertMap lvm = get(local(&Node::value), sg);
118         BOOST_ASSERT(get(lvm, v) == 5);
119 
120         typedef property_map< Subgraph, global_property< int Node::* > >::type
121             GlobalVertMap;
122         GlobalVertMap gvm = get(global(&Node::value), sg);
123         BOOST_ASSERT(get(gvm, v) == 1);
124     }
125 };
126 
main(int argc,char * argv[])127 int main(int argc, char* argv[])
128 {
129     TestProps::run();
130     TestBundles::run();
131 
132     return 0;
133 }
134