Test: Signals and slots

From DaevsGUI

Jump to: navigation, search

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);




Views
Personal tools
Other