DDS  ver. 2.0
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  {
51  : m_ID(0)
52  {
53  }
54 
55  uint64_t m_ID;
56  };
57 
60  {
61  };
62  template <typename T>
64  {
66 
68  : m_signal()
69  {
70  }
71  };
72 
73  template <typename Event_t>
75  {
76  private:
77  typedef std::map<Event_t, std::unique_ptr<SHandlerHlpFunc>> signalsContainer_t;
78 
79  protected:
80  template <Event_t _cmd, typename R, typename... Args>
81  void registerHandlerImpl(std::function<R(Args...)> _handler)
82  {
83  typedef boost::signals2::signal<R(Args...)> signal_t;
84 
85  auto it = m_signals.find(_cmd);
86  if (it == m_signals.end())
87  {
88  std::unique_ptr<SHandlerHlpBaseFunc<signal_t>> signal(new SHandlerHlpBaseFunc<signal_t>());
89  signal->m_signal.connect(_handler);
90  m_signals.insert(std::make_pair(_cmd, std::move(signal)));
91  }
92  else
93  {
94  SHandlerHlpFunc& f = *it->second;
95  signal_t& signal = static_cast<SHandlerHlpBaseFunc<signal_t>&>(f).m_signal;
96  signal.connect(_handler);
97  }
98  }
99 
100  protected:
101  template <class... Args>
102  void dispatchHandlersImpl(Event_t _cmd, const SSenderInfo& _sender, Args&&... args)
103  {
104  typedef boost::signals2::signal<void(const SSenderInfo&, Args...)> signal_t;
105  auto it = m_signals.find(_cmd);
106  if (it != m_signals.end())
107  {
108  const SHandlerHlpFunc& f = *it->second;
109  const signal_t& signal = static_cast<const SHandlerHlpBaseFunc<signal_t>&>(f).m_signal;
110  signal(_sender, std::forward<Args>(args)...);
111  }
112  }
113 
114  protected:
115  bool handlerExistsImpl(Event_t _cmd) const
116  {
117  return (m_signals.find(_cmd) != m_signals.end());
118  }
119 
120  private:
121  signalsContainer_t m_signals;
122  };
123  }
124 }
125 
126 #endif
Definition: BaseEventHandlersImpl.h:74
Helpers for event dispatching.
Definition: BaseEventHandlersImpl.h:59
Definition: BaseEventHandlersImpl.h:48
T m_signal
Definition: BaseEventHandlersImpl.h:65
Definition: BaseEventHandlersImpl.h:63
Definition: dds-agent/src/AgentConnectionManager.h:18
SSenderInfo()
Definition: BaseEventHandlersImpl.h:50
void registerHandlerImpl(std::function< R(Args...)> _handler)
Definition: BaseEventHandlersImpl.h:81
SHandlerHlpBaseFunc()
Definition: BaseEventHandlersImpl.h:67
bool handlerExistsImpl(Event_t _cmd) const
Definition: BaseEventHandlersImpl.h:115
void dispatchHandlersImpl(Event_t _cmd, const SSenderInfo &_sender, Args &&... args)
Definition: BaseEventHandlersImpl.h:102
uint64_t m_ID
Definition: BaseEventHandlersImpl.h:55