Test: Signals and slots
From DaevsGUI
This is some test, and also example, code for the signals and slots system implemented in the DaevsCommon library.
Source
#include <daevscommon/signal.hpp> class Sender; class ReceiverBase; void f() { std::cerr << "f();\n"; } void g(ReceiverBase *sender) { std::cerr << "g(ReceiverBase *" << sender << ");\n"; } void h(const ReceiverBase *sender) { std::cerr << "h(const ReceiverBase *" << sender << ");\n"; } class ReceiverBase { public: void f() { std::cerr << this << " ReceiverBase::f();\n"; } void g(Sender *sender) { std::cerr << this << " ReceiverBase::g(Sender *" << sender << ");\n"; } void h(const Sender *sender) { std::cerr << this << " ReceiverBase::h(const Sender *" << sender << ");\n"; } DaevsCommon::Signal<ReceiverBase> signal; }; class ReceiverDerived: public ReceiverBase { public: void i() { std::cerr << this << " ReceiverDerived::i();\n"; } void j(Sender *sender) { std::cerr << this << " ReceiverDerived::j(Sender *" << sender << ");\n"; } void k(const Sender *sender) { std::cerr << this << " ReceiverDerived::k(const Sender *" << sender << ");\n"; } }; class Sender { public: void emit() { signal.emit(); } void parameter_emit() { signal.emit(this); } void const_parameter_emit() const { signal.emit(this); } DaevsCommon::Signal<Sender> signal; }; int main() { Sender sender1; ReceiverDerived receiver_derived1; std::cerr << "Sender: " << &sender1 << "; Receiver: " << &receiver_derived1 << ";\n"; sender1.signal.connect(&receiver_derived1, &ReceiverBase::f); sender1.signal.connect(&receiver_derived1, &ReceiverBase::g); sender1.signal.connect(&receiver_derived1, &ReceiverBase::h); sender1.signal.connect(&receiver_derived1, &ReceiverDerived::i); sender1.signal.connect(&receiver_derived1, &ReceiverDerived::j); sender1.signal.connect(&receiver_derived1, &ReceiverDerived::k); sender1.emit(); std::cerr << "\n"; sender1.parameter_emit(); std::cerr << "\n"; sender1.const_parameter_emit(); std::cerr << "\n"; std::cerr << "\n"; //////// Sender sender2; ReceiverDerived receiver_derived2; std::cerr << "Sender: " << &sender2 << "; Receiver: " << &receiver_derived2 << ";\n"; sender2.signal.migrate(sender1.signal, &receiver_derived1, &receiver_derived2); sender2.emit(); std::cerr << "\n"; sender2.parameter_emit(); std::cerr << "\n"; sender2.const_parameter_emit(); std::cerr << "\n"; std::cerr << "\n"; //////// Sender sender3; std::cerr << "Sender: " << &sender3 << "; Receiver: " << &receiver_derived1 << ";\n"; receiver_derived1.signal.connect(&f); receiver_derived1.signal.connect(&g); receiver_derived1.signal.connect(&h); sender3.signal.connect(receiver_derived1.signal); sender3.emit(); std::cerr << "\n"; sender3.parameter_emit(); std::cerr << "\n"; sender3.const_parameter_emit(); std::cerr << "\n"; std::cerr << "\n"; sender3.signal.disconnect(receiver_derived1.signal); sender3.signal.connect(&receiver_derived1, receiver_derived1.signal); sender3.emit(); std::cerr << "\n"; sender3.parameter_emit(); std::cerr << "\n"; sender3.const_parameter_emit(); std::cerr << "\n"; std::cerr << "\n"; sender3.signal.disconnect(receiver_derived1.signal); sender3.signal.connect((const ReceiverDerived *) &receiver_derived1, receiver_derived1.signal); sender3.emit(); std::cerr << "\n"; sender3.parameter_emit(); std::cerr << "\n"; sender3.const_parameter_emit(); std::cerr << "\n"; std::cerr << "\n"; sender3.signal.disconnect(&receiver_derived1, receiver_derived1.signal); sender3.emit(); std::cerr << "\n"; sender3.parameter_emit(); std::cerr << "\n"; sender3.const_parameter_emit(); std::cerr << "\n"; return 0; } | Output
Sender: 0x22feec; Receiver: 0x22fec8; 0x22fec8 ReceiverBase::f(); 0x22fec8 ReceiverDerived::i(); 0x22fec8 ReceiverBase::f(); 0x22fec8 ReceiverBase::g(Sender *0x22feec); 0x22fec8 ReceiverBase::h(const Sender *0x22feec); 0x22fec8 ReceiverDerived::i(); 0x22fec8 ReceiverDerived::j(Sender *0x22feec); 0x22fec8 ReceiverDerived::k(const Sender *0x22feec); 0x22fec8 ReceiverBase::f(); 0x22fec8 ReceiverBase::h(const Sender *0x22feec); 0x22fec8 ReceiverDerived::i(); 0x22fec8 ReceiverDerived::k(const Sender *0x22feec); Sender: 0x22fea4; Receiver: 0x22fe80; 0x22fe80 ReceiverBase::f(); 0x22fe80 ReceiverDerived::i(); 0x22fe80 ReceiverBase::f(); 0x22fe80 ReceiverBase::g(Sender *0x22fea4); 0x22fe80 ReceiverBase::h(const Sender *0x22fea4); 0x22fe80 ReceiverDerived::i(); 0x22fe80 ReceiverDerived::j(Sender *0x22fea4); 0x22fe80 ReceiverDerived::k(const Sender *0x22fea4); 0x22fe80 ReceiverBase::f(); 0x22fe80 ReceiverBase::h(const Sender *0x22fea4); 0x22fe80 ReceiverDerived::i(); 0x22fe80 ReceiverDerived::k(const Sender *0x22fea4); Sender: 0x22fe5c; Receiver: 0x22fec8; f(); f(); f(); f(); g(ReceiverBase *0x22fec8); h(const ReceiverBase *0x22fec8); f(); g(ReceiverBase *0x22fec8); h(const ReceiverBase *0x22fec8); f(); g(ReceiverBase *0x22fec8); h(const ReceiverBase *0x22fec8); f(); h(const ReceiverBase *0x22fec8); f(); h(const ReceiverBase *0x22fec8); f(); h(const ReceiverBase *0x22fec8); |
