Ember
Loading...
Searching...
No Matches
BlackboardEntry.cpp
Go to the documentation of this file.
2#include "Utils/Logger.h"
3#include <algorithm>
4#include <cctype>
5
6namespace EmberCore {
7
9 : key_(key), type_(type), value_(value) {}
10
12
14 EmberCore::String lower = typeStr;
15 std::transform(lower.begin(), lower.end(), lower.begin(), ::tolower);
16
17 // Basic types
18 if (lower == "bool")
19 return DataType::BOOL;
20 if (lower == "int")
21 return DataType::INT;
22 if (lower == "int8_t")
23 return DataType::INT8;
24 if (lower == "uint8_t")
25 return DataType::UINT8;
26 if (lower == "uint32_t")
27 return DataType::UINT32;
28 if (lower == "size_t")
29 return DataType::SIZE_T;
30 if (lower == "float")
31 return DataType::FLOAT;
32 if (lower == "string")
33 return DataType::STRING;
34 if (lower == "currency")
35 return DataType::CURRENCY;
36 if (lower == "auto")
37 return DataType::AUTO;
38
39 // Vector types - basic
40 if (lower == "vec(int)")
41 return DataType::VEC_INT;
42 if (lower == "vec(int8_t)")
43 return DataType::VEC_INT8;
44 if (lower == "vec(uint8_t)")
46 if (lower == "vec(uint32_t)")
48 if (lower == "vec(float)")
50 if (lower == "vec(string)")
52 if (lower == "vec(currency)")
54
55 // Nested vector types
56 if (lower == "vec(vec(uint8_t))")
58 if (lower == "vec(vec(uint32_t))")
60 if (lower == "vec(pair(float, float))" || lower == "vec(pair(float,float))")
62
63 // Pair types
64 if (lower == "pair(float, float)" || lower == "pair(float,float)")
66 if (lower == "pair(int, int)" || lower == "pair(int,int)")
67 return DataType::PAIR_INT;
68 if (lower == "pair(string, string)" || lower == "pair(string,string)")
70
71 // Map types
72 if (lower == "map(string, string)" || lower == "map(string,string)")
74 if (lower == "map(string, int)" || lower == "map(string,int)")
76
77 // Set types
78 if (lower == "set(string)" || lower == "set")
80 if (lower == "set(int)")
81 return DataType::SET_INT;
82 if (lower == "set(uint32_t)")
84
85 LOG_WARNING("Blackboard", "Unknown data type: " + typeStr);
86 return DataType::UNKNOWN;
87}
88
90 switch (type) {
91 case DataType::BOOL:
92 return "bool";
93 case DataType::INT:
94 return "int";
95 case DataType::INT8:
96 return "int8_t";
97 case DataType::UINT8:
98 return "uint8_t";
100 return "uint32_t";
101 case DataType::SIZE_T:
102 return "size_t";
103 case DataType::FLOAT:
104 return "float";
105 case DataType::STRING:
106 return "string";
108 return "Currency";
109 case DataType::AUTO:
110 return "auto";
112 return "vec(int)";
114 return "vec(int8_t)";
116 return "vec(uint8_t)";
118 return "vec(uint32_t)";
120 return "vec(float)";
122 return "vec(string)";
124 return "vec(Currency)";
126 return "vec(vec(uint8_t))";
128 return "vec(vec(uint32_t))";
130 return "vec(pair(float, float))";
132 return "pair(float, float)";
134 return "pair(int, int)";
136 return "pair(string, string)";
138 return "map(string, string)";
140 return "map(string, int)";
142 return "set(string)";
144 return "set(int)";
146 return "set(uint32_t)";
148 return "unknown";
149 default:
150 return "unknown";
151 }
152}
153
155 if (type_ == DataType::AUTO) {
156 return true; // AUTO type can have any value or no value
157 }
158
159 if (value_.empty()) {
160 return type_ == DataType::AUTO; // Only AUTO can have empty values
161 }
162
163 // TODO: Add more sophisticated validation based on type
164 // For now, just check that non-AUTO types have values
165 return true;
166}
167
168// Blackboard implementation
169
171
172void Blackboard::AddEntry(std::unique_ptr<BlackboardEntry> entry) {
173 if (!entry) {
174 LOG_ERROR("Blackboard", "Cannot add null entry to blackboard");
175 return;
176 }
177
178 EmberCore::String key = entry->GetKey();
179 if (key.empty()) {
180 LOG_ERROR("Blackboard", "Cannot add entry with empty key to blackboard");
181 return;
182 }
183
184 entries_[key] = std::move(entry);
185 LOG_TRACE("Blackboard", "Added entry '" + key + "' to blackboard '" + id_ + "'");
186}
187
189 const EmberCore::String &value) {
190 auto entry = std::make_unique<BlackboardEntry>(key, type, value);
191 AddEntry(std::move(entry));
192}
193
195 auto it = entries_.find(key);
196 return (it != entries_.end()) ? it->second.get() : nullptr;
197}
198
200 auto it = entries_.find(key);
201 return (it != entries_.end()) ? it->second.get() : nullptr;
202}
203
204bool Blackboard::HasEntry(const EmberCore::String &key) const { return entries_.find(key) != entries_.end(); }
205
207 auto it = entries_.find(key);
208 if (it != entries_.end()) {
209 entries_.erase(it);
210 LOG_TRACE("Blackboard", "Removed entry '" + key + "' from blackboard '" + id_ + "'");
211 }
212}
213
215 entries_.clear();
216 LOG_TRACE("Blackboard", "Cleared all entries from blackboard '" + id_ + "'");
217}
218
219std::unique_ptr<Blackboard> Blackboard::Clone() const {
220 auto clone = std::make_unique<Blackboard>(id_);
221 clone->SetParentId(parent_id_);
222
223 // Clone all entries
224 for (const auto &entry_pair : entries_) {
225 const BlackboardEntry *original_entry = entry_pair.second.get();
226 auto cloned_entry = std::make_unique<BlackboardEntry>(original_entry->GetKey(), original_entry->GetType(),
227 original_entry->GetValue());
228 clone->AddEntry(std::move(cloned_entry));
229 }
230
231 return clone;
232}
233
234} // namespace EmberCore
#define LOG_ERROR(category, message)
Definition Logger.h:116
#define LOG_TRACE(category, message)
Definition Logger.h:113
#define LOG_WARNING(category, message)
Definition Logger.h:115
Represents a single entry in a behavior tree blackboard.
const EmberCore::String & GetValue() const
static DataType ParseDataType(const EmberCore::String &typeStr)
EmberCore::String GetTypeString() const
static EmberCore::String DataTypeToString(DataType type)
const EmberCore::String & GetKey() const
DataType
Supported data types for blackboard entries.
bool HasEntry(const EmberCore::String &key) const
BlackboardEntry * GetEntry(const EmberCore::String &key)
void AddEntry(std::unique_ptr< BlackboardEntry > entry)
EmberCore::String parent_id_
void RemoveEntry(const EmberCore::String &key)
std::map< EmberCore::String, std::unique_ptr< BlackboardEntry > > entries_
std::unique_ptr< Blackboard > Clone() const
EmberCore::String id_
Main types header for EmberCore.
std::string String
Framework-agnostic string type.
Definition String.h:14