1 //======================================================================= 2 // 3 // Copyright (c) 2003 Institute of Transport, 4 // Railway Construction and Operation, 5 // University of Hanover, Germany 6 // 7 // Author: Juergen Hunold 8 // 9 // Use, modification and distribution are subject to the 10 // Boost Software License, Version 1.0. (See accompanying file 11 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 12 // 13 //======================================================================= 14 15 #include <boost/config.hpp> 16 17 #include <iostream> 18 #include <vector> 19 #include <set> 20 #include <utility> 21 #include <algorithm> 22 23 #define VERBOSE 0 24 25 #include <boost/utility.hpp> 26 #include <boost/graph/property_iter_range.hpp> 27 #include <boost/graph/graph_utility.hpp> 28 #include <boost/graph/random.hpp> 29 #include <boost/pending/indirect_cmp.hpp> 30 31 #include <boost/random/mersenne_twister.hpp> 32 33 enum vertex_id_t 34 { 35 vertex_id = 500 36 }; 37 enum edge_id_t 38 { 39 edge_id = 501 40 }; 41 namespace boost 42 { 43 BOOST_INSTALL_PROPERTY(vertex, id); 44 BOOST_INSTALL_PROPERTY(edge, id); 45 } 46 47 #include "graph_type.hpp" // this provides a typedef for Graph 48 49 using namespace boost; 50 51 /* 52 This program tests the property range iterators 53 */ 54 55 using std::cerr; 56 using std::cout; 57 using std::endl; 58 using std::find; 59 main(int,char * [])60 int main(int, char*[]) 61 { 62 int ret = 0; 63 std::size_t N = 5, E = 0; 64 65 typedef ::Graph Graph; 66 Graph g; 67 typedef boost::graph_traits< Graph >::vertex_descriptor Vertex; 68 typedef boost::graph_traits< Graph >::edge_descriptor Edge; 69 70 int i, j; 71 std::size_t current_vertex_id = 0; 72 std::size_t current_edge_id = 0; 73 74 property_map< Graph, vertex_id_t >::type vertex_id_map = get(vertex_id, g); 75 (void)vertex_id_map; 76 77 property_map< Graph, edge_id_t >::type edge_id_map = get(edge_id, g); 78 (void)edge_id_map; 79 80 for (std::size_t k = 0; k < N; ++k) 81 add_vertex(current_vertex_id++, g); 82 83 mt19937 gen; 84 85 for (j = 0; j < 10; ++j) 86 { 87 88 // add_edge 89 #if VERBOSE 90 cerr << "Testing add_edge ..." << endl; 91 #endif 92 for (i = 0; i < 6; ++i) 93 { 94 Vertex a, b; 95 a = random_vertex(g, gen); 96 do 97 { 98 b = random_vertex(g, gen); 99 } while (a == b); // don't do self edges 100 #if VERBOSE 101 cerr << "add_edge(" << vertex_id_map[a] << "," << vertex_id_map[b] 102 << ")" << endl; 103 #endif 104 Edge e; 105 bool inserted; 106 boost::tie(e, inserted) = add_edge(a, b, current_edge_id++, g); 107 #if VERBOSE 108 std::cout << "inserted: " << inserted << std::endl; 109 std::cout << "source(e,g)" << source(e, g) << endl; 110 std::cout << "target(e,g)" << target(e, g) << endl; 111 std::cout << "edge_id[e] = " << edge_id_map[e] << std::endl; 112 print_edges2(g, vertex_id_map, edge_id_map); 113 print_graph(g, vertex_id_map); 114 std::cout << "finished printing" << std::endl; 115 #endif 116 } 117 ++E; 118 } 119 120 typedef boost::graph_property_iter_range< Graph, vertex_id_t >::iterator 121 TNodeIterator; 122 123 typedef boost::graph_property_iter_range< Graph, edge_id_t >::iterator 124 TLinkIterator; 125 126 TLinkIterator itEdgeBegin, itEdgeEnd; 127 128 boost::tie(itEdgeBegin, itEdgeEnd) = get_property_iter_range(g, edge_id); 129 130 cout << "Edge iteration:" << endl; 131 for (; itEdgeBegin != itEdgeEnd; ++itEdgeBegin) 132 { 133 cout << *itEdgeBegin; 134 } 135 cout << endl; 136 137 TNodeIterator itVertexBegin, itVertexEnd; 138 139 boost::tie(itVertexBegin, itVertexEnd) 140 = get_property_iter_range(g, vertex_id); 141 142 cout << "Vertex iteration:" << endl; 143 for (; itVertexBegin != itVertexEnd; ++itVertexBegin) 144 { 145 cout << *itVertexBegin; 146 } 147 cout << endl; 148 149 return ret; 150 } 151