libfilezilla
Toggle main menu visibility
Loading...
Searching...
No Matches
lib
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
12
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
65
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
101
class
event_source
{};
102
104
class
event_with_source_base :
public
event_base
105
{
106
public
:
107
using
event_base::event_base;
108
virtual
event_source
* source()
const
= 0;
109
};
110
120
template
<
typename
UniqueType,
typename
...Values>
121
class
event_with_source final :
public
event_with_source_base
122
{
123
public
:
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
153
template
<
typename
T>
154
bool
same_type
(
event_base
const
& ev)
155
{
156
return
ev.
derived_type
() == T::type();
157
}
158
159
typedef
unsigned
long
long
timer_id;
160
162
struct
timer_event_type{};
163
168
typedef
simple_event<timer_event_type, timer_id>
timer_event
;
169
170
}
171
172
#endif
fz::event_base
Common base class for all events.
Definition
event.hpp:23
fz::event_base::derived_type
virtual size_t derived_type() const =0
fz::event_source
Definition
event.hpp:101
fz::event_with_source::derived_type
virtual size_t derived_type() const override
Definition
event.hpp:140
fz::simple_event
This is the recommended event class.
Definition
event.hpp:68
fz::simple_event::v_
tuple_type v_
The event value, gets built from the arguments passed in the constructor.
Definition
event.hpp:98
fz::simple_event::derived_type
virtual size_t derived_type() const override
Simply returns type().
Definition
event.hpp:90
fz::simple_event::type
static size_t type()
Returns a unique id for the type such that can be used directly in derived_type.
Definition
event.hpp:82
libfilezilla.hpp
Sets some global macros and further includes string.hpp.
fz
The namespace used by libfilezilla.
Definition
apply.hpp:17
fz::timer_event
simple_event< timer_event_type, timer_id > timer_event
All timer events have this type.
Definition
event.hpp:168
fz::get_unique_type_id
size_t get_unique_type_id(std::type_info const &id)
fz::same_type
bool same_type(event_base const &ev)
Definition
event.hpp:154
Generated by
1.17.0