1 #ifndef GRAIL_BLACKBOARD_H
2 #define GRAIL_BLACKBOARD_H
5 #include "Logger/LoggerManager.hh"
24 friend bool operator == (
const UnsafeAny& first,
const UnsafeAny& second);
46 std::function<
const std::any&(
const std::any&,
const std::any&)> firstStrategy =
OursStrategy,
47 std::function<
const std::any&(
const std::any&,
const std::any&)> secondStrategy =
OursStrategy);
50 std::function<
const UnsafeAny&(
const UnsafeAny&,
const UnsafeAny&)> firstStrategy =
OursStrategy,
51 std::function<
const UnsafeAny&(
const UnsafeAny&,
const UnsafeAny&)> secondStrategy =
OursStrategy);
62 static const std::any&
OursStrategy(
const std::any& ours,
const std::any& theirs);
64 static const UnsafeAny&
OursStrategy(
const UnsafeAny& ours,
const UnsafeAny& theirs);
75 static const std::any&
TheirsStrategy(
const std::any& ours,
const std::any& theirs);
77 static const UnsafeAny&
TheirsStrategy(
const UnsafeAny& ours,
const UnsafeAny& theirs);
88 void Merge(
const Blackboard& other, std::function<
const UnsafeAny&(
const UnsafeAny&,
const UnsafeAny&)> mergeStrategy =
OursStrategy);
117 void SetValue(
const std::string& key,
const T& value)
119 std::lock_guard<std::mutex> lock{mutex};
121 std::any any = value;
124 auto deleter = [](
void* memory)
126 T* dataPointer =
static_cast<T*
>(memory);
129 auto cloner = [](
void* memory)
131 T* dataPointer =
static_cast<T*
>(memory);
132 return new T{*dataPointer};
135 data[key] = UnsafeAny(
new T{value}, deleter, cloner);
139 template<typename T, std::enable_if_t<!std::is_reference<T>::value>* =
nullptr>
147 std::lock_guard<std::mutex> lock{mutex};
149 data[key] = std::any{value};
151 auto deleter = [](
void* memory)
153 T* dataPointer =
static_cast<T*
>(memory);
156 auto cloner = [](
void* memory)
158 T* dataPointer =
static_cast<T*
>(memory);
159 return new T{*dataPointer};
161 data[key] = UnsafeAny(
new T{value}, deleter, cloner);
172 std::lock_guard<std::mutex> lock{mutex};
174 data[key] = std::any{T{}};
176 auto deleter = [](
void* memory)
178 T* dataPointer =
static_cast<T*
>(memory);
181 auto cloner = [](
void* memory)
183 T* dataPointer =
static_cast<T*
>(memory);
184 return new T{*dataPointer};
186 data[key] = UnsafeAny(
new T{}, deleter, cloner);
198 std::lock_guard<std::mutex> lock{mutex};
199 auto iterator = data.find(key);
200 if(iterator == data.end())
202 GRAIL_LOG(consts::DEFAULT_GRAIL_LOG_GROUP, Severity::CRITICAL,
"Invalid key (" + key +
")");
205 return std::any_cast<const T&>(iterator->second);
207 return *
static_cast<T*
>(iterator->second.GetDataPointer());
219 std::lock_guard<std::mutex> lock{ mutex };
221 return std::any_cast<T&>(data[key]);
223 auto iterator = data.find(key);
224 if(iterator == data.end())
226 auto deleter = [](
void* memory)
228 T* dataPointer =
static_cast<T*
>(memory);
231 auto cloner = [](
void* memory)
233 T* dataPointer =
static_cast<T*
>(memory);
234 return new T{*dataPointer};
236 iterator = data.emplace(std::piecewise_construct, std::forward_as_tuple(key),
237 std::forward_as_tuple(
new T{}, deleter, cloner)).first;
239 return *
static_cast<T*
>(iterator->second.GetDataPointer());
252 std::lock_guard<std::mutex> lock{mutex};
253 auto iter = data.find(key);
254 if (iter != data.end())
257 outValue = std::any_cast<T>(iter->second);
259 outValue = *
static_cast<T*
>(iter->second.GetDataPointer());
266 void AddDataToNameMap(std::map<std::string, std::string>& outMap)
const;
270 std::map<std::string, std::any> data{};
274 friend bool operator == (
const UnsafeAny& first,
const UnsafeAny& second);
277 UnsafeAny() =
default;
278 UnsafeAny(
void* dataPointer, std::function<
void(
void*)> deleter, std::function<
void*(
void*)> cloner);
280 UnsafeAny(
const UnsafeAny& other);
281 UnsafeAny(UnsafeAny&& other);
285 UnsafeAny& operator = (
const UnsafeAny& other);
286 UnsafeAny& operator = (UnsafeAny&& other);
288 void* GetDataPointer()
const;
291 void* dataPointer{
nullptr};
292 std::function<void(
void*)> deleter{[](
void*){}};
293 std::function<
void*(
void*)> cloner{[](
void*){
return nullptr; }};
296 std::map<std::string, UnsafeAny> data{};
298 mutable std::mutex mutex{};
The Blackboard class - grail's universal data container.
Definition: Blackboard.hh:21
static const std::any & TheirsStrategy(const std::any &ours, const std::any &theirs)
TheirsStrategy.
Definition: Blackboard.cpp:46
void SetValue(const std::string &key, T &&value)
SetValue - Inserts value keyed with name into this blackboard. If key already exists new value is ass...
Definition: Blackboard.hh:145
bool ContainsKey(const std::string &key) const
ContainsKey - Checks whether this blackboard contains given key.
Definition: Blackboard.cpp:92
T & GetOrAddValue(const std::string &key)
GetOrAddValue - Returns value keyed with name. If blackboard does not contain key,...
Definition: Blackboard.hh:217
void SetValue(const std::string &key, const T &value)
SetValue - Inserts value keyed with name into this blackboard. If key already exists new value is ass...
Definition: Blackboard.hh:117
size_t Size() const
Size.
Definition: Blackboard.cpp:98
void SetDefaultValue(const std::string &key)
SetDefaultValue - Inserts default value of given type keyed with name into this blackboard....
Definition: Blackboard.hh:170
void RemoveEntry(const std::string &key)
RemoveValue - Deletes value keyed with given name from this blackboard.
Definition: Blackboard.cpp:86
const T & GetValue(const std::string &key) const
GetValue - Returns value keyed with name. This method assumes that this blackboard contains given key...
Definition: Blackboard.hh:196
bool TryGetValue(const std::string &key, T &outValue) const
TryGetValue - Checks whether blackboard contains given key. If it does, assigns keyed value to refere...
Definition: Blackboard.hh:250
static const std::any & OursStrategy(const std::any &ours, const std::any &theirs)
OursStrategy.
Definition: Blackboard.cpp:37
void Merge(const Blackboard &other, std::function< const std::any &(const std::any &, const std::any &)> mergeStrategy=OursStrategy)
Merge - Merges data from other blackboard into this one. All conflicts are solved in favor of other b...
Definition: Blackboard.cpp:55
static void TwoWayMerge(Blackboard &first, Blackboard &second, std::function< const std::any &(const std::any &, const std::any &)> firstStrategy=OursStrategy, std::function< const std::any &(const std::any &, const std::any &)> secondStrategy=OursStrategy)
TwoWayMerge - merges second blackboard into first and first into second, uses provided merge strategi...
Definition: Blackboard.cpp:23