18#include "absl/status/status.h"
19#include "absl/strings/str_format.h"
31 virtual ~GraphSyntax() {}
34 virtual std::string Node(
const std::string&
name,
const std::string& label,
35 const std::string& shape,
36 const std::string& color) = 0;
38 virtual std::string Link(
const std::string& source,
39 const std::string& destination,
40 const std::string& label) = 0;
42 virtual std::string Header(
const std::string&
name) = 0;
45 virtual std::string Footer() = 0;
48class DotSyntax :
public GraphSyntax {
50 ~DotSyntax()
override {}
52 std::string Node(
const std::string&
name,
const std::string& label,
53 const std::string& shape,
54 const std::string& color)
override {
55 return absl::StrFormat(
"%s [shape=%s label=\"%s\" color=%s]\n",
name, shape,
60 std::string Link(
const std::string& source,
const std::string& destination,
61 const std::string& label)
override {
62 return absl::StrFormat(
"%s -> %s [label=%s]\n", source, destination, label);
66 std::string Header(
const std::string&
name)
override {
67 return absl::StrFormat(
"graph %s {\n",
name);
71 std::string Footer()
override {
return "}\n"; }
74class GmlSyntax :
public GraphSyntax {
76 ~GmlSyntax()
override {}
78 std::string Node(
const std::string&
name,
const std::string& label,
79 const std::string& shape,
80 const std::string& color)
override {
81 return absl::StrFormat(
90 name, label, shape, color);
94 std::string Link(
const std::string& source,
const std::string& destination,
95 const std::string& label)
override {
96 return absl::StrFormat(
102 label, source, destination);
106 std::string Header(
const std::string&
name)
override {
107 return absl::StrFormat(
114 std::string Footer()
override {
return "]\n"; }
119class FileGraphExporter :
public GraphExporter {
121 FileGraphExporter(
File*
const file, GraphSyntax*
const syntax)
122 : file_(
file), syntax_(syntax) {}
124 ~FileGraphExporter()
override {}
127 void WriteNode(
const std::string&
name,
const std::string& label,
128 const std::string& shape,
const std::string& color)
override {
129 Append(syntax_->Node(
name, label, shape, color));
133 void WriteLink(
const std::string& source,
const std::string& destination,
134 const std::string& label)
override {
135 Append(syntax_->Link(source, destination, label));
138 void WriteHeader(
const std::string&
name)
override {
139 Append(syntax_->Header(
name));
142 void WriteFooter()
override { Append(syntax_->Footer()); }
145 void Append(
const std::string& str) {
150 std::unique_ptr<GraphSyntax> syntax_;
156 GraphSyntax* syntax =
nullptr;
159 syntax =
new DotSyntax();
163 syntax =
new GmlSyntax();
167 LOG(
FATAL) <<
"Unknown graph format";
169 CHECK(syntax !=
nullptr);
170 return new FileGraphExporter(
file, syntax);
static GraphExporter * MakeFileExporter(File *const file, GraphExporter::GraphFormat format)
absl::Status WriteString(File *file, const absl::string_view &contents, int flags)
The vehicle routing library lets one model and solve generic vehicle routing problems ranging from th...