Grail (C++)  1.3.0
A multi-platform, modular, universal engine for embedding advanced AI in games.
Blackboard.hh
1 // Copyright QED Software 2023.
2 
3 #ifndef GRAIL_BLACKBOARD_H
4 #define GRAIL_BLACKBOARD_H
5 
6 #include "consts.h"
7 #include "../GrailLogger/LoggerManager.hh"
8 #include "BlackboardEntry.hh"
9 
10 namespace grail
11 {
15  class Blackboard
16  {
17  public:
18  Blackboard() = default;
19  Blackboard(const Blackboard& other);
20  Blackboard(Blackboard&& other) = delete;
21 
22  ~Blackboard() = default;
23 
24  Blackboard& operator =(const Blackboard& other);
25  Blackboard& operator =(Blackboard&& other) = delete;
26 
34  static void TwoWayMerge(Blackboard& first, Blackboard& second,
35  std::function<BlackboardEntry(const std::string&, const BlackboardEntry&, const BlackboardEntry&)> firstStrategy = OursStrategy,
36  std::function<BlackboardEntry(const std::string&, const BlackboardEntry&, const BlackboardEntry&)> secondStrategy = OursStrategy);
37 
38 
45  static BlackboardEntry OursStrategy(const std::string&, const BlackboardEntry& ours, const BlackboardEntry& theirs);
46 
53  static BlackboardEntry TheirsStrategy(const std::string&, const BlackboardEntry& ours, const BlackboardEntry& theirs);
54 
55 
61  void Merge(const Blackboard& other, std::function<BlackboardEntry(const std::string&, const BlackboardEntry&, const BlackboardEntry&)> mergeStrategy = OursStrategy);
62 
67  void RemoveEntry(const std::string& key);
68 
74  bool ContainsKey(const std::string& key) const;
75 
80  size_t Size() const;
81 
82  template <typename T>
88  void SetValue(const std::string& key, const T& value)
89  {
90  std::lock_guard<std::mutex> lock{mutex};
91  SetValueInternal(key, value);
92  }
93 
94  template <typename T, std::enable_if_t<!std::is_reference<T>::value>* = nullptr>
100  void SetValue(const std::string& key, T&& value)
101  {
102  std::lock_guard<std::mutex> lock{mutex};
103  SetValueInternal(key, value);
104  }
105 
106  template <typename T>
111  void SetDefaultValue(const std::string& key)
112  {
113  SetValue(key, T{});
114  }
115 
116  template <typename T>
122  const T& GetValue(const std::string& key) const
123  {
124  std::lock_guard<std::mutex> lock{mutex};
125  auto iterator = data.find(key);
126  if(iterator == data.end())
127  {
128  GRAIL_LOG(consts::DEFAULT_GRAIL_LOG_GROUP, logger::Severity::CRITICAL, "Invalid key (" + key + ")");
129  }
130 
131  return iterator->second.GetValue<T>();
132  }
133 
134  template <typename T>
140  const T& GetOrAddValue(const std::string& key)
141  {
142  std::lock_guard<std::mutex> lock{ mutex };
143  auto iterator = data.find(key);
144  if (iterator == data.end())
145  {
146  data[key].SetValue(T{});
147  return data[key].GetValue<T>();
148  }
149 
150  return iterator->second.GetValue<T>();
151  }
152 
153  template <typename T>
160  bool TryGetValue(const std::string& key, T& outValue) const
161  {
162  std::lock_guard<std::mutex> lock{mutex};
163 
164  auto iter = data.find(key);
165  if(iter != data.end())
166  {
167  outValue = iter->second.GetValue<T>();
168  return true;
169  }
170 
171  return false;
172  }
173 
178  void SerializeToMap(std::map<std::string, std::string>& outMap) const;
179 
180  private:
181  std::map<std::string, BlackboardEntry> data{};
182  mutable std::mutex mutex{};
183 
184  template <typename T>
185  void SetValueInternal(const std::string& key, const T& value)
186  {
187  data[key].SetValue(value);
188  }
189  };
190 }
191 
192 #endif //GRAIL_BLACKBOARD_H
grail::Blackboard::Size
size_t Size() const
Size.
Definition: Blackboard.cpp:71
grail::Blackboard::TwoWayMerge
static void TwoWayMerge(Blackboard &first, Blackboard &second, std::function< BlackboardEntry(const std::string &, const BlackboardEntry &, const BlackboardEntry &)> firstStrategy=OursStrategy, std::function< BlackboardEntry(const std::string &, const BlackboardEntry &, const BlackboardEntry &)> secondStrategy=OursStrategy)
TwoWayMerge - merges second blackboard into first and first into second, uses provided merge strategi...
Definition: Blackboard.cpp:20
grail::Blackboard::TryGetValue
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:160
grail::Blackboard::SerializeToMap
void SerializeToMap(std::map< std::string, std::string > &outMap) const
SerializeToMap - converts the data stored in the blackboard to a map<key, value as string>
Definition: Blackboard.cpp:77
grail::Blackboard::Merge
void Merge(const Blackboard &other, std::function< BlackboardEntry(const std::string &, const BlackboardEntry &, const BlackboardEntry &)> mergeStrategy=OursStrategy)
Merge - Merges data from other blackboard into this one. All conflicts are solved in favor of other b...
Definition: Blackboard.cpp:38
grail::Blackboard::SetDefaultValue
void SetDefaultValue(const std::string &key)
SetDefaultValue - Inserts default value of given type keyed with name into this blackboard....
Definition: Blackboard.hh:111
grail::Blackboard
The Blackboard class - grail's universal data container.
Definition: Blackboard.hh:15
grail::Blackboard::ContainsKey
bool ContainsKey(const std::string &key) const
ContainsKey - Checks whether this blackboard contains given key.
Definition: Blackboard.cpp:65
grail::Blackboard::SetValue
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:88
grail::Blackboard::RemoveEntry
void RemoveEntry(const std::string &key)
RemoveValue - Deletes value keyed with given name from this blackboard.
Definition: Blackboard.cpp:59
grail::Blackboard::TheirsStrategy
static BlackboardEntry TheirsStrategy(const std::string &, const BlackboardEntry &ours, const BlackboardEntry &theirs)
TheirsStrategy.
Definition: Blackboard.cpp:33
grail::Blackboard::OursStrategy
static BlackboardEntry OursStrategy(const std::string &, const BlackboardEntry &ours, const BlackboardEntry &theirs)
OursStrategy.
Definition: Blackboard.cpp:28
grail::Blackboard::SetValue
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:100
grail::Blackboard::GetOrAddValue
const T & GetOrAddValue(const std::string &key)
GetOrAddValue - Returns value keyed with name. If blackboard does not contain key,...
Definition: Blackboard.hh:140
grail::Blackboard::GetValue
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:122
grail::BlackboardEntry
Definition: BlackboardEntry.hh:313