6#include"../utils/hashSet.h"
13 Event(
const std::string& eventType):
type(eventType) {}
39 if (destroy)
delete event;
57 auto itEvent = eventMap.find(eventType);
58 if (itEvent == eventMap.end()) {
63 auto& objSet = itEvent->second;
67 auto itObj = objMap.find(obj);
68 if (itObj == objMap.end()) {
73 auto& eventSet = itObj->second;
74 eventSet.insert(eventType);
85 auto itEvent = eventMap.find(eventType);
86 if (itEvent != eventMap.end()) {
87 auto& objSet = itEvent->second;
91 eventMap.erase(itEvent);
96 auto itObj = objMap.find(obj);
97 if (itObj != objMap.end()) {
98 auto& eventSet = itObj->second;
99 eventSet.erase(eventType);
101 if (eventSet.empty()) {
113 auto itObj = objMap.find(obj);
114 if (itObj != objMap.end()) {
117 auto& eventSet = itObj->second;
118 for (
auto it = eventSet.begin(); it!=eventSet.end(); ++it) {
120 auto itEvent = eventMap.find(*it);
121 if (itEvent != eventMap.end()) {
122 auto& objSet = itEvent->second;
125 if (objSet.empty()) {
126 eventMap.erase(itEvent);
140 auto it = eventMap.find(eventInstance.
type);
141 if (it != eventMap.end()) {
143 auto& objSet = it->second;
144 for (
auto objIt = objSet.begin(); objIt!=objSet.end(); ++objIt) {
145 (*objIt)->onEvent(eventInstance);
162 if (stagedEvents.size()==stagedEvents.capacity()) {
163 size_t newSize = std::max(stagedEvents.size(),
size_t(1)) * 2;
164 stagedEvents.reserve(newSize);
166 stagedEvents.push_back(
new StagedEvent{ eventToStage, timer, destroyWhenDone });
167 return stagedEvents.back();
175 for (
size_t i=0; i<stagedEvents.size(); ) {
187 std::swap(stagedEvents[i], stagedEvents.back());
188 stagedEvents.pop_back();
200 auto it = eventMap.find(eventType);
201 if (it != eventMap.end()) {
212 auto it = objMap.find(obj);
213 if (it != objMap.end()) {
216 return emptyEventSet;
222 std::unordered_map<std::string, HashSet<GameObject*>> emptyEventMap;
223 std::unordered_map<GameObject*, HashSet<std::string>> emptyObjMap;
224 std::swap(eventMap, emptyEventMap);
225 std::swap(objMap, emptyObjMap);
226 emptyObjSet.freeMem();
228 for (
auto it = stagedEvents.begin(); it!=stagedEvents.end(); it++) {
233 std::vector<StagedEvent*> emptyStagedEvents;
234 std::swap(stagedEvents, emptyStagedEvents);
243 static std::unordered_map<std::string, HashSet<GameObject*>> eventMap;
246 static std::unordered_map<GameObject*, HashSet<std::string>> objMap;
255 static std::vector<StagedEvent*> stagedEvents;
264 std::unordered_map<std::string, HashSet<GameObject*>> EventManager::eventMap;
265 std::unordered_map<GameObject*, HashSet<std::string>> EventManager::objMap;
266 std::vector<StagedEvent*> EventManager::stagedEvents;
void freeMem()
Definition hashSet.h:168
std::string type
Type of the event. Serves as event identifier. Case sensitive.
Definition event.h:14
static const HashSet< std::string > & getAllRegiteredEvents(GameObject *obj)
Definition event.h:211
static StagedEvent * stageEvent(Event *eventToStage, float timer, bool destroyWhenDone)
Definition event.h:155
static void unregisterFromEvent(GameObject *obj, std::string eventType)
Definition event.h:81
static void updateEventTimer(float dt)
Definition event.h:174
static void freeMem()
Use this to free all memory used by internal static members.
Definition event.h:221
static void registerForEvent(GameObject *obj, std::string eventType)
Definition event.h:53
static void dispatchEvent(const Event &eventInstance)
Definition event.h:139
static const HashSet< GameObject * > & getAllRegisteredObjects(const std::string &eventType)
Definition event.h:199
static void unregisterFromAllEvents(GameObject *obj)
Definition event.h:110
virtual void onEvent(const Event &e)=0
virtual ~GameObject()
Destructor ensures that on deletion, the object if unregistered from all events.
Definition event.h:259
Event staged for a later execution.
Definition event.h:34