-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathexample.cpp
143 lines (111 loc) · 2.7 KB
/
example.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include "signals.hpp"
#include <iostream>
#include <cassert>
void func0() {
std::cout << "func0()" << std::endl;
}
int func1_called = 0;
void func1() {
std::cout << "func1()" << std::endl;
++func1_called;
}
int func2_called = 0;
void func2() {
std::cout << "func2()" << std::endl;
++func2_called;
}
int func3_called = 0;
int func3() {
std::cout << "func3()" << std::endl;
return func3_called++;
}
int func4_called = 0;
int func4() {
std::cout << "func4()" << std::endl;
return func4_called++;
}
int main() {
// base
{
signals::signal<void()> sig;
sig.connect(func0);
sig(); // emit
}
// check connection
{
signals::signal<void()> sig;
auto id = sig.connect(func0);
assert(sig.connected(id) == true);
sig(); // emit
sig.disconnect(id);
assert(sig.connected(id) == false);
}
// scopped connection
{
assert(func1_called == 0);
signals::signal<void()> sig;
{
signals::scoped_connection handler = sig.connect(func0);
assert(func1_called == 0);
}
sig();
assert(func1_called == 0);
}
// scopped connection
{
assert(func1_called == 0);
signals::signal<void()> sig;
{
signals::scoped_connection handler = sig.connect(func1);
sig();
assert(func1_called == 1);
}
sig();
assert(func1_called == 1);
}
// many slots
{
signals::signal<void()> sig;
sig.connect(func2);
sig.connect(func2);
assert(func2_called == 0);
sig();
assert(func2_called == 2);
}
// return value
{
signals::signal<int()> sig;
sig.connect(func3);
assert(func3_called == 0);
auto res = sig();
assert(res == 0);
assert(func3_called == 1);
res = sig();
assert(res == 1);
assert(func3_called == 2);
}
// return value aggregation - only last
{
// by default only last value will be stored
signals::signal<int()> sig;
sig.connect(func4);
sig.connect(func4);
assert(func4_called == 0);
auto res = sig();
assert(res == 1);
assert(func4_called == 2);
}
// return value aggregation - collation
{
func4_called = 0;
signals::signal<int()> sig;
sig.connect(func4);
sig.connect(func4);
assert(func4_called == 0);
auto res = sig.emit<signals::aggregation_collation<int>>();
assert(res.size() == 2);
assert(res[0] == 0);
assert(res[1] == 1);
assert(func4_called == 2);
}
}