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