Atoms Crowd  4.1.0
Blackboard.h
1 #pragma once
2 // ===========================================================================
3 // Copyright (c) 2015 Toolchefs Ltd. All rights reserved.
4 //
5 // Use of this software is subject to the terms of the Toolchefs license
6 // agreement provided at the time of installation or download, or which
7 // otherwise accompanies this software in either electronic or hard copy form.
8 // ===========================================================================
9 
10 #include <Atoms/Globals.h>
11 #include <AtomsCore/Metadata/Metadata.h>
12 #include <AtomsCore/Metadata/MapMetadata.h>
13 #include <AtomsCore/Metadata/StringMetadata.h>
14 #include <Atoms/BehaviourTree/BlackboardValue.h>
15 #include <map>
16 
17 namespace Atoms
18 {
20  {
21  enum Flags {
22  None = 0,
23  LinkMetadata = 1,
24  CacheMetadata = 2
25  };
26 
27  std::string name;
28  AtomsPtr<AtomsCore::Metadata> value;
29  short flags;
30  };
31 
32  class BlackboardInstance;
33 
34  class ATOMS_EXPORT Blackboard
35  {
36  public:
37 
38  Blackboard();
39 
40  ~Blackboard();
41 
42  BlackboardEntry& entry(size_t index);
43 
44  size_t addEntry(const std::string& name, AtomsPtr<AtomsCore::Metadata>& metadata, short flags = 0);
45 
46  void updateEntry(const std::string& name, AtomsPtr<AtomsCore::Metadata>& metadata);
47 
48  size_t addEntry(const std::string& name, AtomsCore::Metadata* metadata, short flags = 0);
49 
50  inline size_t size() const { return m_entries.size(); }
51 
52  inline void setParent(Blackboard* parent) { m_parent = parent; }
53 
54  Blackboard* parent() { return m_parent; }
55  const Blackboard* parent() const { return m_parent; }
56 
57  BlackboardEntryPosition entryPosition(const std::string& name) const;
58 
59  unsigned int entryType(const std::string& name) const;
60 
61  void initializeInstance(BlackboardInstance& instance, bool clone=true);
62 
63  void clear();
64 
65  private:
66 
67  std::vector<BlackboardEntry> m_entries;
68 
69  Blackboard* m_parent;
70 
71  };
72 
73  class ATOMS_EXPORT BlackboardInstance
74  {
75  public:
77 
79 
80  inline size_t size() const { return values.size(); }
81 
82  AtomsPtr<AtomsCore::Metadata>& entry(size_t index) { assert(values.size() > index); return values[index]; }
83  const AtomsPtr<AtomsCore::Metadata>& entry(size_t index) const { assert(values.size() > index); return values[index]; }
84 
85  public:
86  std::vector<AtomsPtr<AtomsCore::Metadata>> values;
87 
88  BlackboardInstance* parent;
89 
90  Blackboard* blackboard;
91  };
92 
93 
94  template <typename T, typename M>
95  inline void getBlackboardValueFromAttributes(const AtomsCore::MapMetadata* attributes, Blackboard* blackboard, const std::string& attributeName, BlackboardValue<M>& blackboardValue)
96  {
97  blackboardValue.position.valueIndex = -1;
98  blackboardValue.position.parentIndex = 0;
99  auto attrPtr = attributes->getTypedEntry<T>(attributeName);
100  if (attrPtr)
101  {
102  blackboardValue.value = attrPtr->value();
103  }
104 
105  auto properties = attributes->getTypedEntry<AtomsCore::MapMetadata>(attributeName + "#properties");
106  if (properties && blackboard)
107  {
108  auto blackboardKey = properties->getTypedEntry<AtomsCore::StringMetadata>("blackboard_key");
109  if (blackboardKey && !blackboardKey->get().empty())
110  {
111  auto bbPosition = blackboard->entryPosition(blackboardKey->get());
112  blackboardValue.position = bbPosition;
113  }
114  }
115  }
116 
117  inline void getBlackboardKeyPositionFromAttributes(const AtomsCore::MapMetadata* attributes, Blackboard* blackboard, const std::string& attributeName, BlackboardValue<std::string>& blackboardValue)
118  {
119  blackboardValue.position.valueIndex = -1;
120  blackboardValue.position.parentIndex = 0;
121  auto attrPtr = attributes->getTypedEntry<AtomsCore::StringMetadata>(attributeName);
122  if (attrPtr)
123  {
124  auto bbPosition = blackboard->entryPosition(attrPtr->get());
125  blackboardValue.position = bbPosition;
126  }
127 
128  auto properties = attributes->getTypedEntry<AtomsCore::MapMetadata>(attributeName + "#properties");
129  if (properties && blackboard)
130  {
131  auto blackboardKey = properties->getTypedEntry<AtomsCore::StringMetadata>("blackboard_key");
132  if (blackboardKey && !blackboardKey->get().empty())
133  {
134  auto bbPosition = blackboard->entryPosition(blackboardKey->get());
135  blackboardValue.position = bbPosition;
136  }
137  }
138  }
139 
140  template <>
141  inline void getBlackboardValueFromAttributes<AtomsCore::Metadata, AtomsPtr<AtomsCore::Metadata>>(const AtomsCore::MapMetadata* attributes, Blackboard* blackboard, const std::string& attributeName, BlackboardMetadataValue& blackboardValue)
142  {
143  blackboardValue.position.valueIndex = -1;
144  blackboardValue.position.parentIndex = 0;
145  auto attrPtr = attributes->getEntry(attributeName);
146  if (attrPtr)
147  {
148  blackboardValue.value = attrPtr->clone();
149  }
150 
151  auto properties = attributes->getTypedEntry<AtomsCore::MapMetadata>(attributeName + "#properties");
152  if (properties && blackboard)
153  {
154  auto blackboardKey = properties->getTypedEntry<AtomsCore::StringMetadata>("blackboard_key");
155  if (blackboardKey && !blackboardKey->get().empty())
156  {
157  auto bbPosition = blackboard->entryPosition(blackboardKey->get());
158  blackboardValue.position = bbPosition;
159  }
160  }
161  }
162 }
Atoms::Blackboard
Definition: Blackboard.h:35
Atoms::BlackboardInstance
Definition: Blackboard.h:74
AtomsCore::Metadata
Base Metadata class.
Definition: Metadata.h:24
Atoms::BlackboardValue
Definition: BlackboardValue.h:28
Atoms::BlackboardEntry
Definition: Blackboard.h:20
Atoms::BlackboardEntryPosition
Definition: BlackboardValue.h:21
Atoms
Atoms namespace.
Definition: Agent.h:28
AtomsCore::MapMetadata
MapMetadata class.
Definition: MapMetadata.h:24
AtomsCore::MapMetadata::getTypedEntry
AtomsPtr< T > getTypedEntry(const Key &key)
Get a typed entry.
Definition: MapMetadata.impl.h:4