1 #ifndef GRAIL_BLACKBOARD_H
2 #define GRAIL_BLACKBOARD_H
5 #include "../GrailLogger/LoggerManager.hh"
24 friend bool operator == (
const UnsafeAny& first,
const UnsafeAny& second);
47 std::function<
const std::any&(
const std::any&,
const std::any&)> firstStrategy =
49 std::function<
const std::any&(
const std::any&,
const std::any&)> secondStrategy =
53 std::function<
const UnsafeAny&(
const UnsafeAny&,
const UnsafeAny&)> firstStrategy =
OursStrategy,
54 std::function<
const UnsafeAny&(
const UnsafeAny&,
const UnsafeAny&)> secondStrategy =
OursStrategy);
64 static const std::any&
OursStrategy(
const std::any& ours,
const std::any& theirs);
66 static const UnsafeAny&
OursStrategy(
const UnsafeAny& ours,
const UnsafeAny& theirs);
76 static const std::any&
TheirsStrategy(
const std::any& ours,
const std::any& theirs);
78 static const UnsafeAny&
TheirsStrategy(
const UnsafeAny& ours,
const UnsafeAny& theirs);
88 std::function<
const std::any&(
const std::any&,
const std::any&)> mergeStrategy =
OursStrategy);
90 void Merge(
const Blackboard& other, std::function<
const UnsafeAny&(
const UnsafeAny&,
const UnsafeAny&)> mergeStrategy =
OursStrategy);
112 template <
typename T>
118 void SetValue(
const std::string& key,
const T& value)
120 std::lock_guard<std::mutex> lock{mutex};
122 std::any any = value;
125 auto deleter = [](
void* memory)
127 T* dataPointer =
static_cast<T*
>(memory);
130 auto cloner = [](
void* memory)
132 T* dataPointer =
static_cast<T*
>(memory);
133 return new T{*dataPointer};
136 data[key] = UnsafeAny(
new T{value}, deleter, cloner);
140 template <typename T, std::enable_if_t<!std::is_reference<T>::value>* =
nullptr>
148 std::lock_guard<std::mutex> lock{mutex};
150 data[key] = std::any{value};
152 auto deleter = [](
void* memory)
154 T* dataPointer =
static_cast<T*
>(memory);
157 auto cloner = [](
void* memory)
159 T* dataPointer =
static_cast<T*
>(memory);
160 return new T{*dataPointer};
162 data[key] = UnsafeAny(
new T{value}, deleter, cloner);
166 template <
typename T>
173 std::lock_guard<std::mutex> lock{mutex};
175 data[key] = std::any{T{}};
177 auto deleter = [](
void* memory)
179 T* dataPointer =
static_cast<T*
>(memory);
182 auto cloner = [](
void* memory)
184 T* dataPointer =
static_cast<T*
>(memory);
185 return new T{*dataPointer};
187 data[key] = UnsafeAny(
new T{}, deleter, cloner);
191 template <
typename T>
199 std::lock_guard<std::mutex> lock{mutex};
200 auto iterator = data.find(key);
201 if(iterator == data.end())
203 GRAIL_LOG(consts::DEFAULT_GRAIL_LOG_GROUP, Severity::CRITICAL,
"Invalid key (" + key +
")");
206 return std::any_cast<const T&>(iterator->second);
208 return *
static_cast<T*
>(iterator->second.GetDataPointer());
212 template <
typename T>
220 std::lock_guard<std::mutex> lock{mutex};
222 return std::any_cast<T&>(data[key]);
224 auto iterator = data.find(key);
225 if(iterator == data.end())
227 auto deleter = [](
void* memory)
229 T* dataPointer =
static_cast<T*
>(memory);
232 auto cloner = [](
void* memory)
234 T* dataPointer =
static_cast<T*
>(memory);
235 return new T{*dataPointer};
237 iterator = data.emplace(std::piecewise_construct, std::forward_as_tuple(key),
238 std::forward_as_tuple(
new T{}, deleter, cloner)).first;
240 return *
static_cast<T*
>(iterator->second.GetDataPointer());
244 template <
typename T>
253 std::lock_guard<std::mutex> lock{mutex};
254 auto iter = data.find(key);
255 if(iter != data.end())
258 outValue = std::any_cast<T>(iter->second);
260 outValue = *
static_cast<T*
>(iter->second.GetDataPointer());
267 void AddDataToNameMap(std::map<std::string, std::string>& outMap)
const;
271 std::map<std::string, std::any> data{};
275 friend bool operator == (
const UnsafeAny& first,
const UnsafeAny& second);
278 UnsafeAny() =
default;
279 UnsafeAny(
void* dataPointer, std::function<
void(
void*)> deleter, std::function<
void*(
void*)> cloner);
281 UnsafeAny(
const UnsafeAny& other);
282 UnsafeAny(UnsafeAny&& other);
286 UnsafeAny& operator = (
const UnsafeAny& other);
287 UnsafeAny& operator = (UnsafeAny&& other);
289 void* GetDataPointer()
const;
292 void* dataPointer{
nullptr};
293 std::function<void(
void*)> deleter{[](
void*){}};
294 std::function<
void*(
void*)> cloner{[](
void*){
return nullptr; }};
297 std::map<std::string, UnsafeAny> data{};
299 mutable std::mutex mutex{};
303 #endif //GRAIL_BLACKBOARD_H