libs/signals2/example/disconnect_and_block.cpp
// Various simple examples involving disconnecting and blocking slots.
// Copyright Douglas Gregor 2001-2004.
// Copyright Frank Mori Hess 2009.
//
// Use, modification and
// distribution is subject to the Boost Software License, Version
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// For more information, see http://www.boost.org
#include <iostream>
#include <boost/signals2/signal.hpp>
#include <boost/signals2/shared_connection_block.hpp>
struct HelloWorld
{
void operator()() const
{
std::cout << "Hello, World!" << std::endl;
}
};
void disconnect_example()
{
boost::signals2::signal<void ()> sig;
//[ disconnect_code_snippet
boost::signals2::connection c = sig.connect(HelloWorld());
std::cout << "c is connected\n";
sig(); // Prints "Hello, World!"
c.disconnect(); // Disconnect the HelloWorld object
std::cout << "c is disconnected\n";
sig(); // Does nothing: there are no connected slots
//]
}
void block_example()
{
boost::signals2::signal<void ()> sig;
//[ block_code_snippet
boost::signals2::connection c = sig.connect(HelloWorld());
std::cout << "c is not blocked.\n";
sig(); // Prints "Hello, World!"
{
boost::signals2::shared_connection_block block(c); // block the slot
std::cout << "c is blocked.\n";
sig(); // No output: the slot is blocked
} // shared_connection_block going out of scope unblocks the slot
std::cout << "c is not blocked.\n";
sig(); // Prints "Hello, World!"}
//]
}
struct ShortLived
{
void operator()() const
{
std::cout << "Life is short!" << std::endl;
}
};
void scoped_connection_example()
{
boost::signals2::signal<void ()> sig;
//[ scoped_connection_code_snippet
{
boost::signals2::scoped_connection c(sig.connect(ShortLived()));
sig(); // will call ShortLived function object
} // scoped_connection goes out of scope and disconnects
sig(); // ShortLived function object no longer connected to sig
//]
}
//[ disconnect_by_slot_def_code_snippet
void foo() { std::cout << "foo"; }
void bar() { std::cout << "bar\n"; }
//]
void disconnect_by_slot_example()
{
boost::signals2::signal<void()> sig;
//[ disconnect_by_slot_usage_code_snippet
sig.connect(&foo);
sig.connect(&bar);
sig();
// disconnects foo, but not bar
sig.disconnect(&foo);
sig();
//]
}
int main()
{
std::cout << "Disconnect example:\n";
disconnect_example();
std::cout << "\nBlock example:\n";
block_example();
std::cout << "\nScoped connection example:\n";
scoped_connection_example();
std::cout << "\nDisconnect by slot example:\n";
disconnect_by_slot_example();
return 0;
}