libfilezilla
event_handler.hpp
Go to the documentation of this file.
1 #ifndef LIBFILEZILLA_EVENT_HANDLER
2 #define LIBFILEZILLA_EVENT_HANDLER
3 
4 #include "event_loop.hpp"
5 
9 namespace fz {
10 
56 {
57  child_event_handler
58 };
59 
60 class FZ_PUBLIC_SYMBOL event_handler
61 {
62 public:
63  event_handler() = delete;
64 
65  explicit event_handler(event_loop& loop);
66  virtual ~event_handler();
67 
68  event_handler(event_handler const& h);
70 
71  event_handler& operator=(event_handler const&) = delete;
72 
79  void remove_handler();
80 
87  virtual void operator()(event_base const&) = 0;
88 
95  template<typename T, typename... Args>
96  void send_event(Args&&... args) {
97  event_loop_.send_event(this, new T(std::forward<Args>(args)...), true);
98  }
99 
100  template<typename T>
101  void send_event(T* evt) {
102  event_loop_.send_event(this, evt, true);
103  }
104 
105 
107  template<typename T>
108  void send_persistent_event(T* evt) {
109  event_loop_.send_event(this, evt, false);
110  }
111 
129  timer_id add_timer(monotonic_clock const &deadline, duration const& interval = {});
130 
147  timer_id add_timer(duration const& interval, bool one_shot);
148 
153  void stop_timer(timer_id id);
154 
162  timer_id stop_add_timer(timer_id id, monotonic_clock const& deadline, duration const& interval = {});
163 
171  timer_id stop_add_timer(timer_id id, duration const& interval, bool one_shot);
172 
173  void filter_events(std::function<bool(event_base& ev)> const& filter) {
174  event_loop_.filter_events([&](event_handler*& h, event_base& ev) {
175  if (h != this) {
176  return false;
177  }
178  return filter(ev);
179  });
180  }
181 
182  void resend_current_event() {
183  event_loop_.resend_current_event();
184  }
185 
186  void remove_events(event_source const* const source);
187 
188  template<typename T>
189  void remove_events() {
190  remove_events_of_type(T::type());
191  }
192 
193  event_loop & event_loop_;
194 
195 private:
196  void remove_events_of_type(size_t t);
197 
198  friend class event_loop;
199  bool removing_{};
200 
201  void remove_from_parent();
202  event_handler* parent_{};
203  event_handler* next_{};
204  event_handler* child_{};
205 };
206 
221 template<typename T, typename F>
222 bool dispatch(event_base const& ev, F&& f)
223 {
224  bool const same = same_type<T>(ev);
225  if (same) {
226  T const* e = static_cast<T const*>(&ev);
227  std::apply(std::forward<F>(f), e->v_);
228  }
229  return same;
230 }
231 
247 template<typename T, typename H, typename F>
248 bool dispatch(event_base const& ev, H* h, F&& f)
249 {
250  bool const same = same_type<T>(ev);
251  if (same) {
252  T const* e = static_cast<T const*>(&ev);
253  apply(h, std::forward<F>(f), e->v_);
254  }
255  return same;
256 }
257 
276 template<typename T, typename ... Ts, typename H, typename F, typename ... Fs>
277 bool dispatch(event_base const& ev, H* h, F&& f, Fs&& ... fs)
278 {
279  if (dispatch<T>(ev, h, std::forward<F>(f))) {
280  return true;
281  }
282 
283  return dispatch<Ts...>(ev, h, std::forward<Fs>(fs)...);
284 }
285 
286 }
287 
288 #endif
auto apply(Obj &&obj, F &&f, Tuple &&args) -> decltype(apply_(std::forward< Obj >(obj), std::forward< F >(f), std::forward< Tuple >(args), Seq()))
Apply tuple to pointer to member.
Definition: apply.hpp:48
Definition: event_handler.hpp:60
bool dispatch(event_base const &ev, F &&f)
Dispatch for simple_event<> based events to simple functors.
Definition: event_handler.hpp:222
event_handler_option
Simple handler for asynchronous event processing.
Definition: event_handler.hpp:55
void send_persistent_event(T *evt)
Be careful with lifetime.
Definition: event_handler.hpp:108
A simple threaded event loop for the typesafe event system.
A threaded event loop that supports sending events and timers.
Definition: event_loop.hpp:33
A monotonic clock (aka steady clock) is independent from walltime.
Definition: time.hpp:402
The namespace used by libfilezilla.
Definition: apply.hpp:17
The duration class represents a time interval in milliseconds.
Definition: time.hpp:290
Common base class for all events.
Definition: event.hpp:22
void send_event(Args &&...args)
Sends the passed event asynchronously to the handler.
Definition: event_handler.hpp:96