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
|
#include <iostream>
using namespace std;
#include "../FbTk/Signal.hh"
#include "../FbTk/MemFun.hh"
#include <string>
struct NoArgument {
void operator() () const {
cout << "No Argument." << endl;
}
};
struct OneArgument {
void operator ()( int value ) {
cout << "One argument = " << value << endl;
}
};
struct TwoArguments {
void operator ()( int value, const string& message ) {
cout << "Two arguments, (1) = " << value << ", (2) = " << message << endl;
}
};
struct ThreeArguments {
void operator ()( int value, const string& message, double value2 ) {
cout << "Two arguments, (1) = " << value << ", (2) = " << message
<< ", (3) = " << value2 << endl;
}
};
struct FunctionClass {
FunctionClass() {
cout << "FunctionClass created." << endl;
}
~FunctionClass() {
cout << "FunctionClass deleted." << endl;
}
void print() {
cout << "Printing." << endl;
}
void takeIt( string& str ) {
cout << "takeIt( " << str << ")" << endl;
}
void showMessage( int value, const string& message ) {
cout << "(" << value << "): " << message << endl;
}
void threeArgs( int value, const string& str, double pi ) {
cout << "(" << value << "): " << str << ", pi = " << pi << endl;
}
};
int main() {
using FbTk::Signal;
using FbTk::SignalTracker;
Signal<void> no_arg;
no_arg.connect( NoArgument() );
Signal<void, int> one_arg;
one_arg.connect( OneArgument() );
Signal<void, int, const string&> two_args;
two_args.connect( TwoArguments() );
Signal<void, int, const string&, double> three_args;
three_args.connect( ThreeArguments() );
// emit test
no_arg.emit();
one_arg.emit( 10 );
two_args.emit( 10, "Message" );
three_args.emit( 10, "Three", 3.141592 );
// test signal tracker
{
cout << "---- tracker ----" << endl;
SignalTracker tracker;
// setup two new slots and track them
SignalTracker::TrackID id_no_arg = tracker.join( no_arg, NoArgument() );
SignalTracker::TrackID id_one_arg = tracker.join( one_arg, OneArgument() );
// two outputs each from these two signals
no_arg.emit();
one_arg.emit( 31 );
// stop tracking id_one_arg, which should keep the slot after this scope,
// the id_no_arg connection should be destroyed after this.
tracker.leave( id_one_arg );
cout << "---- tracker end ----" << endl;
}
// now we should have one output from no_arg and two outputs from one_arg
no_arg.emit();
one_arg.emit( 2 );
using FbTk::MemFun;
FunctionClass obj;
no_arg.clear();
no_arg.connect(MemFun(obj, &FunctionClass::print));
no_arg.emit();
string takeThis("Take this");
Signal<void, string&> ref_arg;
ref_arg.connect(MemFun(obj, &FunctionClass::takeIt));
ref_arg.emit( takeThis );
two_args.clear();
two_args.connect(MemFun(obj, &FunctionClass::showMessage));
two_args.emit(10, "This is a message");
three_args.clear();
three_args.connect(MemFun(obj, &FunctionClass::threeArgs));
three_args.emit(9, "nine", 3.141592);
}
|