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 
54 class FZ_PUBLIC_SYMBOL event_handler
55 {
56 public:
57  event_handler() = delete;
58 
59  explicit event_handler(event_loop& loop);
60  virtual ~event_handler();
61 
62  event_handler(event_handler const& h);
63  event_handler& operator=(event_handler const&) = delete;
64 
72 
79  virtual void operator()(event_base const&) = 0;
80 
87  template<typename T, typename... Args>
88  void send_event(Args&&... args) {
89  event_loop_.send_event(this, new T(std::forward<Args>(args)...));
90  }
91 
92  template<typename T>
93  void send_event(T* evt) {
94  event_loop_.send_event(this, evt);
95  }
96 
114  timer_id add_timer(monotonic_clock const &deadline, duration const& interval = {});
115 
132  timer_id add_timer(duration const& interval, bool one_shot);
133 
138  void stop_timer(timer_id id);
139 
147  timer_id stop_add_timer(timer_id id, monotonic_clock const& deadline, duration const& interval = {});
148 
156  timer_id stop_add_timer(timer_id id, duration const& interval, bool one_shot);
157 
158  event_loop & event_loop_;
159 private:
160  friend class event_loop;
161  bool removing_{};
162 };
163 
178 template<typename T, typename F>
179 bool dispatch(event_base const& ev, F&& f)
180 {
181  bool const same = same_type<T>(ev);
182  if (same) {
183  T const* e = static_cast<T const*>(&ev);
184  std::apply(std::forward<F>(f), e->v_);
185  }
186  return same;
187 }
188 
204 template<typename T, typename H, typename F>
205 bool dispatch(event_base const& ev, H* h, F&& f)
206 {
207  bool const same = same_type<T>(ev);
208  if (same) {
209  T const* e = static_cast<T const*>(&ev);
210  apply(h, std::forward<F>(f), e->v_);
211  }
212  return same;
213 }
214 
233 template<typename T, typename ... Ts, typename H, typename F, typename ... Fs>
234 bool dispatch(event_base const& ev, H* h, F&& f, Fs&& ... fs)
235 {
236  if (dispatch<T>(ev, h, std::forward<F>(f))) {
237  return true;
238  }
239 
240  return dispatch<Ts...>(ev, h, std::forward<Fs>(fs)...);
241 }
242 
243 }
244 
245 #endif
The duration class represents a time interval in milliseconds.
Definition: time.hpp:291
Common base class for all events.
Definition: event.hpp:23
Simple handler for asynchronous event processing.
Definition: event_handler.hpp:55
timer_id add_timer(duration const &interval, bool one_shot)
Adds a timer, returns the timer id.
void stop_timer(timer_id id)
void remove_handler()
Deactivates handler, removes all pending events and stops all timers for this handler.
timer_id stop_add_timer(timer_id id, duration const &interval, bool one_shot)
virtual void operator()(event_base const &)=0
Called by the event loop in the worker thread with the event to process.
timer_id add_timer(monotonic_clock const &deadline, duration const &interval={})
Adds a timer, returns the timer id.
void send_event(Args &&... args)
Sends the passed event asynchronously to the handler.
Definition: event_handler.hpp:88
timer_id stop_add_timer(timer_id id, monotonic_clock const &deadline, duration const &interval={})
A threaded event loop that supports sending events and timers.
Definition: event_loop.hpp:34
A monotonic clock (aka steady clock) is independent from walltime.
Definition: time.hpp:403
A simple threaded event loop for the typesafe event system.
The namespace used by libfilezilla.
Definition: apply.hpp:17
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
bool dispatch(event_base const &ev, F &&f)
Dispatch for simple_event<> based events to simple functors.
Definition: event_handler.hpp:179