smgl 0.11.0
Structured Metadata Engine and Graph Objects Library
Loading...
Searching...
No Matches
GraphvizImpl.hpp
1#include "smgl/TypeTraits.hpp"
2
3namespace smgl
4{
5
6template <class NodeT>
8{
9 setClassStyle(NodeName<NodeT>(), style);
10}
11
12template <class NodeT>
13auto GraphStyle::hasClassStyle() const -> bool
14{
15 return hasClassStyle(NodeName<NodeT>());
16}
17
18template <class NodeT>
20{
21 eraseClassStyle(NodeName<NodeT>());
22}
23
24template <class NodeT>
26{
27 return classStyle(NodeName<NodeT>());
28}
29
30template <class NodeT>
31auto GraphStyle::classStyle() const -> const NodeStyle&
32{
33 return classStyle(NodeName<NodeT>());
34}
35
36template <typename... Args>
37void GraphStyle::setRankMin(const Args&... args)
38{
39 static_assert(sizeof...(args) > 0, "Missing arguments");
40 using namespace type_traits;
41#if __cplusplus >= 201703L
42 static_assert(
43 (is_ptr_to_base_v<decltype(args), Node> && ...),
44 "Argument is not a Node pointer");
45 (rankMin_.insert(args->uuid()), ...);
46#elif __cplusplus > 201103L
47 static_assert(
48 all_true_v<(is_ptr_to_base_v<decltype(args), Node>)...>,
49 "Argument is not a Node pointer");
50 detail::ExpandType{0, (rankMin_.insert(args->uuid()), 0)...};
51#endif
52}
53
54template <typename... Args>
55void GraphStyle::setRankSource(const Args&... args)
56{
57 static_assert(sizeof...(args) > 0, "Missing arguments");
58 using namespace type_traits;
59#if __cplusplus >= 201703L
60 static_assert(
61 (is_ptr_to_base_v<decltype(args), Node> && ...),
62 "Argument is not a Node pointer");
63 (rankSrc_.insert(args->uuid()), ...);
64#elif __cplusplus > 201103L
65 static_assert(
66 all_true_v<(is_ptr_to_base_v<decltype(args), Node>)...>,
67 "Argument is not a Node pointer");
68 detail::ExpandType{0, (rankSrc_.insert(args->uuid()), 0)...};
69#endif
70}
71
72template <typename... Args>
73void GraphStyle::setRankMax(const Args&... args)
74{
75 static_assert(sizeof...(args) > 0, "Missing arguments");
76 using namespace type_traits;
77#if __cplusplus >= 201703L
78 static_assert(
79 (is_ptr_to_base_v<decltype(args), Node> && ...),
80 "Argument is not a Node pointer");
81 (rankMax_.insert(args->uuid()), ...);
82#elif __cplusplus > 201103L
83 static_assert(
84 all_true_v<(is_ptr_to_base_v<decltype(args), Node>)...>,
85 "Argument is not a Node pointer");
86 detail::ExpandType{0, (rankMax_.insert(args->uuid()), 0)...};
87#endif
88}
89
90template <typename... Args>
91void GraphStyle::setRankSink(const Args&... args)
92{
93 static_assert(sizeof...(args) > 0, "Missing arguments");
94 using namespace type_traits;
95#if __cplusplus >= 201703L
96 static_assert(
97 (is_ptr_to_base_v<decltype(args), Node> && ...),
98 "Argument is not a Node pointer");
99 (rankSink_.insert(args->uuid()), ...);
100#elif __cplusplus > 201103L
101 static_assert(
102 all_true_v<(is_ptr_to_base_v<decltype(args), Node>)...>,
103 "Argument is not a Node pointer");
104 detail::ExpandType{0, (rankSink_.insert(args->uuid()), 0)...};
105#endif
106}
107
108template <typename... Args>
109auto GraphStyle::setRankSame(const Args&... args) -> std::size_t
110{
111 static_assert(sizeof...(args) > 0, "Missing arguments");
112 using namespace type_traits;
113 auto idx = rankSame_.size();
115#if __cplusplus >= 201703L
116 static_assert(
117 (is_ptr_to_base_v<decltype(args), Node> && ...),
118 "Argument is not a Node pointer");
119 (same.push_back(args->uuid()), ...);
120#elif __cplusplus > 201103L
121 static_assert(
122 all_true_v<(is_ptr_to_base_v<decltype(args), Node>)...>,
123 "Argument is not a Node pointer");
124 detail::ExpandType{0, (same.push_back(args->uuid()), 0)...};
125#endif
126 rankSame_.push_back(same);
127 return idx;
128}
129
130template <typename T, typename... Args>
131void GraphStyle::appendRankSame(T idx, const Args&... args)
132{
133 static_assert(sizeof...(args) > 0, "Missing arguments");
134 using namespace type_traits;
135#if __cplusplus >= 201703L
136 static_assert(
137 (is_ptr_to_base_v<decltype(args), Node> && ...),
138 "Argument is not a Node pointer");
139 (rankSame_.at(idx).push_back(args->uuid()), ...);
140#elif __cplusplus > 201103L
141 static_assert(
142 all_true_v<(is_ptr_to_base_v<decltype(args), Node>)...>,
143 "Argument is not a Node pointer");
144 detail::ExpandType{0, (rankSame_.at(idx).push_back(args->uuid()), 0)...};
145#endif
146}
147
148} // namespace smgl
void setRankMin(const Args &... args)
Assign node(s) to the minimum rank.
auto hasClassStyle(const std::string &name) const -> bool
Check if a class of nodes has an associated style.
void appendRankSame(T idx, const Args &... args)
Assign node(s) to an existing group ranking.
void setRankMax(const Args &... args)
Assigns node(s) to the maximum rank.
void setRankSource(const Args &... args)
Assign node(s) to the minimum rank and limits the minimum rank to nodes with rank=min or rank=source.
auto setRankSame(const Args &... args) -> std::size_t
Assign node(s) to a new group ranking.
std::unordered_set< Uuid > rankMax_
Definition Graphviz.hpp:312
void setRankSink(const Args &... args)
Assign node(s) to the maximum rank and limits the maximum rank to nodes with rank=max or rank=sink.
std::unordered_set< Uuid > rankMin_
Definition Graphviz.hpp:308
std::unordered_set< Uuid > rankSink_
Definition Graphviz.hpp:314
std::unordered_set< Uuid > rankSrc_
Definition Graphviz.hpp:310
void eraseClassStyle(const std::string &name)
Erase the style associated with a class of nodes.
void eraseClassStyle() const
Erase the style associated with a class of nodes.
std::vector< std::vector< Uuid > > rankSame_
Definition Graphviz.hpp:316
auto classStyle() -> NodeStyle &
Access the style for a class of nodes.
auto hasClassStyle() const -> bool
Check if a class of nodes has an associated style.
void setClassStyle(const std::string &name, const NodeStyle &style)
Set a class-specific node style.
Generic Node class.
Definition Node.hpp:70
Project top-level namespace.
T push_back(T... args)
Style struct containing all sub-styles for a node.
Definition Graphviz.hpp:50
Helper class for calling function iteratively on parameter pack.
Definition Utilities.hpp:37