Conscience Core
CscCoreEvents.h
Go to the documentation of this file.
1 //
2 // CscCoreEvents.h
3 // ConscienceRobotManager
4 //
5 // Created by Louis Grignon on 26/04/2023.
6 // Copyright © 2019 IliesZaoui. All rights reserved.
7 //
8 
9 #ifndef CscCoreEvents_h
10 #define CscCoreEvents_h
11 
12 #include "CscCommon.h"
13 #include <mutex>
14 #include <typeinfo>
15 #include <unordered_map>
16 #include <functional>
17 #include <condition_variable>
18 
19 using std::unordered_map, std::type_info, std::reference_wrapper, std::function, std::mutex, std::unique_lock, std::condition_variable;
20 
22 
23 class CscCoreEvent {
24 public:
25  virtual ~CscCoreEvent();
26 };
27 
29 public:
30  virtual ~HandlerFunctionBase();
31 
35  virtual void exec(const CscCoreEvent* event, bool &unregisterAfter) = 0;
36 };
37 
38 template <class THandlerClass, class TEvent>
40 public:
41  typedef void (THandlerClass::*MemberFunc)(const TEvent *, bool &unregisterAfter);
42  MemberFunctionHandler(THandlerClass *handlerInstance, MemberFunc handlerMethod, bool deleteObjectOnDestruct);
44 
48  virtual void exec(const CscCoreEvent* event, bool &unregisterAfter) override;
49 private:
50  THandlerClass* handlerInstance;
51  MemberFunc handlerMethod;
52  bool deleteObjectOnDestruct;
53 };
54 
55 template <class THandlerClass, class TEvent>
56 void MemberFunctionHandler<THandlerClass, TEvent>::exec(const CscCoreEvent* event, bool &unregisterAfter) {
57  (handlerInstance->*handlerMethod)(static_cast<const TEvent*>(event), unregisterAfter);
58 }
59 
60 
61 template <class THandlerClass, class TEvent>
62 MemberFunctionHandler<THandlerClass, TEvent>::MemberFunctionHandler(THandlerClass *handlerInstance, MemberFunc handlerMethod, bool deleteObjectOnDestruct) :
63  handlerInstance(handlerInstance), handlerMethod(handlerMethod), deleteObjectOnDestruct(deleteObjectOnDestruct) {
64 }
65 
66 template <class THandlerClass, class TEvent>
68  if (deleteObjectOnDestruct) {
69  delete handlerInstance;
70  }
71 }
72 
73 using TypeInfoRef = reference_wrapper<const type_info>;
75  size_t operator()(TypeInfoRef code) const;
76 };
78  bool operator()(TypeInfoRef lhs, TypeInfoRef rhs) const;
79 };
80 
84 template <class TEvent>
85 using HandleEventFunction = function<void(const TEvent *event, bool &unregisterAfter)>;
86 
87 template <class TEvent>
89 public:
90  void handle(const TEvent* theEvent, bool &unregisterAfter);
92 private:
94 };
95 
96 template <class TEvent>
97 void LambdaHandlerWrapper<TEvent>::handle(const TEvent *theEvent, bool &unregisterAfter) {
98  call(theEvent, unregisterAfter);
99 }
100 
101 template <class TEvent>
103 }
104 
109 public:
114  void publish(const CscCoreEvent *event);
115 
123  template <class TObject, class TEvent>
124  void registerHandler(const string &handlerId, TObject *handlerObject, void (TObject::*handlerMethod)(const TEvent *event, bool &unregisterAfter), bool deleteObjectOnDestruct = false) {
125  TypeInfoRef eventType = typeid(TEvent);
126  handlersMutex.lock();
127  map<string, HandlerFunctionBase*> &eventHandlersById = handlers[eventType];
128  if (eventHandlersById.find(handlerId) != eventHandlersById.end()) {
129  logger->warn("event handler " + handlerId + ", already exists - force unregister first");
130  delete eventHandlersById[handlerId];
131  eventHandlersById.erase(handlerId);
132  }
133  eventHandlersById[handlerId] = new MemberFunctionHandler<TObject, TEvent>(handlerObject, handlerMethod, deleteObjectOnDestruct);
134  handlersMutex.unlock();
135  }
136 
142  template <class TEvent>
143  void registerHandler(const string &handlerId, HandleEventFunction<TEvent> call) {
144  auto obj = new LambdaHandlerWrapper(call);
145  registerHandler<LambdaHandlerWrapper<TEvent>, TEvent>(handlerId, obj, &LambdaHandlerWrapper<TEvent>::handle, true);
146  }
147 
151  template <class TEvent>
152  void unregister(const string &handlerId) {
153  TypeInfoRef eventType = typeid(TEvent);
154  unregister(eventType, handlerId);
155  }
156 
157  static CscCoreEvents *getInstance();
158 private:
159  unordered_map<TypeInfoRef, map<string, HandlerFunctionBase*>, TypeInfoMapHasher, TypeInfoMapEqualTo> handlers;
160  mutex handlersMutex;
161 
162  mutex eventQueueMutex;
163  condition_variable eventQueueConditionVariable;
164  vector<const CscCoreEvent *> eventQueue;
165  void notifyHandlersThread();
166 
167  void unregister(TypeInfoRef eventType, const string &handlerId);
168 
169  CscCoreEvents();
170  inline static CscCoreEvents *instance = nullptr;
171 
172  std::unique_ptr<CscLogger> logger;
173 };
174 
175 }
176 
177 #endif
conscience_core::core_objects::events::LambdaHandlerWrapper::handle
void handle(const TEvent *theEvent, bool &unregisterAfter)
Definition: CscCoreEvents.h:97
conscience_core::core_objects::events::CscCoreEvents::registerHandler
void registerHandler(const string &handlerId, TObject *handlerObject, void(TObject::*handlerMethod)(const TEvent *event, bool &unregisterAfter), bool deleteObjectOnDestruct=false)
Definition: CscCoreEvents.h:124
conscience_core::core_objects::events::MemberFunctionHandler
Definition: CscCoreEvents.h:39
conscience_core::core_objects::events::LambdaHandlerWrapper::LambdaHandlerWrapper
LambdaHandlerWrapper(HandleEventFunction< TEvent > call)
Definition: CscCoreEvents.h:102
conscience_core::core_objects::events::CscCoreEvents::getInstance
static CscCoreEvents * getInstance()
Definition: CscCoreEvents.cpp:84
conscience_core::core_objects::events::MemberFunctionHandler::MemberFunctionHandler
MemberFunctionHandler(THandlerClass *handlerInstance, MemberFunc handlerMethod, bool deleteObjectOnDestruct)
Definition: CscCoreEvents.h:62
conscience_core::core_objects::events::CscCoreEvents::unregister
void unregister(const string &handlerId)
Definition: CscCoreEvents.h:152
conscience_core::core_objects::events::TypeInfoMapEqualTo
Definition: CscCoreEvents.h:77
conscience_core::core_objects::events::HandleEventFunction
function< void(const TEvent *event, bool &unregisterAfter)> HandleEventFunction
Definition: CscCoreEvents.h:85
conscience_core::core_objects::events::MemberFunctionHandler::~MemberFunctionHandler
~MemberFunctionHandler()
Definition: CscCoreEvents.h:67
conscience_core::core_objects::events::CscCoreEvents::publish
void publish(const CscCoreEvent *event)
Definition: CscCoreEvents.cpp:92
conscience_core::core_objects::events
Definition: CscCoreEvents.cpp:14
conscience_core::core_objects::events::CscCoreEvents::registerHandler
void registerHandler(const string &handlerId, HandleEventFunction< TEvent > call)
Definition: CscCoreEvents.h:143
conscience_core::core_objects::events::CscCoreEvent
Definition: CscCoreEvents.h:23
conscience_core::core_objects::events::HandlerFunctionBase::~HandlerFunctionBase
virtual ~HandlerFunctionBase()
Definition: CscCoreEvents.cpp:19
conscience_core::core_objects::events::TypeInfoMapHasher
Definition: CscCoreEvents.h:74
conscience_core::core_objects::events::TypeInfoRef
reference_wrapper< const type_info > TypeInfoRef
Definition: CscCoreEvents.h:73
nlohmann::detail::void
j template void())
Definition: json.hpp:4189
CscCommon.h
conscience_core::core_objects::events::LambdaHandlerWrapper
Definition: CscCoreEvents.h:88
conscience_core::core_objects::events::MemberFunctionHandler::MemberFunc
void(THandlerClass::* MemberFunc)(const TEvent *, bool &unregisterAfter)
Definition: CscCoreEvents.h:41
conscience_core::core_objects::events::TypeInfoMapEqualTo::operator()
bool operator()(TypeInfoRef lhs, TypeInfoRef rhs) const
Definition: CscCoreEvents.cpp:26
conscience_core::core_objects::events::HandlerFunctionBase::exec
virtual void exec(const CscCoreEvent *event, bool &unregisterAfter)=0
conscience_core::core_objects::events::CscCoreEvent::~CscCoreEvent
virtual ~CscCoreEvent()
Definition: CscCoreEvents.cpp:16
conscience_core::core_objects::events::MemberFunctionHandler::exec
virtual void exec(const CscCoreEvent *event, bool &unregisterAfter) override
Definition: CscCoreEvents.h:56
conscience_core::core_objects::events::HandlerFunctionBase
Definition: CscCoreEvents.h:28
conscience_core::core_objects::events::CscCoreEvents
Definition: CscCoreEvents.h:108
conscience_core::core_objects::events::TypeInfoMapHasher::operator()
size_t operator()(TypeInfoRef code) const
Definition: CscCoreEvents.cpp:22