Add some code from framework

This commit is contained in:
Bram verhulst
2025-05-18 11:03:51 +02:00
parent 294e9ab735
commit 620dafb591
18 changed files with 487 additions and 5 deletions

80
project/BlackBoard.h Normal file
View File

@@ -0,0 +1,80 @@
#pragma once
#include <unordered_map>
#include <string>
class IBlackBoardField
{
public:
IBlackBoardField() = default;
virtual ~IBlackBoardField() = default;
};
//BlackboardField does not take ownership of pointers whatsoever!
template<typename T>
class BlackboardField : public IBlackBoardField
{
public:
explicit BlackboardField(T data) : m_Data(data) {
}
T GetData() { return m_Data; };
void SetData(T data) { m_Data = data; }
private:
T m_Data;
};
class Blackboard final
{
public:
Blackboard() = default;
~Blackboard() {
for (auto el : m_BlackboardData)
delete el.second;
m_BlackboardData.clear();
}
Blackboard(const Blackboard& other) = delete;
Blackboard& operator=(const Blackboard& other) = delete;
Blackboard(Blackboard&& other) = delete;
Blackboard& operator=(Blackboard&& other) = delete;
template<typename T> bool AddData(const std::string& name, T data) {
auto it = m_BlackboardData.find(name);
if (it == m_BlackboardData.end()) {
m_BlackboardData[name] = new BlackboardField<T>(data);
return true;
}
printf("WARNING: Data '%s' of type '%s' already in Blackboard \n", name.c_str(), typeid(T).name());
return false;
}
template<typename T> bool ChangeData(const std::string& name, T data) {
auto it = m_BlackboardData.find(name);
if (it != m_BlackboardData.end()) {
BlackboardField<T>* p = dynamic_cast<BlackboardField<T>*>(m_BlackboardData[name]);
if (p) {
p->SetData(data);
return true;
}
}
printf("WARNING: Data '%s' of type '%s' not found in Blackboard \n", name.c_str(), typeid(T).name());
return false;
}
//Get the data from the blackboard
template<typename T> bool GetData(const std::string& name, T& data) {
BlackboardField<T>* p = dynamic_cast<BlackboardField<T>*>(m_BlackboardData[name]);
if (p != nullptr) {
data = p->GetData();
return true;
}
printf("WARNING: Data '%s' of type '%s' not found in Blackboard \n", name.c_str(), typeid(T).name());
return false;
}
private:
std::unordered_map<std::string, IBlackBoardField*> m_BlackboardData;
};