Ember
Loading...
Searching...
No Matches
DirectTreeAdapter.cpp
Go to the documentation of this file.
2#include <algorithm>
3
4namespace EmberCore {
5
6DirectTreeAdapter::DirectTreeAdapter(std::shared_ptr<BehaviorTree> tree) : behavior_tree_(tree) {}
7
10 return nullptr;
11
13 return root_adapter_.get();
14}
15
17 static EmberCore::String defaultName = "Direct Tree";
18 return behavior_tree_ ? behavior_tree_->GetName() : defaultName;
19}
20
22 static EmberCore::String emptyDesc = "Empty tree";
23 return behavior_tree_ ? behavior_tree_->GetDescription() : emptyDesc;
24}
25
26size_t DirectTreeAdapter::GetNodeCount() const { return behavior_tree_ ? behavior_tree_->GetNodeCount() : 0; }
27
28size_t DirectTreeAdapter::GetMaxDepth() const { return behavior_tree_ ? behavior_tree_->GetMaxDepth() : 0; }
29
31 if (!behavior_tree_)
32 return nullptr;
33
34 // Use BehaviorTree's optimized node lookup
35 Node *found = behavior_tree_->FindNodeById(id);
36 return found ? GetOrCreateNodeAdapter(found) : nullptr;
37}
38
40 if (!behavior_tree_)
41 return nullptr;
42
43 // Use BehaviorTree's node lookup
44 Node *found = behavior_tree_->FindNodeByName(name);
45 return found ? GetOrCreateNodeAdapter(found) : nullptr;
46}
47
48std::vector<ITreeNode *> DirectTreeAdapter::FindNodesByType(ITreeNode::NodeType type) const {
49 std::vector<ITreeNode *> result;
50 if (!behavior_tree_)
51 return result;
52
53 Node::Type convertedType = ConvertNodeType(type);
54 std::vector<Node *> nodes = behavior_tree_->FindNodesByType(convertedType);
55
56 result.reserve(nodes.size());
57 std::transform(nodes.begin(), nodes.end(), std::back_inserter(result),
58 [this](Node *node) { return GetOrCreateNodeAdapter(node); });
59
60 return result;
61}
62
63void DirectTreeAdapter::TraverseNodes(std::function<void(ITreeNode *)> visitor) {
64 if (!behavior_tree_)
65 return;
66
67 behavior_tree_->TraverseNodes([&](Node *node) {
68 if (node) {
69 visitor(GetOrCreateNodeAdapter(node));
70 }
71 });
72}
73
74void DirectTreeAdapter::TraverseNodes(std::function<void(const ITreeNode *)> visitor) const {
75 if (!behavior_tree_)
76 return;
77
78 behavior_tree_->TraverseNodes([&](const Node *node) {
79 if (node) {
80 visitor(GetOrCreateNodeAdapter(const_cast<Node *>(node)));
81 }
82 });
83}
84
86 // Simple validation - tree is valid if it has a root
87 return behavior_tree_ && behavior_tree_->HasRootNode();
88}
89
91 // For now, assume no cycles (BehaviorTree doesn't implement cycle detection yet)
92 return false;
93}
94
95std::vector<ITreeNode *> DirectTreeAdapter::GetAllNodes() {
96 std::vector<ITreeNode *> result;
97 TraverseNodes([&](ITreeNode *node) { result.push_back(node); });
98 return result;
99}
100
101std::vector<const ITreeNode *> DirectTreeAdapter::GetAllNodes() const {
102 std::vector<const ITreeNode *> result;
103 TraverseNodes([&](const ITreeNode *node) { result.push_back(node); });
104 return result;
105}
106
108 return behavior_tree_ ? behavior_tree_->GetTreeStructure() : EmberCore::String("Empty tree");
109}
110
112 if (behavior_tree_) {
113 behavior_tree_->PrintTree();
114 }
115}
116
117// Helper methods
132
147
150 Node *root = behavior_tree_->GetRootNode();
151 if (root) {
152 root_adapter_ = std::make_unique<NodeAdapter>(root);
153 }
154 }
155}
156
158 if (!node)
159 return nullptr;
160
161 auto it = node_adapter_cache_.find(node);
162 if (it == node_adapter_cache_.end()) {
163 auto adapter = std::make_unique<NodeAdapter>(node);
164 NodeAdapter *result = adapter.get();
165 node_adapter_cache_[node] = std::move(adapter);
166 return result;
167 }
168 return it->second.get();
169}
170
171} // namespace EmberCore
std::shared_ptr< BehaviorTree > behavior_tree_
EmberCore::String GetTreeStructure() const override
void TraverseNodes(std::function< void(ITreeNode *)> visitor) override
std::vector< ITreeNode * > FindNodesByType(ITreeNode::NodeType type) const override
ITreeNode * GetRootNode() const override
ITreeNode * FindNodeByName(const EmberCore::String &name) const override
DirectTreeAdapter(std::shared_ptr< BehaviorTree > tree)
Constructor that wraps a BehaviorTree.
NodeAdapter * GetOrCreateNodeAdapter(Node *node) const
ITreeNode::NodeType ConvertNodeType(Node::Type type) const
const EmberCore::String & GetName() const override
const EmberCore::String & GetDescription() const override
std::unique_ptr< NodeAdapter > root_adapter_
bool HasCycles() const override
std::unordered_map< Node *, std::unique_ptr< NodeAdapter > > node_adapter_cache_
ITreeNode * FindNodeById(size_t id) const override
size_t GetMaxDepth() const override
std::vector< ITreeNode * > GetAllNodes() override
size_t GetNodeCount() const override
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
Main types header for EmberCore.
std::string String
Framework-agnostic string type.
Definition String.h:14