3 #ifndef GRAIL_BLACKBOARD_H
4 #define GRAIL_BLACKBOARD_H
7 #include "../GrailLogger/LoggerManager.hh"
26 friend bool operator == (
const UnsafeAny& first,
const UnsafeAny& second);
49 std::function<
const std::any&(
const std::any&,
const std::any&)> firstStrategy =
51 std::function<
const std::any&(
const std::any&,
const std::any&)> secondStrategy =
55 std::function<
const UnsafeAny&(
const UnsafeAny&,
const UnsafeAny&)> firstStrategy =
OursStrategy,
56 std::function<
const UnsafeAny&(
const UnsafeAny&,
const UnsafeAny&)> secondStrategy =
OursStrategy);
66 static const std::any&
OursStrategy(
const std::any& ours,
const std::any& theirs);
68 static const UnsafeAny&
OursStrategy(
const UnsafeAny& ours,
const UnsafeAny& theirs);
78 static const std::any&
TheirsStrategy(
const std::any& ours,
const std::any& theirs);
80 static const UnsafeAny&
TheirsStrategy(
const UnsafeAny& ours,
const UnsafeAny& theirs);
90 std::function<
const std::any&(
const std::any&,
const std::any&)> mergeStrategy =
OursStrategy);
92 void Merge(
const Blackboard& other, std::function<
const UnsafeAny&(
const UnsafeAny&,
const UnsafeAny&)> mergeStrategy =
OursStrategy);
114 template <
typename T>
120 void SetValue(
const std::string& key,
const T& value)
122 std::lock_guard<std::mutex> lock{mutex};
124 std::any any = value;
127 auto deleter = [](
void* memory)
129 T* dataPointer =
static_cast<T*
>(memory);
132 auto cloner = [](
void* memory)
134 T* dataPointer =
static_cast<T*
>(memory);
135 return new T{*dataPointer};
138 data[key] = UnsafeAny(
new T{value}, deleter, cloner);
142 template <typename T, std::enable_if_t<!std::is_reference<T>::value>* =
nullptr>
150 std::lock_guard<std::mutex> lock{mutex};
152 data[key] = std::any{value};
154 auto deleter = [](
void* memory)
156 T* dataPointer =
static_cast<T*
>(memory);
159 auto cloner = [](
void* memory)
161 T* dataPointer =
static_cast<T*
>(memory);
162 return new T{*dataPointer};
164 data[key] = UnsafeAny(
new T{value}, deleter, cloner);
168 template <
typename T>
175 std::lock_guard<std::mutex> lock{mutex};
177 data[key] = std::any{T{}};
179 auto deleter = [](
void* memory)
181 T* dataPointer =
static_cast<T*
>(memory);
184 auto cloner = [](
void* memory)
186 T* dataPointer =
static_cast<T*
>(memory);
187 return new T{*dataPointer};
189 data[key] = UnsafeAny(
new T{}, deleter, cloner);
193 template <
typename T>
201 std::lock_guard<std::mutex> lock{mutex};
202 auto iterator = data.find(key);
203 if(iterator == data.end())
205 GRAIL_LOG(consts::DEFAULT_GRAIL_LOG_GROUP, logger::Severity::CRITICAL,
"Invalid key (" + key +
")");
208 return std::any_cast<const T&>(iterator->second);
210 return *
static_cast<T*
>(iterator->second.GetDataPointer());
214 template <
typename T>
222 std::lock_guard<std::mutex> lock{mutex};
224 return std::any_cast<T&>(data[key]);
226 auto iterator = data.find(key);
227 if(iterator == data.end())
229 auto deleter = [](
void* memory)
231 T* dataPointer =
static_cast<T*
>(memory);
234 auto cloner = [](
void* memory)
236 T* dataPointer =
static_cast<T*
>(memory);
237 return new T{*dataPointer};
239 iterator = data.emplace(std::piecewise_construct, std::forward_as_tuple(key),
240 std::forward_as_tuple(
new T{}, deleter, cloner)).first;
242 return *
static_cast<T*
>(iterator->second.GetDataPointer());
246 template <
typename T>
255 std::lock_guard<std::mutex> lock{mutex};
256 auto iter = data.find(key);
257 if(iter != data.end())
260 outValue = std::any_cast<T>(iter->second);
262 outValue = *
static_cast<T*
>(iter->second.GetDataPointer());
269 void AddDataToNameMap(std::map<std::string, std::string>& outMap)
const;
273 std::map<std::string, std::any> data{};
277 friend bool operator == (
const UnsafeAny& first,
const UnsafeAny& second);
280 UnsafeAny() =
default;
281 UnsafeAny(
void* dataPointer, std::function<
void(
void*)> deleter, std::function<
void*(
void*)> cloner);
283 UnsafeAny(
const UnsafeAny& other);
284 UnsafeAny(UnsafeAny&& other);
288 UnsafeAny& operator = (
const UnsafeAny& other);
289 UnsafeAny& operator = (UnsafeAny&& other);
291 void* GetDataPointer()
const;
294 void* dataPointer{
nullptr};
295 std::function<void(
void*)> deleter{[](
void*){}};
296 std::function<
void*(
void*)> cloner{[](
void*){
return nullptr; }};
299 std::map<std::string, UnsafeAny> data{};
301 mutable std::mutex mutex{};
305 #endif //GRAIL_BLACKBOARD_H