libfilezilla
event.hpp
Go to the documentation of this file.
1 #ifndef LIBFILEZILLA_EVENT_HEADER
2 #define LIBFILEZILLA_EVENT_HEADER
3 
4 #include "libfilezilla.hpp"
5 
6 #include <tuple>
7 #include <typeinfo>
8 
13 namespace fz {
14 
22 class FZ_PUBLIC_SYMBOL event_base
23 {
24 public:
25  event_base() = default;
26  virtual ~event_base() = default;
27 
28  event_base(event_base const&) = default;
29  event_base& operator=(event_base const&) = default;
30  event_base(event_base &&) = default;
31  event_base& operator=(event_base &&) = default;
32 
48  virtual size_t derived_type() const = 0;
49 };
50 
54 size_t FZ_PUBLIC_SYMBOL get_unique_type_id(std::type_info const& id);
55 
66 template<typename UniqueType, typename...Values>
67 class simple_event final : public event_base
68 {
69 public:
70  typedef UniqueType unique_type;
71  typedef std::tuple<Values...> tuple_type;
72 
73  using event_base::event_base;
74 
75  template<typename First_Value, typename...Remaining_Values>
76  explicit simple_event(First_Value&& value, Remaining_Values&& ...values)
77  : v_(std::forward<First_Value>(value), std::forward<Remaining_Values>(values)...)
78  {
79  }
80 
82  inline static size_t type() {
83  // Exporting templates from DLLs is problematic to say the least. It breaks
84  // ODR, so we use this trick that goes over the type name.
85  static size_t const v = get_unique_type_id(typeid(UniqueType*));
86  return v;
87  }
88 
90  virtual size_t derived_type() const override {
91  return type();
92  }
93 
98  mutable tuple_type v_;
99 };
100 
103 template<typename T>
104 bool same_type(event_base const& ev)
105 {
106  return ev.derived_type() == T::type();
107 }
108 
109 typedef unsigned long long timer_id;
110 
112 struct timer_event_type{};
113 
119 
120 }
121 
122 #endif
Common base class for all events.
Definition: event.hpp:23
virtual size_t derived_type() const =0
This is the recommended event class.
Definition: event.hpp:68
tuple_type v_
The event value, gets built from the arguments passed in the constructor.
Definition: event.hpp:98
virtual size_t derived_type() const override
Simply returns type()
Definition: event.hpp:90
static size_t type()
Returns a unique id for the type such that can be used directly in derived_type.
Definition: event.hpp:82
Sets some global macros and further includes string.hpp.
The namespace used by libfilezilla.
Definition: apply.hpp:17
simple_event< timer_event_type, timer_id > timer_event
All timer events have this type.
Definition: event.hpp:118
size_t get_unique_type_id(std::type_info const &id)
bool same_type(event_base const &ev)
Definition: event.hpp:104