Ember
Loading...
Searching...
No Matches
TCPTreeAdapter.cpp
Go to the documentation of this file.
2
3namespace Ember {
4namespace Network {
5
6TCPTreeAdapter::TCPTreeAdapter(std::shared_ptr<EmberCore::BehaviorTree> tree,
7 std::shared_ptr<StateManager> state_manager)
8 : m_tree(std::move(tree)), m_stateManager(std::move(state_manager)) {}
9
11 if (!m_tree || !m_tree->HasRootNode()) {
12 return nullptr;
13 }
14
17 }
18
19 return m_rootAdapter;
20}
21
23 static EmberCore::String empty;
24 if (!m_tree) {
25 return empty;
26 }
27 return m_tree->GetName();
28}
29
31 static EmberCore::String empty;
32 if (!m_tree) {
33 return empty;
34 }
35 return m_tree->GetDescription();
36}
37
39 if (!m_tree) {
40 return 0;
41 }
42 return m_tree->GetNodeCount();
43}
44
46 if (!m_tree) {
47 return 0;
48 }
49 return m_tree->GetMaxDepth();
50}
51
53 if (!m_tree) {
54 return nullptr;
55 }
56
59 }
60
61 auto it = m_adapters.find(id);
62 if (it != m_adapters.end()) {
63 return it->second.get();
64 }
65
66 return nullptr;
67}
68
70 if (!m_tree) {
71 return nullptr;
72 }
73
74 EmberCore::Node *node = m_tree->FindNodeByName(name);
75 if (!node) {
76 return nullptr;
77 }
78
79 return GetOrCreateAdapter(node);
80}
81
82std::vector<EmberCore::ITreeNode *> TCPTreeAdapter::FindNodesByType(EmberCore::ITreeNode::NodeType type) const {
83 std::vector<EmberCore::ITreeNode *> result;
84
85 if (!m_tree) {
86 return result;
87 }
88
89 EmberCore::Node::Type coreType;
90 switch (type) {
93 break;
96 break;
99 break;
102 break;
105 break;
106 default:
108 break;
109 }
110
111 auto nodes = m_tree->FindNodesByType(coreType);
112 result.reserve(nodes.size());
113
114 for (auto *node : nodes) {
115 auto *adapter = GetOrCreateAdapter(node);
116 if (adapter) {
117 result.push_back(adapter);
118 }
119 }
120
121 return result;
122}
123
124void TCPTreeAdapter::TraverseNodes(std::function<void(EmberCore::ITreeNode *)> visitor) {
125 if (!m_tree || !visitor) {
126 return;
127 }
128
129 m_tree->TraverseNodes([this, &visitor](EmberCore::Node *node) {
130 auto *adapter = GetOrCreateAdapter(node);
131 if (adapter) {
132 visitor(adapter);
133 }
134 });
135}
136
137void TCPTreeAdapter::TraverseNodes(std::function<void(const EmberCore::ITreeNode *)> visitor) const {
138 if (!m_tree || !visitor) {
139 return;
140 }
141
142 m_tree->TraverseNodes([this, &visitor](const EmberCore::Node *node) {
143 auto *adapter = GetOrCreateAdapter(const_cast<EmberCore::Node *>(node));
144 if (adapter) {
145 visitor(adapter);
146 }
147 });
148}
149
151 if (!m_tree) {
152 return false;
153 }
154 return m_tree->IsValid();
155}
156
158 if (!m_tree) {
159 return false;
160 }
161 return m_tree->HasCycles();
162}
163
164std::vector<EmberCore::ITreeNode *> TCPTreeAdapter::GetAllNodes() {
165 std::vector<EmberCore::ITreeNode *> result;
166
167 if (!m_tree) {
168 return result;
169 }
170
171 auto nodes = m_tree->GetAllNodes();
172 result.reserve(nodes.size());
173
174 for (auto *node : nodes) {
175 auto *adapter = GetOrCreateAdapter(node);
176 if (adapter) {
177 result.push_back(adapter);
178 }
179 }
180
181 return result;
182}
183
184std::vector<const EmberCore::ITreeNode *> TCPTreeAdapter::GetAllNodes() const {
185 std::vector<const EmberCore::ITreeNode *> result;
186
187 if (!m_tree) {
188 return result;
189 }
190
191 auto nodes = m_tree->GetAllNodes();
192 result.reserve(nodes.size());
193
194 for (auto *node : nodes) {
195 auto *adapter = GetOrCreateAdapter(const_cast<EmberCore::Node *>(node));
196 if (adapter) {
197 result.push_back(adapter);
198 }
199 }
200
201 return result;
202}
203
205 if (!m_tree) {
206 return "";
207 }
208 return m_tree->GetTreeStructure();
209}
210
212 if (m_tree) {
213 m_tree->PrintTree();
214 }
215}
216
218 if (!m_stateManager) {
220 }
221 return m_stateManager->GetNodeStatus(static_cast<int64_t>(node_id));
222}
223
224bool TCPTreeAdapter::IsNodeInExecutionPath(size_t node_id) const {
225 if (!m_stateManager) {
226 return false;
227 }
228
229 const auto &path = m_stateManager->GetExecutionPath();
230 int64_t id = static_cast<int64_t>(node_id);
231
232 for (auto pathId : path) {
233 if (pathId == id) {
234 return true;
235 }
236 }
237
238 return false;
239}
240
242 if (!m_stateManager) {
243 return 0;
244 }
245 return m_stateManager->GetCurrentTick();
246}
247
249 if (!node) {
250 return nullptr;
251 }
252
253 size_t id = node->GetId();
254 auto it = m_adapters.find(id);
255
256 if (it != m_adapters.end()) {
257 return it->second.get();
258 }
259
260 auto adapter = std::make_unique<EmberCore::NodeAdapter>(node);
261 auto *ptr = adapter.get();
262 m_adapters[id] = std::move(adapter);
263
264 return ptr;
265}
266
269 return;
270 }
271
272 if (!m_tree || !m_tree->HasRootNode()) {
273 m_adapterCacheBuilt = true;
274 return;
275 }
276
277 m_rootAdapter = GetOrCreateAdapter(m_tree->GetRootNode());
278
279 m_tree->TraverseNodes([this](EmberCore::Node *node) { GetOrCreateAdapter(node); });
280
281 m_adapterCacheBuilt = true;
282}
283
284} // namespace Network
285} // namespace Ember
Abstract interface for tree nodes that can be visualized.
Definition ITreeNode.h:31
NodeType
Node types for visualization categorization.
Definition ITreeNode.h:36
Adapter class that wraps the current Node implementation to work with ITreeNode interface.
Definition NodeAdapter.h:16
Represents a node in a behavior tree structure.
Definition Node.h:20
Type
Node types for behavior tree classification.
Definition Node.h:25
size_t GetId() const
Definition Node.h:80
const EmberCore::String & GetName() const override
size_t GetNodeCount() const override
TCPTreeAdapter(std::shared_ptr< EmberCore::BehaviorTree > tree, std::shared_ptr< StateManager > state_manager)
const EmberCore::String & GetDescription() const override
EmberCore::NodeAdapter * GetOrCreateAdapter(EmberCore::Node *node) const
std::vector< EmberCore::ITreeNode * > GetAllNodes() override
Protocol::NodeStatus NodeStatus
bool HasCycles() const override
EmberCore::ITreeNode * GetRootNode() const override
EmberCore::ITreeNode * FindNodeById(size_t id) const override
NodeStatus GetNodeStatus(size_t node_id) const
std::shared_ptr< EmberCore::BehaviorTree > m_tree
void TraverseNodes(std::function< void(EmberCore::ITreeNode *)> visitor) override
EmberCore::ITreeNode * FindNodeByName(const EmberCore::String &name) const override
EmberCore::NodeAdapter * m_rootAdapter
size_t GetMaxDepth() const override
std::shared_ptr< StateManager > m_stateManager
EmberCore::String GetTreeStructure() const override
void PrintTree() const override
std::unordered_map< size_t, std::unique_ptr< EmberCore::NodeAdapter > > m_adapters
std::vector< EmberCore::ITreeNode * > FindNodesByType(EmberCore::ITreeNode::NodeType type) const override
bool IsNodeInExecutionPath(size_t node_id) const
std::string String
Framework-agnostic string type.
Definition String.h:14