src/tests/testSignals.cc (raw)
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); } |