You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
108 lines
3.2 KiB
108 lines
3.2 KiB
// 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
|
|
|