// Copyright 2008 Trustees of Indiana University // Use, modification and distribution is subject to the Boost Software // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // An example of using read_graphviz to load a GraphViz Dot textual // graph into a BGL adjacency_list graph that has custom properties. // Author: Ronald Garcia #include #include #include #include #include using namespace boost; using namespace std; // // Create a custom graph properties // (see the documentation for adjacency list) struct graph_identifier_t { typedef graph_property_tag kind; }; struct vertex_label_t { typedef vertex_property_tag kind; }; int main() { // Vertex properties typedef property< vertex_name_t, string, property< vertex_label_t, string, property< vertex_root_t, int > > > vertex_p; // Edge properties typedef property< edge_name_t, string > edge_p; // Graph properties typedef property< graph_name_t, string, property< graph_identifier_t, string > > graph_p; // adjacency_list-based type typedef adjacency_list< vecS, vecS, directedS, vertex_p, edge_p, graph_p > graph_t; // Construct an empty graph and prepare the dynamic_property_maps. graph_t graph(0); dynamic_properties dp; property_map< graph_t, vertex_name_t >::type vname = get(vertex_name, graph); dp.property("node_id", vname); property_map< graph_t, vertex_label_t >::type vlabel = get(vertex_label_t(), graph); dp.property("label", vlabel); property_map< graph_t, vertex_root_t >::type root = get(vertex_root, graph); dp.property("root", root); property_map< graph_t, edge_name_t >::type elabel = get(edge_name, graph); dp.property("label", elabel); // Use ref_property_map to turn a graph property into a property map ref_property_map< graph_t*, string > gname(get_property(graph, graph_name)); dp.property("name", gname); // Use ref_property_map to turn a graph property into a property map ref_property_map< graph_t*, string > gid( get_property(graph, graph_identifier_t())); dp.property("identifier", gid); // Sample graph as an istream; const char* dot = "digraph \ { \ graph [name=\"GRAPH\", identifier=\"CX2A1Z\"] \ \ a [label=\"NODE_A\", root=\"1\"] \ b [label=\"NODE_B\", root=\"0\"] \ \ a -> b [label=\"EDGE_1\"] \ b -> c [label=\"EDGE_2\"] \ }"; istringstream gvgraph(dot); bool status = read_graphviz(gvgraph, graph, dp, "node_id"); if (!status) { cerr << "read_graphviz() failed." << endl; return -1; } cout << "graph " << get("name", dp, &graph) << " (" << get("identifier", dp, &graph) << ")\n\n"; BOOST_FOREACH (graph_t::vertex_descriptor v, vertices(graph)) { cout << "vertex " << get("node_id", dp, v) << " (" << get("label", dp, v) << ")\n"; } return 0; }