DDS  ver. 3.4
BaseEventHandlersImpl.h
Go to the documentation of this file.
1 // Copyright 2015 GSI, Inc. All rights reserved.
2 //
3 //
4 //
5 #ifndef DDS_BaseEventHandlersImpl_h
6 #define DDS_BaseEventHandlersImpl_h
7 
8 #include <boost/signals2/signal.hpp>
9 
10 #define DDS_BEGIN_EVENT_HANDLERS(eventType) \
11  public: \
12  template <class... Args> \
13  void dispatchHandlers(eventType _cmd, const SSenderInfo& _sender, Args&... args) \
14  { \
15  CBaseEventHandlersImpl<eventType>::dispatchHandlersImpl<>(_cmd, _sender, std::forward<Args>(args)...); \
16  } \
17  \
18  public: \
19  bool handlerExists(eventType _cmd) const \
20  { \
21  return CBaseEventHandlersImpl<eventType>::handlerExistsImpl(_cmd); \
22  }
23 
24 #define DDS_END_EVENT_HANDLERS
25 
26 #define DDS_REGISTER_EVENT_HANDLER(eventType, eventID, funcType) \
27  public: \
28  template <eventType _cmd, typename func_t> \
29  void registerHandler( \
30  func_t _handler, \
31  typename std::enable_if<std::is_same<std::integral_constant<eventType, _cmd>, \
32  std::integral_constant<eventType, eventID>>::value && \
33  std::is_convertible<func_t, std::function<funcType>>::value>::type* = nullptr) \
34  { \
35  std::function<funcType> funcHandler(_handler); \
36  CBaseEventHandlersImpl<eventType>::registerHandlerImpl<_cmd>(funcHandler); \
37  }
38 
39 #define DDS_DECLARE_EVENT_HANDLER_CLASS(theClass) \
40  using theClass::registerHandler; \
41  using theClass::dispatchHandlers; \
42  using theClass::handlerExists;
43 
44 namespace dds
45 {
46  namespace protocol_api
47  {
48  struct SSenderInfo
49  {
50  uint64_t m_ID{ 0 };
51  };
52 
55  {
56  };
57  template <typename T>
59  {
61 
63  : m_signal()
64  {
65  }
66  };
67 
68  template <typename Event_t>
70  {
71  private:
72  typedef std::map<Event_t, std::unique_ptr<SHandlerHlpFunc>> signalsContainer_t;
73 
74  protected:
75  template <Event_t _cmd, typename R, typename... Args>
76  void registerHandlerImpl(std::function<R(Args...)> _handler)
77  {
78  typedef boost::signals2::signal<R(Args...)> signal_t;
79 
80  auto it = m_signals.find(_cmd);
81  if (it == m_signals.end())
82  {
83  std::unique_ptr<SHandlerHlpBaseFunc<signal_t>> signal(new SHandlerHlpBaseFunc<signal_t>());
84  signal->m_signal.connect(_handler);
85  m_signals.insert(std::make_pair(_cmd, std::move(signal)));
86  }
87  else
88  {
89  SHandlerHlpFunc& f = *it->second;
90  signal_t& signal = static_cast<SHandlerHlpBaseFunc<signal_t>&>(f).m_signal;
91  signal.connect(_handler);
92  }
93  }
94 
95  protected:
96  template <class... Args>
97  void dispatchHandlersImpl(Event_t _cmd, const SSenderInfo& _sender, Args&&... args)
98  {
99  typedef boost::signals2::signal<void(const SSenderInfo&, Args...)> signal_t;
100  auto it = m_signals.find(_cmd);
101  if (it != m_signals.end())
102  {
103  const SHandlerHlpFunc& f = *it->second;
104  const signal_t& signal = static_cast<const SHandlerHlpBaseFunc<signal_t>&>(f).m_signal;
105  signal(_sender, std::forward<Args>(args)...);
106  }
107  }
108 
109  protected:
110  bool handlerExistsImpl(Event_t _cmd) const
111  {
112  return (m_signals.find(_cmd) != m_signals.end());
113  }
114 
115  private:
116  signalsContainer_t m_signals;
117  };
118  } // namespace protocol_api
119 } // namespace dds
120 
121 #endif
Definition: BaseEventHandlersImpl.h:69
Helpers for event dispatching.
Definition: BaseEventHandlersImpl.h:54
Definition: BaseEventHandlersImpl.h:48
T m_signal
Definition: BaseEventHandlersImpl.h:60
Definition: BaseEventHandlersImpl.h:58
Definition: AgentConnectionManager.h:13
void registerHandlerImpl(std::function< R(Args...)> _handler)
Definition: BaseEventHandlersImpl.h:76
SHandlerHlpBaseFunc()
Definition: BaseEventHandlersImpl.h:62
bool handlerExistsImpl(Event_t _cmd) const
Definition: BaseEventHandlersImpl.h:110
void dispatchHandlersImpl(Event_t _cmd, const SSenderInfo &_sender, Args &&... args)
Definition: BaseEventHandlersImpl.h:97
uint64_t m_ID
Definition: BaseEventHandlersImpl.h:50