neosigslot is a lightweight C++ "signals and slots" library. The latest version of neosigslot is actually a thin deprecated wrapper around a new event system that is designed for the cross platform C++ GUI library neoGFX. This new event system is documented here and has the following features:
You can download the implementation here (v3.0) (changelog).
The following example demonstrates re-entrancy and an event handler being destroyed whilst it is being notified of a signal and also the use of local 'sink' objects for controlled event handler de-registration. The example uses the new event system API:
#include <neolib/neolib.hpp>
#include <memory>
#include <iostream>
#include <string>
#include <neolib/event.hpp>
class greetings
{
public:
neolib::event<const std::string&> hello_and_goodbye;
public:
greetings()
{
iSink += hello_and_goodbye([this](const std::string& greeting) { handle_hello_and_goodbye(greeting); });
}
~greetings()
{
std::cout << "Destroying greetings object..." << std::endl;
}
public:
void handle_hello_and_goodbye(const std::string& greeting)
{
static int phase;
std::cout << "In handler, phase = " << phase << ", argument = '" << greeting << "'" << std::endl;
switch (phase)
{
case 0:
++phase;
hello_and_goodbye.trigger(", world!");
break;
case 1:
delete this;
break;
}
}
private:
neolib::sink iSink; // performs the traditional role of slot handler de-registration
};
class counter
{
public:
neolib::event<int> new_integer;
public:
void count(int n)
{
for (int i = 1; i <= n; ++i)
new_integer.trigger(i);
}
};
int main()
{
neolib::async_task mainTask;
neolib::async_thread mainThread{ mainTask, "neolib::event unit test(s)", true };
{
// we shall use 'new' instead of smart pointer maker as greetings object will delete itself in event handler...
auto object = new greetings{};
object->hello_and_goodbye.trigger("Hello");
}
{
counter c;
{
neolib::sink localSink;
localSink += c.new_integer([](int n) { std::cout << n << std::endl; });
c.count(10);
}
c.count(10); // shouldn't print anything as 'localSink' has been destroyed deregistering the handler
}
}The output of which is:
In handler, phase = 0, argument = 'Hello' In handler, phase = 1, argument = ', world!' Destroying greetings object... 1 2 3 4 5 6 7 8 9 10