6#ifndef JLM_UTIL_GRAPHWRITER_HPP
7#define JLM_UTIL_GRAPHWRITER_HPP
15#include <unordered_map>
67 [[nodiscard]]
virtual const char *
84 [[nodiscard]] std::string
90 [[nodiscard]]
virtual Graph &
93 [[nodiscard]]
const Graph &
110 AppendToLabel(std::string_view text, std::string_view sep =
"\n");
121 [[nodiscard]]
const std::string &
127 [[nodiscard]] std::string_view
168 [[nodiscard]] uintptr_t
177 SetAttribute(const std::
string & attribute, std::
string value);
196 static_assert(!std::is_pointer_v<T>,
"Sending a reference to a pointer is likely a bug");
220 [[nodiscard]] std::optional<std::string_view>
228 [[nodiscard]] std::optional<uintptr_t>
289 using AttributeValue = std::variant<std::string, const GraphElement *, uintptr_t>;
332 [[nodiscard]]
virtual bool
338 [[nodiscard]]
virtual bool
344 [[nodiscard]]
const std::vector<Edge *> &
434 static inline const char *
const Circle =
"circle";
435 static inline const char *
const Oval =
"oval";
436 static inline const char *
const Point =
"point";
437 static inline const char *
const Plain =
"plain";
438 static inline const char *
const Plaintext =
"plaintext";
439 static inline const char *
const Triangle =
"triangle";
463 OutputASCII(std::ostream & out,
size_t indent)
const;
470 OutputDot(std::ostream & out,
size_t indent)
const;
477 outputJson(std::ostream & out,
size_t indent)
const;
515 outputJson(std::ostream & out,
size_t indent)
const;
549 outputJson(std::ostream & out,
size_t indent)
const;
572 void SetShape(std::string)
override;
632 OutputASCII(std::ostream & out,
size_t indent)
const override;
635 OutputDot(std::ostream & out,
size_t indent)
const override;
638 outputJson(std::ostream & out,
size_t indent)
const override;
677 OutputASCII(std::ostream & out,
size_t indent)
const override;
712 OutputASCII(std::ostream & out,
size_t indent)
const override;
772 static inline const char *
const Solid =
"solid";
773 static inline const char *
const Dashed =
"dashed";
774 static inline const char *
const Dotted =
"dotted";
776 static inline const char *
const Bold =
"bold";
777 static inline const char *
const Tapered =
"tapered";
812 OutputDot(std::ostream & out,
size_t indent)
const;
818 outputJson(std::ostream & out,
size_t indent)
const;
847 [[nodiscard]]
const Writer &
997 static_assert(!std::is_pointer_v<T>);
1008 template<
typename Element,
typename ProgramObject>
1012 static_assert(std::is_base_of_v<GraphElement, Element>);
1014 auto result =
dynamic_cast<Element *
>(element);
1038 OutputASCII(std::ostream & out,
size_t indent)
const;
1041 OutputDot(std::ostream & out,
size_t indent)
const;
1044 outputJson(std::ostream & out,
size_t indent)
const;
1106 [[nodiscard]]
Graph &
1112 [[nodiscard]]
size_t
1118 [[nodiscard]]
Graph &
1128 template<typename T>
1134 static_assert(!std::is_pointer_v<T>);
1154 [[nodiscard]]
Graph &
1164 [[nodiscard]]
size_t
1185inline const char *
const Black =
"#000000";
1186inline const char *
const Blue =
"#0000FF";
1187inline const char *
const Coral =
"#FF7F50";
1190inline const char *
const Gold =
"#FFD700";
1191inline const char *
const Gray =
"#BEBEBE";
1192inline const char *
const Green =
"#00FF00";
1195inline const char *
const Red =
"#FF0000";
1196inline const char *
const Brown =
"#8B4513";
1198inline const char *
const White =
"#FFFFFF";
bool CanBeEdgeHead() const override
void SetOutsideSource(const Port &outsideSource)
const char * GetIdPrefix() const override
const Port * OutsideSource_
~ArgumentNode() override=default
void OutputASCII(std::ostream &out, size_t indent) const override
void SetStyle(std::string style)
void SetArrowTail(std::string arrow)
Port & GetOtherEnd(const Port &end)
const char * GetIdPrefix() const override
Graph & GetGraph() override
std::string_view getDirection() const
void OutputDot(std::ostream &out, size_t indent) const
void SetArrowHead(std::string arrow)
void outputJson(std::ostream &out, size_t indent) const
size_t GetUniqueIdSuffix() const
void outputJsonObjectOpening(std::ostream &out, size_t indent, bool &firstField) const
void SetProgramObject(const T &object)
void SetLabel(std::string label)
uintptr_t GetProgramObject() const noexcept
std::string GetFullId() const
void SetAttributeObject(const std::string &attribute, uintptr_t object)
virtual ~GraphElement()=default
virtual Graph & GetGraph()=0
void RemoveProgramObject()
std::variant< std::string, const GraphElement *, uintptr_t > AttributeValue
void AppendToLabel(std::string_view text, std::string_view sep="\n")
GraphElement & operator=(GraphElement &&other)=delete
void SetAttribute(const std::string &attribute, std::string value)
std::string_view GetLabelOr(std::string_view otherwise) const
GraphElement(const GraphElement &other)=delete
const std::string & GetLabel() const
void PrintFullId(std::ostream &out) const
bool RemoveAttribute(const std::string &attribute)
GraphElement(GraphElement &&other)=delete
GraphElement & operator=(const GraphElement &other)=delete
virtual const char * GetIdPrefix() const =0
std::optional< uintptr_t > GetAttributeObject(const std::string &attribute) const
std::unordered_map< std::string, AttributeValue > AttributeMap_
void OutputAttribute(std::ostream &out, const std::string &name, AttributeOutputFormat format) const
void OutputAttributes(std::ostream &out, AttributeOutputFormat format) const
bool HasAttribute(const std::string &attribute) const
const GraphElement * GetAttributeGraphElement(const std::string &attribute) const
std::optional< size_t > UniqueIdSuffix_
std::optional< std::string_view > GetAttributeString(const std::string &attribute) const
void SetProgramObjectUintptr(uintptr_t object)
void SetAttributeGraphElement(const std::string &attribute, const GraphElement &element)
bool HasProgramObject() const noexcept
std::vector< std::unique_ptr< ArgumentNode > > ArgumentNodes_
ArgumentNode & CreateArgumentNode()
Node & GetNode(size_t index)
void Output(std::ostream &out, OutputFormat format, size_t indent) const
GraphElement * GetElementFromProgramObject(uintptr_t object) const
std::unordered_map< uintptr_t, GraphElement * > ProgramObjectMapping_
Node & GetResultNode(size_t index)
Edge & GetEdge(size_t index)
Edge * GetEdgeBetween(Port &a, Port &b)
Edge & CreateDirectedEdge(Port &from, Port &to)
void OutputASCII(std::ostream &out, size_t indent) const
const char * GetIdPrefix() const override
void RemoveProgramObjectMapping(uintptr_t object)
std::vector< std::unique_ptr< Edge > > Edges_
Graph & GetGraph() override
ResultNode & CreateResultNode()
size_t NumResultNodes() const noexcept
std::vector< std::unique_ptr< ResultNode > > ResultNodes_
void OutputDot(std::ostream &out, size_t indent) const
size_t NumEdges() const noexcept
size_t NumNodes() const noexcept
Node & GetArgumentNode(size_t index)
Edge & CreateUndirectedEdge(Port &a, Port &b)
InOutNode & CreateInOutNode(size_t inputPorts, size_t outputPorts)
size_t NumArgumentNodes() const noexcept
void outputJson(std::ostream &out, size_t indent) const
std::vector< std::unique_ptr< Node > > Nodes_
Edge & CreateEdge(Port &from, Port &to, bool directed)
void MapProgramObjectToElement(GraphElement &element)
Element & GetFromProgramObject(const ProgramObject &object) const
~Graph() override=default
size_t NumInputPorts() const
void OutputSubgraphs(std::ostream &out, OutputFormat format, size_t indent) const override
std::unordered_map< std::string, std::string > HtmlTableAttributes_
std::vector< std::unique_ptr< OutputPort > > OutputPorts_
void OutputDot(std::ostream &out, size_t indent) const override
void outputJson(std::ostream &out, size_t indent) const override
void SetFillColor(std::string color) override
size_t NumOutputPorts() const
OutputPort & GetOutputPort(size_t index)
std::vector< Graph * > SubGraphs_
std::vector< std::unique_ptr< InputPort > > InputPorts_
void SetShape(std::string) override
InputPort & GetInputPort(size_t index)
~InOutNode() override=default
size_t NumSubgraphs() const
Graph & GetSubgraph(size_t index)
InputPort & CreateInputPort()
void OutputASCII(std::ostream &out, size_t indent) const override
void SetHtmlTableAttribute(std::string name, std::string value)
OutputPort & CreateOutputPort()
Node & GetNode() override
const char * GetIdPrefix() const override
Graph & GetGraph() override
virtual void OutputDot(std::ostream &out, size_t indent) const
virtual void OutputSubgraphs(std::ostream &out, OutputFormat format, size_t indent) const
void OutputDotPortId(std::ostream &out) const override
virtual void OutputASCII(std::ostream &out, size_t indent) const
virtual void outputJson(std::ostream &out, size_t indent) const
virtual void SetShape(std::string shape)
void SetFillColor(std::string color) override
Node & GetNode() override
void SetFillColor(std::string color) override
void outputJson(std::ostream &out, size_t indent) const
~OutputPort() override=default
bool CanBeEdgeHead() const override
void OutputDotPortId(std::ostream &out) const override
const char * GetIdPrefix() const override
const std::vector< Edge * > & GetConnections() const
virtual bool CanBeEdgeTail() const
virtual bool CanBeEdgeHead() const
virtual Node & GetNode()=0
virtual void SetFillColor(std::string color)=0
std::vector< Edge * > Connections_
bool HasIncomingEdges() const
void OutputIncomingEdgesASCII(std::ostream &out) const
Graph & GetGraph() override
void OnEdgeAdded(Edge &edge)
bool HasOutgoingEdges() const
virtual void OutputDotPortId(std::ostream &out) const =0
const Port * OutsideDestination_
void SetOutsideDestination(const Port &outsideSource)
void OutputASCII(std::ostream &out, size_t indent) const override
const char * GetIdPrefix() const override
~ResultNode() override=default
bool CanBeEdgeTail() const override
GraphElement * GetElementFromProgramObject(uintptr_t object) const
size_t GetNextUniqueIdStubSuffix(const char *idStub)
std::unordered_map< std::string, size_t > NextUniqueIdStubSuffix_
Writer(Writer &&other)=delete
Writer & operator=(Writer &&other)=delete
size_t NumGraphs() const noexcept
Graph & CreateSubGraph(Node &parentNode)
std::vector< std::unique_ptr< Graph > > Graphs_
void outputAllGraphs(std::ostream &out, OutputFormat format)
Writer(const Writer &other)=delete
Graph & GetGraph(size_t index)
Writer & operator=(const Writer &other)=delete
const char *const Firebrick
const char *const CornflowerBlue
const char *const SkyBlue
static const char *const Dashed
static const char *const Bold
static const char *const Invisible
static const char *const Tapered
static const char *const Solid
static const char *const Dotted
static const char *const Plain
static const char *const Plaintext
static const char *const Point
static const char *const Triangle
static const char *const Rectangle
static const char *const Oval
static const char *const DoubleCircle
static const char *const Circle