// Copyright 2004-9 Trustees of Indiana University | |
// Distributed under 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) | |
// | |
// read_graphviz_new.hpp - | |
// Initialize a model of the BGL's MutableGraph concept and an associated | |
// collection of property maps using a graph expressed in the GraphViz | |
// DOT Language. | |
// | |
// Based on the grammar found at: | |
// http://www.graphviz.org/cvs/doc/info/lang.html | |
// | |
// Jeremiah rewrite used grammar found at: | |
// http://www.graphviz.org/doc/info/lang.html | |
// and page 34 or http://www.graphviz.org/pdf/dotguide.pdf | |
// | |
// See documentation for this code at: | |
// http://www.boost.org/libs/graph/doc/read-graphviz.html | |
// | |
// Author: Jeremiah Willcock | |
// Ronald Garcia | |
// | |
#ifndef BOOST_READ_GRAPHVIZ_NEW_HPP | |
#define BOOST_READ_GRAPHVIZ_NEW_HPP | |
#include <boost/ref.hpp> | |
#include <boost/property_map/dynamic_property_map.hpp> | |
#include <boost/graph/graph_traits.hpp> | |
#include <boost/detail/workaround.hpp> | |
#include <algorithm> | |
#include <string> | |
#include <vector> | |
#include <set> | |
#include <utility> | |
#include <map> | |
#include <iostream> | |
#include <cstdlib> | |
namespace boost { | |
namespace read_graphviz_detail { | |
typedef std::string node_name; | |
typedef std::string subgraph_name; | |
typedef std::map<std::string, std::string> properties; | |
struct node_and_port { | |
node_name name; | |
std::string angle; // Or empty if no angle | |
std::vector<std::string> location; // Up to two identifiers | |
friend inline bool operator==(const node_and_port& a, const node_and_port& b) { | |
return a.name == b.name && | |
a.angle == b.angle && | |
a.location == b.location; | |
} | |
friend inline bool operator<(const node_and_port& a, const node_and_port& b) { | |
if (a.name != b.name) return a.name < b.name; | |
if (a.angle != b.angle) return a.angle < b.angle; | |
return a.location < b.location; | |
} | |
}; | |
struct edge_info { | |
node_and_port source; | |
node_and_port target; | |
properties props; | |
}; | |
struct parser_result { | |
bool graph_is_directed; | |
bool graph_is_strict; | |
std::map<node_name, properties> nodes; // Global set | |
std::vector<edge_info> edges; | |
std::map<subgraph_name, properties> graph_props; // Root and subgraphs | |
}; | |
// The actual parser, from libs/graph/src/read_graphviz_new.cpp | |
void parse_graphviz_from_string(const std::string& str, parser_result& result, bool want_directed); | |
// Translate from those results to a graph | |
void translate_results_to_graph(const parser_result& r, ::boost::detail::graph::mutate_graph* mg); | |
} // namespace read_graphviz_detail | |
namespace detail { | |
namespace graph { | |
BOOST_GRAPH_DECL bool read_graphviz_new(const std::string& str, boost::detail::graph::mutate_graph* mg); | |
} // end namespace graph | |
} // end namespace detail | |
template <typename MutableGraph> | |
bool read_graphviz_new(const std::string& str, | |
MutableGraph& graph, boost::dynamic_properties& dp, | |
std::string const& node_id = "node_id") { | |
boost::detail::graph::mutate_graph_impl<MutableGraph> mg(graph, dp, node_id); | |
return detail::graph::read_graphviz_new(str, &mg); | |
} | |
} // namespace boost | |
#endif // BOOST_READ_GRAPHVIZ_NEW_HPP |