RemoteGuiAronDataVisitor.h
Go to the documentation of this file.
1#pragma once
2
3#include <sstream>
4#include <stack>
5
7
9
12
14{
15
17 {
21
22 struct Group
23 {
24 Group(const std::string& label = {});
25
28 int nextRow = 0;
29 };
30
31 std::stack<Group> groups;
33
34
35 virtual ~RemoteGuiAronDataVisitor() = default;
36
37 void
39 {
41 const std::string key = n->getPath().size() > 0 ? n->getPath().getLastElement()
42 : ""; // check if root of object
43 visitEnter(key, "dict", n->childrenSize());
44 }
45
46 void
48 {
49 visitExit();
50 }
51
52 void
54 {
56 const std::string key = n->getPath().getLastElement();
57 visitEnter(key, "list", n->childrenSize());
58 }
59
60 void
62 {
63 visitExit();
64 }
65
66 // Same for Dict and List
67 bool visitEnter(const std::string& key, const std::string& type, size_t size);
68 bool visitExit();
69
70 void
72 {
74 const std::string key = b->getPath().getLastElement();
75 this->addValueLabel(key, *aron::data::Bool::DynamicCastAndCheck(b), "bool");
76 }
77
78 void
80 {
82 const std::string key = d->getPath().getLastElement();
83 this->addValueLabel(key, *aron::data::Double::DynamicCastAndCheck(d), "double");
84 }
85
86 void
88 {
90 const std::string key = f->getPath().getLastElement();
91 this->addValueLabel(key, *aron::data::Float::DynamicCastAndCheck(f), "float");
92 }
93
94 void
96 {
98 const std::string key = i->getPath().getLastElement();
99 this->addValueLabel(key, *aron::data::Int::DynamicCastAndCheck(i), "int");
100 }
101
102 void
104 {
106 const std::string key = l->getPath().getLastElement();
107 this->addValueLabel(key, *aron::data::Long::DynamicCastAndCheck(l), "long");
108 }
109
110 void
111 visitString(const aron::data::VariantPtr& string) override
112 {
113 ARMARX_CHECK_NOT_NULL(string);
115 const std::string key = string->getPath().getLastElement();
116 this->addValueLabel(key, *s, "string");
117 }
118
119 void
121 {
123 const std::string key = array->getPath().getLastElement();
124 this->addValueLabel(key, *aron::data::NDArray::DynamicCastAndCheck(array), "ND Array");
125 }
126
127 void
128 visitUnknown(const aron::data::VariantPtr& unknown) override
129 {
130 ARMARX_IMPORTANT << "Unknown data encountered: "
131 << (unknown ? unknown->getFullName() : "nullptr");
132 }
133
134
135 private:
136 template <class DataT>
137 void
138 addValueLabel(const std::string& key, DataT& n, const std::string& typeName)
139 {
140 checkGroupsNotEmpty();
141 Group& g = groups.top();
142 g.layout.add(Label(key), {g.nextRow, 0})
143 .add(Label("(" + typeName + ")"), {g.nextRow, 1})
144 .add(Label("= " + getValueText(n)), {g.nextRow, 2});
145 ++g.nextRow;
146 }
147
148 template <class DataT>
149 std::string
150 getValueText(DataT& n)
151 {
152 std::stringstream ss;
153 streamValueText(n, ss);
154 return ss.str();
155 }
156
157 template <class DataT>
158 void
159 streamValueText(DataT& n, std::stringstream& ss)
160 {
161 ss << n.getValue();
162 }
163
164 void streamValueText(aron::data::String& n, std::stringstream& ss);
165 void streamValueText(aron::data::NDArray& n, std::stringstream& ss);
166
167 void checkGroupsNotEmpty() const;
168 };
169
170
171} // namespace armarx::armem::server
#define ARMARX_CHECK_NOT_NULL(ptr)
This macro evaluates whether ptr is not null and if it turns out to be false it will throw an Express...
#define ARMARX_IMPORTANT
The logging level for always important information, but expected behaviour (in contrast to ARMARX_WAR...
Definition Logging.h:190
std::shared_ptr< Variant > VariantPtr
constexpr auto n() noexcept
void visitDouble(const aron::data::VariantPtr &d) override
void visitDictOnEnter(const aron::data::VariantPtr &n) override
void visitInt(const aron::data::VariantPtr &i) override
void visitListOnExit(const aron::data::VariantPtr &) override
void visitString(const aron::data::VariantPtr &string) override
void visitNDArray(const aron::data::VariantPtr &array) override
void visitLong(const aron::data::VariantPtr &l) override
void visitBool(const aron::data::VariantPtr &b) override
void visitUnknown(const aron::data::VariantPtr &unknown) override
bool visitEnter(const std::string &key, const std::string &type, size_t size)
void visitFloat(const aron::data::VariantPtr &f) override
armarx::RemoteGui::Client::GridLayout GridLayout
void visitDictOnExit(const aron::data::VariantPtr &) override
void visitListOnEnter(const aron::data::VariantPtr &n) override