libfilezilla
Loading...
Searching...
No Matches
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
12
13namespace fz {
14
22class FZ_PUBLIC_SYMBOL event_base
23{
24public:
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
54size_t FZ_PUBLIC_SYMBOL get_unique_type_id(std::type_info const& id);
55
65
66template<typename UniqueType, typename...Values>
67class simple_event final : public event_base
68{
69public:
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
102
104class event_with_source_base : public event_base
105{
106public:
107 using event_base::event_base;
108 virtual event_source* source() const = 0;
109};
110
120template<typename UniqueType, typename...Values>
121class event_with_source final : public event_with_source_base
122{
123public:
124 typedef UniqueType unique_type;
125 typedef std::tuple<Values...> tuple_type;
126
127 using event_with_source_base::event_with_source_base;
128
129 template<typename First_Value, typename...Remaining_Values>
130 explicit event_with_source(First_Value&& value, Remaining_Values&& ...values)
131 : v_(std::forward<First_Value>(value), std::forward<Remaining_Values>(values)...)
132 {
133 }
134
135 inline static size_t type() {
136 static size_t const v = get_unique_type_id(typeid(UniqueType*));
137 return v;
138 }
139
140 virtual size_t derived_type() const override {
141 return type();
142 }
143
144 virtual event_source* source() const override {
145 return static_cast<event_source*>(std::get<0>(v_));
146 }
147
148 mutable tuple_type v_;
149};
150
153template<typename T>
154bool same_type(event_base const& ev)
155{
156 return ev.derived_type() == T::type();
157}
158
159typedef unsigned long long timer_id;
160
162struct timer_event_type{};
163
169
170}
171
172#endif
Common base class for all events.
Definition event.hpp:23
virtual size_t derived_type() const =0
Definition event.hpp:101
virtual size_t derived_type() const override
Definition event.hpp:140
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:168
size_t get_unique_type_id(std::type_info const &id)
bool same_type(event_base const &ev)
Definition event.hpp:154