Ember
Loading...
Searching...
No Matches
Node.h
Go to the documentation of this file.
1#pragma once
2
3#include "Types/Types.h"
4#include <cstdint>
5#include <functional>
6#include <map>
7#include <memory>
8#include <vector>
9
10namespace EmberCore {
11
20class Node {
21 public:
25 enum class Type {
27 Action, // Leaf nodes that perform actions
28 Control, // Control flow nodes (sequence, selector, parallel)
29 Condition, // Condition/decorator nodes
30 Decorator, // Modifier nodes that alter child behavior
31 BehaviorTree // BehaviorTree definition node (visual wrapper)
32 };
33
37 enum class Status {
38 Idle, // Not yet executed
39 Running, // Currently executing
40 Success, // Execution completed successfully
41 Failure // Execution failed
42 };
43
48
49 public:
50 // Construction and destruction
51 explicit Node(const String &name, Type type = Type::None);
52 virtual ~Node();
53
54 // Copy operations
55 Node(const Node &other) = delete;
56 Node &operator=(const Node &other) = delete;
57
58 // Move operations
59 Node(Node &&other) noexcept;
60 Node &operator=(Node &&other) noexcept;
61
62 // Core node operations
63 void AddChild(std::unique_ptr<Node> child);
64 void RemoveChild(size_t index);
65 void RemoveChild(Node *child);
66 std::unique_ptr<Node> DetachChild(size_t index);
67 std::unique_ptr<Node> DetachChild(Node *child);
68
69 // Deep copy functionality
70 std::unique_ptr<Node> DeepCopy() const;
71
72 // Tree traversal and queries
73 Node *FindChild(const String &name) const;
74 Node *FindChildById(size_t id) const;
75 Node *GetParent() const { return parent_; }
76 size_t GetChildCount() const { return children_.size(); }
77 Node *GetChild(size_t index) const;
78
79 // Node properties
80 size_t GetId() const { return id_; }
81 const String &GetName() const { return name_; }
82 void SetName(const String &name) { name_ = name; }
83
84 Type GetType() const { return type_; }
85 void SetType(Type type) { type_ = type; }
86
87 Status GetStatus() const { return status_; }
88 void SetStatus(Status status) { status_ = status; }
89
90 // Visual properties
91 const Point &GetPosition() const { return position_; }
92 void SetPosition(const Point &position) { position_ = position; }
93
95 void SetVisualState(VisualState state) { visual_state_ = state; }
96
97 bool AreChildrenVisible() const { return children_visible_; }
98 void SetChildrenVisible(bool visible) { children_visible_ = visible; }
100
101 // Layout and rendering support
102 int GetChildrenWidth() const { return children_width_; }
103 void SetChildrenWidth(int width) { children_width_ = width; }
104 int CalculateSubtreeWidth(int node_width, int horizontal_spacing) const;
105
106 // Tree validation and integrity
107 bool IsValid() const;
108 bool HasCycles() const;
109 size_t GetDepth() const;
110 size_t GetSubtreeNodeCount() const;
111
112 // Visitor pattern support
113 void Accept(std::function<void(Node *)> visitor);
114 void Accept(std::function<void(const Node *)> visitor) const;
115
116 // Utility functions
117 String GetTypeString() const;
118 String GetStatusString() const;
119 std::vector<Node *> GetAllChildren();
120 std::vector<const Node *> GetAllChildren() const;
121
122 // Custom attributes support (for XML properties)
123 void SetAttribute(const String &name, const String &value);
124 String GetAttribute(const String &name, const String &default_value = "") const;
125 bool HasAttribute(const String &name) const;
126 void RemoveAttribute(const String &name);
127 const std::map<String, String> &GetAllAttributes() const;
128 size_t GetAttributeCount() const;
129
130 // Debug and serialization support
131 String ToString() const;
132 void PrintTree(int indent = 0) const;
133
134 protected:
135 // Virtual methods for extensibility
136 virtual std::unique_ptr<Node> CreateCopy() const;
137 virtual void OnChildAdded(Node *child);
138 virtual void OnChildRemoved(Node *child);
139
140 private:
141 // Core properties
145 size_t id_;
146
147 // Tree structure
148 std::vector<std::unique_ptr<Node>> children_;
150
151 // Visual properties
156
157 // Custom attributes (for XML properties and user data)
158 std::map<String, String> custom_attributes_;
159
160 // Static ID counter
161 static size_t next_id_;
162
163 // Helper methods
164 void SetParent(Node *parent) { parent_ = parent; }
165 bool HasCyclesHelper(std::vector<const Node *> &visited) const;
166 size_t FindChildIndex(Node *child) const;
167
168 friend class NodeFactory;
169};
170
175 public:
176 static std::unique_ptr<Node> CreateActionNode(const String &name);
177 static std::unique_ptr<Node> CreateControlNode(const String &name);
178 static std::unique_ptr<Node> CreateConditionNode(const String &name);
179 static std::unique_ptr<Node> CreateDecoratorNode(const String &name);
180
181 // Create node from type enum
182 static std::unique_ptr<Node> CreateNode(const String &name, Node::Type type);
183
184 // Create a sample behavior tree for testing
185 static std::unique_ptr<Node> CreateSampleTree();
186};
187
188} // namespace EmberCore
Factory class for creating different types of nodes.
Definition Node.h:174
static std::unique_ptr< Node > CreateConditionNode(const String &name)
Definition Node.cpp:408
static std::unique_ptr< Node > CreateSampleTree()
Definition Node.cpp:420
static std::unique_ptr< Node > CreateNode(const String &name, Node::Type type)
Definition Node.cpp:416
static std::unique_ptr< Node > CreateActionNode(const String &name)
Definition Node.cpp:400
static std::unique_ptr< Node > CreateControlNode(const String &name)
Definition Node.cpp:404
static std::unique_ptr< Node > CreateDecoratorNode(const String &name)
Definition Node.cpp:412
Represents a node in a behavior tree structure.
Definition Node.h:20
void SetType(Type type)
Definition Node.h:85
virtual std::unique_ptr< Node > CreateCopy() const
Definition Node.cpp:344
bool HasAttribute(const String &name) const
Definition Node.cpp:456
void ToggleChildrenVisibility()
Definition Node.h:99
Node(const String &name, Type type=Type::None)
Definition Node.cpp:12
String GetStatusString() const
Definition Node.cpp:290
virtual ~Node()
Definition Node.cpp:17
Status
Node status for runtime execution tracking.
Definition Node.h:37
std::map< String, String > custom_attributes_
Definition Node.h:158
Node * parent_
Definition Node.h:149
virtual void OnChildAdded(Node *child)
Definition Node.cpp:362
void RemoveChild(size_t index)
Definition Node.cpp:103
void PrintTree(int indent=0) const
Definition Node.cpp:332
void SetName(const String &name)
Definition Node.h:82
void SetVisualState(VisualState state)
Definition Node.h:95
const std::map< String, String > & GetAllAttributes() const
Definition Node.cpp:462
VisualState
Visual state for UI rendering.
Definition Node.h:47
Status GetStatus() const
Definition Node.h:87
size_t GetSubtreeNodeCount() const
Definition Node.cpp:246
VisualState visual_state_
Definition Node.h:153
size_t GetAttributeCount() const
Definition Node.cpp:464
void SetPosition(const Point &position)
Definition Node.h:92
std::vector< std::unique_ptr< Node > > children_
Definition Node.h:148
Status status_
Definition Node.h:144
size_t id_
Definition Node.h:145
void SetChildrenVisible(bool visible)
Definition Node.h:98
Point position_
Definition Node.h:152
String GetAttribute(const String &name, const String &default_value="") const
Definition Node.cpp:451
Node * GetChild(size_t index) const
Definition Node.cpp:175
VisualState GetVisualState() const
Definition Node.h:94
bool HasCyclesHelper(std::vector< const Node * > &visited) const
Definition Node.cpp:373
Node * GetParent() const
Definition Node.h:75
String GetTypeString() const
Definition Node.cpp:274
int GetChildrenWidth() const
Definition Node.h:102
Type
Node types for behavior tree classification.
Definition Node.h:25
bool HasCycles() const
Definition Node.cpp:231
virtual void OnChildRemoved(Node *child)
Definition Node.cpp:367
void Accept(std::function< void(Node *)> visitor)
Definition Node.cpp:254
static size_t next_id_
Definition Node.h:161
Node(const Node &other)=delete
Node * FindChild(const String &name) const
Definition Node.cpp:163
bool children_visible_
Definition Node.h:154
size_t GetId() const
Definition Node.h:80
String ToString() const
Definition Node.cpp:327
Type GetType() const
Definition Node.h:84
const String & GetName() const
Definition Node.h:81
void SetAttribute(const String &name, const String &value)
Definition Node.cpp:444
void RemoveAttribute(const String &name)
Definition Node.cpp:460
String name_
Definition Node.h:142
std::vector< Node * > GetAllChildren()
Definition Node.cpp:304
std::unique_ptr< Node > DetachChild(size_t index)
Definition Node.cpp:123
size_t FindChildIndex(Node *child) const
Definition Node.cpp:390
void SetChildrenWidth(int width)
Definition Node.h:103
bool IsValid() const
Definition Node.cpp:205
const Point & GetPosition() const
Definition Node.h:91
Node * FindChildById(size_t id) const
Definition Node.cpp:169
void AddChild(std::unique_ptr< Node > child)
Definition Node.cpp:77
Node & operator=(const Node &other)=delete
void SetParent(Node *parent)
Definition Node.h:164
int CalculateSubtreeWidth(int node_width, int horizontal_spacing) const
Definition Node.cpp:183
friend class NodeFactory
Definition Node.h:168
bool AreChildrenVisible() const
Definition Node.h:97
size_t GetChildCount() const
Definition Node.h:76
void SetStatus(Status status)
Definition Node.h:88
size_t GetDepth() const
Definition Node.cpp:236
int children_width_
Definition Node.h:155
std::unique_ptr< Node > DeepCopy() const
Definition Node.cpp:149
Main types header for EmberCore.
std::string String
Framework-agnostic string type.
Definition String.h:14
2D point with integer coordinates
Definition Geometry.h:8